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

Artifact 7d77c3899d0244804d2773c9157e783788627762:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 24 49 64 3a 20 74 63 6c 73 71 6c 69 74  ** $Id: tclsqlit
0210: 65 2e 63 2c 76 20 31 2e 32 33 34 20 32 30 30 39  e.c,v 1.234 2009
0220: 2f 30 31 2f 31 34 20 32 33 3a 33 38 3a 30 33 20  /01/14 23:38:03 
0230: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0240: 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69  clude "tcl.h".#i
0250: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
0260: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 61 64 64  ../*.** Some add
0270: 69 74 69 6f 6e 61 6c 20 69 6e 63 6c 75 64 65 20  itional include 
0280: 66 69 6c 65 73 20 61 72 65 20 6e 65 65 64 65 64  files are needed
0290: 20 69 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   if this file is
02a0: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 6e 64 65 64   not.** appended
02b0: 20 74 6f 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   to the amalgama
02c0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
02d0: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
02e0: 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22  TION.# include "
02f0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 20 69  sqliteInt.h".# i
0300: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0310: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 72  >.# include <str
0320: 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ing.h>.# include
0330: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 20 69 6e   <assert.h>.# in
0340: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0350: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57 69  #endif../*. * Wi
0360: 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20 6b  ndows needs to k
0370: 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f 6c  now which symbol
0380: 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55 6e  s to export.  Un
0390: 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a 20  ix does not.. * 
03a0: 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68 6f  BUILD_sqlite sho
03b0: 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65 64  uld be undefined
03c0: 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a 23   for Unix.. */.#
03d0: 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c 69  ifdef BUILD_sqli
03e0: 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53 54  te.#undef TCL_ST
03f0: 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65 66  ORAGE_CLASS.#def
0400: 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f  ine TCL_STORAGE_
0410: 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54 0a  CLASS DLLEXPORT.
0420: 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44 5f  #endif /* BUILD_
0430: 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66 69  sqlite */..#defi
0440: 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f  ne NUM_PREPARED_
0450: 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e 65  STMTS 10.#define
0460: 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54   MAX_PREPARED_ST
0470: 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20 49  MTS 100../*.** I
0480: 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d 38  f TCL uses UTF-8
0490: 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20 63   and SQLite is c
04a0: 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
04b0: 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20 77   iso8859, then w
04c0: 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f 20  e.** have to do 
04d0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77 68  a translation wh
04e0: 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65 6e  en going between
04f0: 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20 74   the two.  Set t
0500: 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e 53  he .** UTF_TRANS
0510: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d 61  LATION_NEEDED ma
0520: 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65 20  cro to indicate 
0530: 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f 20  that we need to 
0540: 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e 73  do.** this trans
0550: 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66  lation.  .*/.#if
0560: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54 46   defined(TCL_UTF
0570: 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e 65  _MAX) && !define
0580: 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a 23  d(SQLITE_UTF8).#
0590: 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41 4e   define UTF_TRAN
05a0: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 31  SLATION_NEEDED 1
05b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e  .#endif../*.** N
05c0: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ew SQL functions
05d0: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
05e0: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
05f0: 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74   Each such funct
0600: 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69  ion.** is descri
0610: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0620: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0630: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0640: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0650: 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63   SqlFunc SqlFunc
0660: 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  ;.struct SqlFunc
0670: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
0680: 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68  *interp;   /* Th
0690: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20  e TCL interpret 
06a0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66  to execute the f
06b0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
06c0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
06d0: 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62     /* The Tcl_Ob
06e0: 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  j representation
06f0: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a   of the script *
0700: 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c 4f  /.  int useEvalO
0710: 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  bjv;      /* Tru
0720: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
0730: 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f  to use Tcl_EvalO
0740: 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  bjv */.  char *z
0750: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Name;          /
0760: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  * Name of this f
0770: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c  unction */.  Sql
0780: 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20  Func *pNext;    
0790: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
07a0: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
07b0: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
07c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c  ;../*.** New col
07d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
07e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62 65   function can be
07f0: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
0800: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
0810: 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  uch.** function 
0820: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0830: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0850: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0860: 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f 6c  ef struct SqlCol
0870: 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65 3b  late SqlCollate;
0880: 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61  .struct SqlColla
0890: 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  te {.  Tcl_Inter
08a0: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
08b0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
08c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
08d0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
08e0: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20  har *zScript;   
08f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69       /* The scri
0900: 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  pt to be run */.
0910: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e    SqlCollate *pN
0920: 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20  ext;    /* Next 
0930: 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  function on the 
0940: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
0950: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
0960: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
0970: 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f 72  s are cached for
0980: 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69 6f   faster executio
0990: 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72 65  n.  Each prepare
09a0: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69  d.** statement i
09b0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
09c0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
09d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
09e0: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
09f0: 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  f struct SqlPrep
0a00: 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65 70  aredStmt SqlPrep
0a10: 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63 74  aredStmt;.struct
0a20: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0a30: 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64   {.  SqlPrepared
0a40: 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  Stmt *pNext;  /*
0a50: 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64 20   Next in linked 
0a60: 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  list */.  SqlPre
0a70: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 76  paredStmt *pPrev
0a80: 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6f  ;  /* Previous o
0a90: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0aa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0ab0: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  tmt;     /* The 
0ac0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0ad0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c  nt */.  int nSql
0ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0af0: 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53 71   /* chars in zSq
0b00: 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  l[] */.  const c
0b10: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
0b20: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
0b30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
0b40: 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  /.};..typedef st
0b50: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
0b60: 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62 43 68 61  nnel IncrblobCha
0b70: 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  nnel;../*.** The
0b80: 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
0b90: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
0ba0: 74 75 72 65 20 66 6f 72 20 65 61 63 68 20 53 51  ture for each SQ
0bb0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  Lite database.**
0bc0: 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
0bd0: 70 65 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  pened by the SQL
0be0: 69 74 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  ite TCL interfac
0bf0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0c00: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71  ruct SqliteDb Sq
0c10: 6c 69 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53  liteDb;.struct S
0c20: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
0c30: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
0c40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72         /* The "r
0c50: 65 61 6c 22 20 64 61 74 61 62 61 73 65 20 73 74  eal" database st
0c60: 72 75 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45  ructure. MUST BE
0c70: 20 46 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f   FIRST */.  Tcl_
0c80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
0c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
0ca0: 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20 66  terpreter used f
0cb0: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
0cc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73   */.  char *zBus
0cd0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
0ce0: 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c   /* The busy cal
0cf0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0d00: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74  .  char *zCommit
0d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d20: 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   The commit hook
0d30: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0d40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72  e */.  char *zTr
0d50: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
0d60: 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63    /* The trace c
0d70: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0d80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66  */.  char *zProf
0d90: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
0da0: 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63  /* The profile c
0db0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0dc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67  */.  char *zProg
0dd0: 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  ress;           
0de0: 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  /* The progress 
0df0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0e00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74   */.  char *zAut
0e10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0e20: 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a   /* The authoriz
0e30: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72  ation callback r
0e40: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
0e50: 64 69 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20  disableAuth;    
0e60: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
0e70: 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72  e the authorizer
0e80: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
0e90: 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20  .  char *zNull; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0eb0: 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69 74   Text to substit
0ec0: 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e  ute for an SQL N
0ed0: 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53  ULL value */.  S
0ee0: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20  qlFunc *pFunc;  
0ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
0f00: 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f  t of SQL functio
0f10: 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ns */.  Tcl_Obj 
0f20: 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20  *pUpdateHook;   
0f30: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f     /* Update hoo
0f40: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
0f50: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
0f60: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20  pRollbackHook;  
0f70: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f    /* Rollback ho
0f80: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0f90: 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61  y) */.  SqlColla
0fa0: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20  te *pCollate;   
0fb0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0fc0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
0fd0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tions */.  int r
0fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
0ff0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1000: 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63  code of most rec
1010: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
1020: 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  () */.  Tcl_Obj 
1030: 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b  *pCollateNeeded;
1040: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
1050: 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f  needed script */
1060: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
1070: 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a  mt *stmtList; /*
1080: 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65   List of prepare
1090: 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20  d statements*/. 
10a0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
10b0: 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c   *stmtLast; /* L
10c0: 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ast statement in
10d0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
10e0: 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20  nt maxStmt;     
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1100: 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75   next maximum nu
1110: 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74  mber of stmtList
1120: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b   */.  int nStmt;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74   /* Number of st
1150: 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74  atements in stmt
1160: 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c  List */.  Incrbl
1170: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72  obChannel *pIncr
1180: 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c  blob;/* Linked l
1190: 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72  ist of open incr
11a0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
11b0: 0a 20 20 69 6e 74 20 6e 53 74 65 70 2c 20 6e 53  .  int nStep, nS
11c0: 6f 72 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ort;          /*
11d0: 20 53 74 61 74 69 73 74 69 63 73 20 66 6f 72 20   Statistics for 
11e0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6f 70 65 72  most recent oper
11f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
1200: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20  Transaction;    
1210: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1220: 6f 66 20 6e 65 73 74 65 64 20 5b 74 72 61 6e 73  of nested [trans
1230: 61 63 74 69 6f 6e 5d 20 6d 65 74 68 6f 64 73 20  action] methods 
1240: 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e  */.};..struct In
1250: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a  crblobChannel {.
1260: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
1270: 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73  pBlob;      /* s
1280: 71 6c 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64  qlite3 blob hand
1290: 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62  le */.  SqliteDb
12a0: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
12b0: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
12c0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12d0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ion */.  int iSe
12e0: 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ek;             
12f0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65     /* Current se
1300: 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54  ek offset */.  T
1310: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e  cl_Channel chann
1320: 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  el;      /* Chan
1330: 6e 65 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a  nel identifier *
1340: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
1350: 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a  nel *pNext;   /*
1360: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1370: 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f  all open incrblo
1380: 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20  b channels */.  
1390: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
13a0: 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e  *pPrev;   /* Lin
13b0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
13c0: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
13d0: 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  annels */.};../*
13e0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
13f0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74  ring length that
1400: 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77   is limited to w
1410: 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65  hat can be store
1420: 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30  d in.** lower 30
1430: 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69   bits of a 32-bi
1440: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
1450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1460: 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63  strlen30(const c
1470: 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74  har *z){.  const
1480: 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20   char *z2 = z;. 
1490: 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a   while( *z2 ){ z
14a0: 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  2++; }.  return 
14b0: 30 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e  0x3fffffff & (in
14c0: 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 0a  t)(z2 - z);.}...
14d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14e0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a  MIT_INCRBLOB./*.
14f0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 69 6e 63  ** Close all inc
1500: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 6f  rblob channels o
1510: 70 65 6e 65 64 20 75 73 69 6e 67 20 64 61 74 61  pened using data
1520: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1530: 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pDb..** This is 
1540: 63 61 6c 6c 65 64 20 77 68 65 6e 20 73 68 75 74  called when shut
1550: 74 69 6e 67 20 64 6f 77 6e 20 74 68 65 20 64 61  ting down the da
1560: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1570: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1580: 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43  d closeIncrblobC
1590: 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74 65 44 62  hannels(SqliteDb
15a0: 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63 72 62 6c   *pDb){.  Incrbl
15b0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20  obChannel *p;.  
15c0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
15d0: 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70  *pNext;..  for(p
15e0: 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b  =pDb->pIncrblob;
15f0: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
1600: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
1610: 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  xt;..    /* Note
1620: 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72 65 67 69  : Calling unregi
1630: 73 74 65 72 20 68 65 72 65 20 63 61 6c 6c 20 54  ster here call T
1640: 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74 68 65 20  cl_Close on the 
1650: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1660: 2c 20 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  , .    ** which 
1670: 64 65 6c 65 74 65 73 20 74 68 65 20 49 6e 63 72  deletes the Incr
1680: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75  blobChannel stru
1690: 63 74 75 72 65 20 61 74 20 2a 70 2e 20 53 6f 20  cture at *p. So 
16a0: 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 61  do not.    ** ca
16b0: 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29 20 68 65  ll Tcl_Free() he
16c0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54  re..    */.    T
16d0: 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61  cl_UnregisterCha
16e0: 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  nnel(pDb->interp
16f0: 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20  , p->channel);. 
1700: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
1710: 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  e an incremental
1720: 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a   blob channel..*
1730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1740: 72 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69 65 6e  rblobClose(Clien
1750: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
1760: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
1770: 69 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63 72 62  interp){.  Incrb
1780: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
1790: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
17a0: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
17b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
17c0: 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
17d0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71 6c 69  ->pBlob);.  sqli
17e0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 44 62  te3 *db = p->pDb
17f0: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ->db;..  /* Remo
1800: 76 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 66  ve the channel f
1810: 72 6f 6d 20 74 68 65 20 53 71 6c 69 74 65 44 62  rom the SqliteDb
1820: 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e  .pIncrblob list.
1830: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65   */.  if( p->pNe
1840: 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
1850: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
1860: 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Prev;.  }.  if( 
1870: 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
1880: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
1890: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
18a0: 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 70 49    if( p->pDb->pI
18b0: 6e 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20  ncrblob==p ){.  
18c0: 20 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62    p->pDb->pIncrb
18d0: 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  lob = p->pNext;.
18e0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74    }..  /* Free t
18f0: 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  he IncrblobChann
1900: 65 6c 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  el structure */.
1910: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
1920: 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63   *)p);..  if( rc
1930: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1940: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1950: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1960: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
1970: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
1980: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  E);.    return T
1990: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
19a0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
19c0: 61 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72 65 6d  a from an increm
19d0: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
19e0: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
19f0: 74 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 28  t incrblobInput(
1a00: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  .  ClientData in
1a10: 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 63  stanceData, .  c
1a20: 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74  har *buf, .  int
1a30: 20 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e 74 20   bufSize,.  int 
1a40: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
1a50: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1a60: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
1a70: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
1a80: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e  nceData;.  int n
1a90: 52 65 61 64 20 3d 20 62 75 66 53 69 7a 65 3b 20  Read = bufSize; 
1aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ab0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
1ac0: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  ad */.  int nBlo
1ad0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1ae0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
1af0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a  ze of the blob *
1b00: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72   /* sqlite error
1b30: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f   code */..  nBlo
1b40: 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  b = sqlite3_blob
1b50: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
1b60: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65  ;.  if( (p->iSee
1b70: 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62 20 29  k+nRead)>nBlob )
1b80: 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d 20 6e 42  {.    nRead = nB
1b90: 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20 20  lob-p->iSeek;.  
1ba0: 7d 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 3d 30  }.  if( nRead<=0
1bb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1bc0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
1bd0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
1be0: 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20  p->pBlob, (void 
1bf0: 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c 20 70 2d  *)buf, nRead, p-
1c00: 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72  >iSeek);.  if( r
1c10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c20: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
1c30: 72 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  r = rc;.    retu
1c40: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d  rn -1;.  }..  p-
1c50: 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61 64 3b  >iSeek += nRead;
1c60: 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 61 64 3b  .  return nRead;
1c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
1c80: 64 61 74 61 20 74 6f 20 61 6e 20 69 6e 63 72 65  data to an incre
1c90: 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e  mental blob chan
1ca0: 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nel..*/.static i
1cb0: 6e 74 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75  nt incrblobOutpu
1cc0: 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1cd0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
1ce0: 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66   CONST char *buf
1cf0: 2c 20 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65  , .  int toWrite
1d00: 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f  ,.  int *errorCo
1d10: 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62  dePtr.){.  Incrb
1d20: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
1d30: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
1d40: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
1d50: 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
1d60: 74 6f 57 72 69 74 65 3b 20 20 20 20 20 20 20 20  toWrite;        
1d70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1d80: 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  es to write */. 
1d90: 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20   int nBlob;     
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db0: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
1dc0: 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74  he blob */.  int
1dd0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1df0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
1e00: 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c  /..  nBlob = sql
1e10: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
1e20: 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  p->pBlob);.  if(
1e30: 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74   (p->iSeek+nWrit
1e40: 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20  e)>nBlob ){.    
1e50: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1e60: 45 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75  EINVAL;.    retu
1e70: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28  rn -1;.  }.  if(
1e80: 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20   nWrite<=0 ){.  
1e90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1ea0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1eb0: 62 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42  blob_write(p->pB
1ec0: 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66  lob, (void *)buf
1ed0: 2c 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65  , nWrite, p->iSe
1ee0: 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ek);.  if( rc!=S
1ef0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f00: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1f10: 45 49 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  EIO;.    return 
1f20: 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53  -1;.  }..  p->iS
1f30: 65 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  eek += nWrite;. 
1f40: 20 72 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a   return nWrite;.
1f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e  }../*.** Seek an
1f60: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
1f70: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
1f80: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
1f90: 62 53 65 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44  bSeek(.  ClientD
1fa0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
1fb0: 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74  , .  long offset
1fc0: 2c 0a 20 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65  ,.  int seekMode
1fd0: 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f  ,.  int *errorCo
1fe0: 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62  dePtr.){.  Incrb
1ff0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
2000: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
2010: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
2020: 0a 0a 20 20 73 77 69 74 63 68 28 20 73 65 65 6b  ..  switch( seek
2030: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Mode ){.    case
2040: 20 53 45 45 4b 5f 53 45 54 3a 0a 20 20 20 20 20   SEEK_SET:.     
2050: 20 70 2d 3e 69 53 65 65 6b 20 3d 20 6f 66 66 73   p->iSeek = offs
2060: 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
2070: 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 43  .    case SEEK_C
2080: 55 52 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65  UR:.      p->iSe
2090: 65 6b 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20  ek += offset;.  
20a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
20b0: 61 73 65 20 53 45 45 4b 5f 45 4e 44 3a 0a 20 20  ase SEEK_END:.  
20c0: 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 73      p->iSeek = s
20d0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
20e0: 73 28 70 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f 66  s(p->pBlob) + of
20f0: 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  fset;.      brea
2100: 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
2110: 20 61 73 73 65 72 74 28 21 22 42 61 64 20 73 65   assert(!"Bad se
2120: 65 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a 20  ekMode");.  }.. 
2130: 20 72 65 74 75 72 6e 20 70 2d 3e 69 53 65 65 6b   return p->iSeek
2140: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  ;.}...static voi
2150: 64 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 28  d incrblobWatch(
2160: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
2170: 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64  nceData, int mod
2180: 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20  e){ .  /* NO-OP 
2190: 2a 2f 20 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  */ .}.static int
21a0: 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 28   incrblobHandle(
21b0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
21c0: 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 64 69 72  nceData, int dir
21d0: 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 50  , ClientData *hP
21e0: 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43  tr){.  return TC
21f0: 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74  L_ERROR;.}..stat
2200: 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79  ic Tcl_ChannelTy
2210: 70 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  pe IncrblobChann
2220: 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 22 69 6e  elType = {.  "in
2230: 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  crblob",        
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 2f 2a 20 74 79 70 65 4e 61 6d 65 20 20 20 20 20  /* typeName     
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 54 43 4c          */.  TCL
2280: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e  _CHANNEL_VERSION
2290: 5f 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  _2,             
22a0: 2f 2a 20 76 65 72 73 69 6f 6e 20 20 20 20 20 20  /* version      
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
22d0: 72 62 6c 6f 62 43 6c 6f 73 65 2c 20 20 20 20 20  rblobClose,     
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 2f 2a 20 63 6c 6f 73 65 50 72 6f 63 20 20 20 20  /* closeProc    
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2320: 72 62 6c 6f 62 49 6e 70 75 74 2c 20 20 20 20 20  rblobInput,     
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 2f 2a 20 69 6e 70 75 74 50 72 6f 63 20 20 20 20  /* inputProc    
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2370: 72 62 6c 6f 62 4f 75 74 70 75 74 2c 20 20 20 20  rblobOutput,    
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 2f 2a 20 6f 75 74 70 75 74 50 72 6f 63 20 20 20  /* outputProc   
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
23c0: 72 62 6c 6f 62 53 65 65 6b 2c 20 20 20 20 20 20  rblobSeek,      
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 2f 2a 20 73 65 65 6b 50 72 6f 63 20 20 20 20 20  /* seekProc     
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 2f 2a 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63  /* setOptionProc
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 2f 2a 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63  /* getOptionProc
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
24b0: 72 62 6c 6f 62 57 61 74 63 68 2c 20 20 20 20 20  rblobWatch,     
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 2f 2a 20 77 61 74 63 68 50 72 6f 63 20 28 74 68  /* watchProc (th
24e0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 29 20 20  is is a no-op)  
24f0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2500: 72 62 6c 6f 62 48 61 6e 64 6c 65 2c 20 20 20 20  rblobHandle,    
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 2f 2a 20 67 65 74 48 61 6e 64 6c 65 50 72 6f 63  /* getHandleProc
2530: 20 28 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73   (always returns
2540: 20 65 72 72 6f 72 29 20 2a 2f 0a 20 20 30 2c 20   error) */.  0, 
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 2f 2a 20 63 6c 6f 73 65 32 50 72 6f 63 20 20 20  /* close2Proc   
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63  /* blockModeProc
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 2f 2a 20 66 6c 75 73 68 50 72 6f 63 20 20 20 20  /* flushProc    
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 2f 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63 20 20  /* handlerProc  
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 2f 2a 20 77 69 64 65 53 65 65 6b 50 72 6f 63 20  /* wideSeekProc 
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f          */.};../
26e0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
26f0: 77 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  w incrblob chann
2700: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
2710: 74 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62  t createIncrblob
2720: 43 68 61 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f 49  Channel(.  Tcl_I
2730: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
2740: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c    SqliteDb *pDb,
2750: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
2760: 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zDb,.  const cha
2770: 72 20 2a 7a 54 61 62 6c 65 2c 20 0a 20 20 63 6f  r *zTable, .  co
2780: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
2790: 6e 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  n, .  sqlite_int
27a0: 36 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69  64 iRow,.  int i
27b0: 73 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49  sReadonly.){.  I
27c0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
27d0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
27e0: 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71   = pDb->db;.  sq
27f0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
2800: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
2810: 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52  nt flags = TCL_R
2820: 45 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64 6f  EADABLE|(isReado
2830: 6e 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52  nly ? 0 : TCL_WR
2840: 49 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54  ITABLE);..  /* T
2850: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2860: 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65  used to name the
2870: 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72   channels: "incr
2880: 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74  blob_[incr count
2890: 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69  ]" */.  static i
28a0: 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  nt count = 0;.  
28b0: 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34  char zChannel[64
28c0: 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ];..  rc = sqlit
28d0: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c  e3_blob_open(db,
28e0: 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43   zDb, zTable, zC
28f0: 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73  olumn, iRow, !is
2900: 52 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62  Readonly, &pBlob
2910: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2920: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
2930: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
2940: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
2950: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
2960: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
2970: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  E);.    return T
2980: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2990: 20 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68   p = (IncrblobCh
29a0: 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f  annel *)Tcl_Allo
29b0: 63 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f  c(sizeof(Incrblo
29c0: 62 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d  bChannel));.  p-
29d0: 3e 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d  >iSeek = 0;.  p-
29e0: 3e 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a  >pBlob = pBlob;.
29f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
2a00: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e  ntf(sizeof(zChan
2a10: 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20  nel), zChannel, 
2a20: 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b  "incrblob_%d", +
2a30: 2b 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68  +count);.  p->ch
2a40: 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61  annel = Tcl_Crea
2a50: 74 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62  teChannel(&Incrb
2a60: 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20  lobChannelType, 
2a70: 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61  zChannel, p, fla
2a80: 67 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73  gs);.  Tcl_Regis
2a90: 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  terChannel(inter
2aa0: 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a  p, p->channel);.
2ab0: 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
2ac0: 65 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20  ew channel into 
2ad0: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
2ae0: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
2af0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62    p->pNext = pDb
2b00: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70  ->pIncrblob;.  p
2b10: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69  ->pPrev = 0;.  i
2b20: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
2b30: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
2b40: 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44  ev = p;.  }.  pD
2b50: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70  b->pIncrblob = p
2b60: 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62  ;.  p->pDb = pDb
2b70: 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  ;..  Tcl_SetResu
2b80: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
2b90: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
2ba0: 6c 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c  lName(p->channel
2bb0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
2bc0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2bd0: 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65  K;.}.#else  /* e
2be0: 6c 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20 22  lse clause for "
2bf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c00: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f  MIT_INCRBLOB" */
2c10: 0a 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73 65  .  #define close
2c20: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
2c30: 28 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (pDb).#endif../*
2c40: 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20  .** Look at the 
2c50: 73 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e  script prefix in
2c60: 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20   pCmd.  We will 
2c70: 62 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69  be executing thi
2c80: 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65  s script.** afte
2c90: 72 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e  r first appendin
2ca0: 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72  g one or more ar
2cb0: 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72  guments.  This r
2cc0: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a  outine analyzes.
2cd0: 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f  ** the script to
2ce0: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61   see if it is sa
2cf0: 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76  fe to use Tcl_Ev
2d00: 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20  alObjv() on the 
2d10: 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72  script.** rather
2d20: 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67   than the more g
2d30: 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45  eneral Tcl_EvalE
2d40: 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62  x().  Tcl_EvalOb
2d50: 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20  jv() is much.** 
2d60: 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63  faster..**.** Sc
2d70: 72 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73  ripts that are s
2d80: 61 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20  afe to use with 
2d90: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63  Tcl_EvalObjv() c
2da0: 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
2db0: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c  command name fol
2dc0: 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72  lowed by zero or
2dd0: 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20   more arguments 
2de0: 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72  with no [...] or
2df0: 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f   $.** or {...} o
2e00: 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61  r ; to be seen a
2e10: 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63  nywhere.  Most c
2e20: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20  allback scripts 
2e30: 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75  consist.** of ju
2e40: 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  st a single proc
2e50: 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74  edure name and t
2e60: 68 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65  hey meet this re
2e70: 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  quirement..*/.st
2e80: 61 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55  atic int safeToU
2e90: 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49  seEvalObjv(Tcl_I
2ea0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54  nterp *interp, T
2eb0: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20  cl_Obj *pCmd){. 
2ec0: 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79   /* We could try
2ed0: 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
2ee0: 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28   with Tcl_Parse(
2ef0: 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  ).  But we will 
2f00: 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73  instead.  ** jus
2f10: 74 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f  t do a search fo
2f20: 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72  r forbidden char
2f30: 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20  acters.  If any 
2f40: 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e  of the forbidden
2f50: 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73  .  ** characters
2f60: 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c   appear in pCmd,
2f70: 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20   we will report 
2f80: 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e  the string as un
2f90: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e  safe..  */.  con
2fa0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  st char *z;.  in
2fb0: 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47  t n;.  z = Tcl_G
2fc0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2fd0: 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69  pCmd, &n);.  whi
2fe0: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
2ff0: 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b     int c = *(z++
3000: 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24  );.    if( c=='$
3010: 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63  ' || c=='[' || c
3020: 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30  ==';' ) return 0
3030: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
3040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
3050: 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63  an SqlFunc struc
3060: 74 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69  ture with the gi
3070: 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72  ven name.  Or cr
3080: 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e  eate a new.** on
3090: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
30a0: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66   one cannot be f
30b0: 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20  ound.  Return a 
30c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
30d0: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
30e0: 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a  static SqlFunc *
30f0: 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69  findSqlFunc(Sqli
3100: 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74  teDb *pDb, const
3110: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
3120: 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e   SqlFunc *p, *pN
3130: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  ew;.  int i;.  p
3140: 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29  New = (SqlFunc*)
3150: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
3160: 66 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65  f(*pNew) + strle
3170: 6e 33 30 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29  n30(zName) + 1 )
3180: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20  ;.  pNew->zName 
3190: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
31a0: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e  ];.  for(i=0; zN
31b0: 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e  ame[i]; i++){ pN
31c0: 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74  ew->zName[i] = t
31d0: 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29  olower(zName[i])
31e0: 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d  ; }.  pNew->zNam
31f0: 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  e[i] = 0;.  for(
3200: 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b  p=pDb->pFunc; p;
3210: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20   p=p->pNext){ . 
3220: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d     if( strcmp(p-
3230: 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e  >zName, pNew->zN
3240: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
3250: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
3260: 29 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65  )pNew);.      re
3270: 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20  turn p;.    }.  
3280: 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70  }.  pNew->interp
3290: 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a   = pDb->interp;.
32a0: 20 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20    pNew->pScript 
32b0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = 0;.  pNew->pNe
32c0: 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b  xt = pDb->pFunc;
32d0: 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20  .  pDb->pFunc = 
32e0: 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70  pNew;.  return p
32f0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  New;.}../*.** Fi
3300: 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20  nalize and free 
3310: 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72  a list of prepar
3320: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f  ed statements.*/
3330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75  .static void flu
3340: 73 68 53 74 6d 74 43 61 63 68 65 28 20 53 71 6c  shStmtCache( Sql
3350: 69 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20 20  iteDb *pDb ){.  
3360: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
3370: 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68  *pPreStmt;..  wh
3380: 69 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c  ile(  pDb->stmtL
3390: 69 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ist ){.    sqlit
33a0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44 62  e3_finalize( pDb
33b0: 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d  ->stmtList->pStm
33c0: 74 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  t );.    pPreStm
33d0: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
33e0: 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  t;.    pDb->stmt
33f0: 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  List = pDb->stmt
3400: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
3410: 20 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61 72   Tcl_Free( (char
3420: 2a 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20  *)pPreStmt );.  
3430: 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d  }.  pDb->nStmt =
3440: 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c   0;.  pDb->stmtL
3450: 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ast = 0;.}../*.*
3460: 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73  * TCL calls this
3470: 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20   procedure when 
3480: 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62  an sqlite3 datab
3490: 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  ase command is.*
34a0: 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  * deleted..*/.st
34b0: 61 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65  atic void DbDele
34c0: 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b  teCmd(void *db){
34d0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
34e0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62   = (SqliteDb*)db
34f0: 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63  ;.  flushStmtCac
3500: 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65  he(pDb);.  close
3510: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
3520: 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  (pDb);.  sqlite3
3530: 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b  _close(pDb->db);
3540: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
3550: 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46  Func ){.    SqlF
3560: 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62  unc *pFunc = pDb
3570: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62  ->pFunc;.    pDb
3580: 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d  ->pFunc = pFunc-
3590: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f  >pNext;.    Tcl_
35a0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75  DecrRefCount(pFu
35b0: 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  nc->pScript);.  
35c0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
35d0: 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20  *)pFunc);.  }.  
35e0: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c  while( pDb->pCol
35f0: 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43  late ){.    SqlC
3600: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
3610: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
3620: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  ;.    pDb->pColl
3630: 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e  ate = pCollate->
3640: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46  pNext;.    Tcl_F
3650: 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c  ree((char*)pColl
3660: 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ate);.  }.  if( 
3670: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
3680: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3690: 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66  zBusy);.  }.  if
36a0: 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
36b0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
36c0: 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a  b->zTrace);.  }.
36d0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
36e0: 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ile ){.    Tcl_F
36f0: 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  ree(pDb->zProfil
3700: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  e);.  }.  if( pD
3710: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
3720: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41  Tcl_Free(pDb->zA
3730: 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  uth);.  }.  if( 
3740: 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20  pDb->zNull ){.  
3750: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3760: 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  zNull);.  }.  if
3770: 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  ( pDb->pUpdateHo
3780: 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ok ){.    Tcl_De
3790: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
37a0: 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20  pUpdateHook);.  
37b0: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f  }.  if( pDb->pRo
37c0: 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20  llbackHook ){.  
37d0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
37e0: 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  nt(pDb->pRollbac
37f0: 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  kHook);.  }.  if
3800: 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  ( pDb->pCollateN
3810: 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c  eeded ){.    Tcl
3820: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
3830: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
3840: 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72  d);.  }.  Tcl_Fr
3850: 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a  ee((char*)pDb);.
3860: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3870: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3880: 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
3890: 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77  file is locked w
38a0: 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
38b0: 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a  o execute SQL..*
38c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42  /.static int DbB
38d0: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
38e0: 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29  *cd, int nTries)
38f0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3900: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
3910: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  d;.  int rc;.  c
3920: 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20  har zVal[30];.. 
3930: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3940: 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20  f(sizeof(zVal), 
3950: 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69  zVal, "%d", nTri
3960: 65 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f  es);.  rc = Tcl_
3970: 56 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  VarEval(pDb->int
3980: 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c  erp, pDb->zBusy,
3990: 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61   " ", zVal, (cha
39a0: 72 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r*)0);.  if( rc!
39b0: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
39c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
39d0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
39e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
39f0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
3a00: 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
3a10: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
3a20: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
3a30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3a40: 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65  s invoked as the
3a50: 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62   'progress callb
3a60: 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74  ack' for the dat
3a70: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
3a80: 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48   int DbProgressH
3a90: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
3aa0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3ab0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
3ac0: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
3ad0: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72  assert( pDb->zPr
3ae0: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d  ogress );.  rc =
3af0: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
3b00: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
3b10: 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63  gress);.  if( rc
3b20: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
3b30: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
3b40: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
3b50: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
3b60: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
3b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
3b80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3b90: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68  T_TRACE./*.** Th
3ba0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3bb0: 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69  lled by the SQLi
3bc0: 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72  te trace handler
3bd0: 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a   whenever a new.
3be0: 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20  ** block of SQL 
3bf0: 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68  is executed.  Th
3c00: 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20  e TCL script in 
3c10: 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65  pDb->zTrace is e
3c20: 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  xecuted..*/.stat
3c30: 69 63 20 76 6f 69 64 20 44 62 54 72 61 63 65 48  ic void DbTraceH
3c40: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c  andler(void *cd,
3c50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
3c60: 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  l){.  SqliteDb *
3c70: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3c80: 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  )cd;.  Tcl_DStri
3c90: 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44  ng str;..  Tcl_D
3ca0: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
3cb0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
3cc0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
3cd0: 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20  >zTrace, -1);.  
3ce0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
3cf0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
3d00: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  Sql);.  Tcl_Eval
3d10: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63  (pDb->interp, Tc
3d20: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
3d30: 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74  str));.  Tcl_DSt
3d40: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
3d50: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
3d60: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
3d70: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
3d80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
3d90: 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACE./*.** This r
3da0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3db0: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 70   by the SQLite p
3dc0: 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72 20 61  rofile handler a
3dd0: 66 74 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74  fter a statement
3de0: 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65 78 65 63  .** SQL has exec
3df0: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
3e00: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50  cript in pDb->zP
3e10: 72 6f 66 69 6c 65 20 69 73 20 65 76 61 6c 75 61  rofile is evalua
3e20: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3e30: 6f 69 64 20 44 62 50 72 6f 66 69 6c 65 48 61 6e  oid DbProfileHan
3e40: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63  dler(void *cd, c
3e50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
3e60: 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 74   sqlite_uint64 t
3e70: 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  m){.  SqliteDb *
3e80: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3e90: 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  )cd;.  Tcl_DStri
3ea0: 6e 67 20 73 74 72 3b 0a 20 20 63 68 61 72 20 7a  ng str;.  char z
3eb0: 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69  Tm[100];..  sqli
3ec0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
3ed0: 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c  eof(zTm)-1, zTm,
3ee0: 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20   "%lld", tm);.  
3ef0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
3f00: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74  &str);.  Tcl_DSt
3f10: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c  ringAppend(&str,
3f20: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20   pDb->zProfile, 
3f30: 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  -1);.  Tcl_DStri
3f40: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
3f50: 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54  &str, zSql);.  T
3f60: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
3f70: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54  Element(&str, zT
3f80: 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70  m);.  Tcl_Eval(p
3f90: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
3fa0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
3fb0: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
3fc0: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
3fd0: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
3fe0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a  pDb->interp);.}.
3ff0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
4000: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4010: 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
4020: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
4030: 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43  tted.  The.** TC
4040: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
4050: 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63  >zCommit is exec
4060: 75 74 65 64 2e 20 20 49 66 20 69 74 20 72 65 74  uted.  If it ret
4070: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  urns non-zero or
4080: 0a 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73  .** if it throws
4090: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74   an exception, t
40a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
40b0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  s rolled back in
40c0: 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e  stead.** of bein
40d0: 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a  g committed..*/.
40e0: 73 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d  static int DbCom
40f0: 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  mitHandler(void 
4100: 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *cd){.  SqliteDb
4110: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4120: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b  b*)cd;.  int rc;
4130: 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ..  rc = Tcl_Eva
4140: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
4150: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20  Db->zCommit);.  
4160: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c  if( rc!=TCL_OK |
4170: 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74  | atoi(Tcl_GetSt
4180: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
4190: 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20  interp)) ){.    
41a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
41b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
41c0: 74 69 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62  tic void DbRollb
41d0: 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  ackHandler(void 
41e0: 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20 20  *clientData){.  
41f0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
4200: 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e  (SqliteDb*)clien
4210: 74 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28  tData;.  assert(
4220: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
4230: 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f  ok);.  if( TCL_O
4240: 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  K!=Tcl_EvalObjEx
4250: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
4260: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
4270: 2c 20 30 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  , 0) ){.    Tcl_
4280: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
4290: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  pDb->interp);.  
42a0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
42b0: 20 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72   DbUpdateHandler
42c0: 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20  (.  void *p, .  
42d0: 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20  int op,.  const 
42e0: 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f  char *zDb, .  co
42f0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20  nst char *zTbl, 
4300: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
4310: 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69 74  rowid.){.  Sqlit
4320: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
4330: 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f  teDb *)p;.  Tcl_
4340: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 61 73  Obj *pCmd;..  as
4350: 73 65 72 74 28 20 70 44 62 2d 3e 70 55 70 64 61  sert( pDb->pUpda
4360: 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65  teHook );.  asse
4370: 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  rt( op==SQLITE_I
4380: 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c  NSERT || op==SQL
4390: 49 54 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70  ITE_UPDATE || op
43a0: 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  ==SQLITE_DELETE 
43b0: 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c  );..  pCmd = Tcl
43c0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44  _DuplicateObj(pD
43d0: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b  b->pUpdateHook);
43e0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
43f0: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
4400: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4410: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
4420: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4430: 0a 20 20 20 20 28 20 28 6f 70 3d 3d 53 51 4c 49  .    ( (op==SQLI
4440: 54 45 5f 49 4e 53 45 52 54 29 3f 22 49 4e 53 45  TE_INSERT)?"INSE
4450: 52 54 22 3a 28 6f 70 3d 3d 53 51 4c 49 54 45 5f  RT":(op==SQLITE_
4460: 55 50 44 41 54 45 29 3f 22 55 50 44 41 54 45 22  UPDATE)?"UPDATE"
4470: 3a 22 44 45 4c 45 54 45 22 29 2c 20 2d 31 29 29  :"DELETE"), -1))
4480: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
4490: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
44a0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
44b0: 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29  ingObj(zDb, -1))
44c0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
44d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
44e0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
44f0: 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29  ingObj(zTbl, -1)
4500: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
4510: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
4520: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69   pCmd, Tcl_NewWi
4530: 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29  deIntObj(rowid))
4540: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
4550: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
4560: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
4570: 52 45 43 54 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  RECT);.}..static
4580: 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65   void tclCollate
4590: 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a  Needed(.  void *
45a0: 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20  pCtx,.  sqlite3 
45b0: 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  *db,.  int enc,.
45c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
45d0: 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  ame.){.  SqliteD
45e0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
45f0: 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  Db *)pCtx;.  Tcl
4600: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
4610: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
4620: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
4630: 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  eded);.  Tcl_Inc
4640: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
4650: 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  t);.  Tcl_ListOb
4660: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
4670: 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e  , pScript, Tcl_N
4680: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d  ewStringObj(zNam
4690: 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  e, -1));.  Tcl_E
46a0: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
46b0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
46c0: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
46d0: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
46e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
46f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4700: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
4710: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
4720: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65  ction implemente
4730: 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73  d.** using TCL s
4740: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
4750: 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61   int tclSqlColla
4760: 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  te(.  void *pCtx
4770: 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f  ,.  int nA,.  co
4780: 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
4790: 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20  int nB,.  const 
47a0: 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71  void *zB.){.  Sq
47b0: 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53  lCollate *p = (S
47c0: 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78  qlCollate *)pCtx
47d0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
47e0: 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c  d;..  pCmd = Tcl
47f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d  _NewStringObj(p-
4800: 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20  >zScript, -1);. 
4810: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4820: 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c  t(pCmd);.  Tcl_L
4830: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4840: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
4850: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4860: 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a  ngObj(zA, nA));.
4870: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4880: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
4890: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  terp, pCmd, Tcl_
48a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c  NewStringObj(zB,
48b0: 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   nB));.  Tcl_Eva
48c0: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
48d0: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
48e0: 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
48f0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
4900: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 74  d);.  return (at
4910: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
4920: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
4930: 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  )));.}../*.** Th
4940: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4950: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
4960: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
4970: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
4980: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
4990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
49a0: 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69   tclSqlFunc(sqli
49b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
49c0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
49d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61  sqlite3_value**a
49e0: 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  rgv){.  SqlFunc 
49f0: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
4a00: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
4a10: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
4a20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4a30: 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63   rc;..  if( argc
4a40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
4a50: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72   there are no ar
4a60: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
4a70: 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63  unction, call Tc
4a80: 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74  l_EvalObjEx on t
4a90: 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74  he.    ** script
4aa0: 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74 6c 79   object directly
4ab0: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  .  This allows t
4ac0: 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20  he TCL compiler 
4ad0: 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20 20 20  to generate.    
4ae0: 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f 72 20  ** bytecode for 
4af0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74  the command on t
4b00: 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74  he first invocat
4b10: 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d 61 6b  ion and thus mak
4b20: 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  e.    ** subsequ
4b30: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  ent invocations 
4b40: 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a  much faster. */.
4b50: 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53      pCmd = p->pS
4b60: 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
4b70: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
4b80: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
4b90: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
4ba0: 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20  erp, pCmd, 0);. 
4bb0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
4bc0: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c  unt(pCmd);.  }el
4bd0: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
4be0: 65 72 65 20 61 72 65 20 61 72 67 75 6d 65 6e 74  ere are argument
4bf0: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
4c00: 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f  n, make a shallo
4c10: 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20  w copy of the.  
4c20: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
4c30: 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68 65 20  ct, lappend the 
4c40: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20  arguments, then 
4c50: 65 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 70  evaluate the cop
4c60: 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
4c70: 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f   By "shallow" co
4c80: 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20 6f 6e  py, we mean a on
4c90: 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69 73  ly the outer lis
4ca0: 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70  t Tcl_Obj is dup
4cb0: 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  licated..    ** 
4cc0: 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20  The new Tcl_Obj 
4cd0: 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
4ce0: 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  s to the origina
4cf0: 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e  l list elements.
4d00: 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61   .    ** That wa
4d10: 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c  y, when Tcl_Eval
4d20: 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e  Objv() is run an
4d30: 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66  d shimmers the f
4d40: 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20  irst element.   
4d50: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20   ** of the list 
4d60: 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70  to tclCmdNameTyp
4d70: 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74  e, that alternat
4d80: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
4d90: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
4da0: 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65  preserved and re
4db0: 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  used on the next
4dc0: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
4dd0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
4de0: 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  **aArg;.    int 
4df0: 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63  nArg;.    if( Tc
4e00: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
4e10: 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ents(p->interp, 
4e20: 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72  p->pScript, &nAr
4e30: 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20  g, &aArg) ){.   
4e40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4e50: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
4e60: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
4e70: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
4e80: 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72 65 74   -1); .      ret
4e90: 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a  urn;.    }     .
4ea0: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
4eb0: 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20  ewListObj(nArg, 
4ec0: 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49  aArg);.    Tcl_I
4ed0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
4ee0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
4ef0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
4f00: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
4f10: 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d  e *pIn = argv[i]
4f20: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
4f30: 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pVal;.         
4f40: 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 65 74     .      /* Set
4f50: 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e   pVal to contain
4f60: 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
4f70: 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f   of this row. */
4f80: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73  .      switch( s
4f90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
4fa0: 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20  e(pIn) ){.      
4fb0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
4fc0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
4fd0: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
4fe0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
4ff0: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
5000: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pVal = Tcl_NewBy
5010: 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74  teArrayObj(sqlit
5020: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49  e3_value_blob(pI
5030: 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  n), bytes);.    
5040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
5060: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
5070: 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
5080: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
5090: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
50a0: 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20  nt64(pIn);.     
50b0: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
50c0: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
50d0: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
50e0: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
50f0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b  cl_NewIntObj(v);
5100: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5110: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
5120: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  al = Tcl_NewWide
5130: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
5140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5160: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
5170: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
5180: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
5190: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
51a0: 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20  e_double(pIn);. 
51b0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
51c0: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
51d0: 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  (r);.          b
51e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
51f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
5200: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
5210: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
5220: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
5230: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
5240: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5250: 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
5260: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
5270: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
5280: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
5290: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
52a0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
52b0: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71  ngObj((char *)sq
52c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
52d0: 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20  (pIn), bytes);. 
52e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
52f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5300: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c  }.      rc = Tcl
5310: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5320: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
5330: 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20   pCmd, pVal);.  
5340: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
5350: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
5360: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5380: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5390: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
53a0: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
53b0: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20  p), -1); .      
53c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
53d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
53e0: 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  !p->useEvalObjv 
53f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f  ){.      /* Tcl_
5400: 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c  EvalObjEx() will
5410: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
5420: 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  all Tcl_EvalObjv
5430: 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20  () if pCmd.     
5440: 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69   ** is a list wi
5450: 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72  thout a string r
5460: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20  epresentation.  
5470: 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20  To prevent this 
5480: 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  from.      ** ha
5490: 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75  ppening, make su
54a0: 72 65 20 70 43 6d 64 20 68 61 73 20 61 20 76 61  re pCmd has a va
54b0: 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70 72 65  lid string repre
54c0: 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  sentation */.   
54d0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
54e0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCmd);.    }.  
54f0: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
5500: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
5510: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
5520: 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f  IRECT);.    Tcl_
5530: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5540: 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  d);.  }..  if( r
5550: 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54  c && rc!=TCL_RET
5560: 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  URN ){.    sqlit
5570: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
5580: 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74  context, Tcl_Get
5590: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
55a0: 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20  interp), -1); . 
55b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
55c0: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
55d0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e  GetObjResult(p->
55e0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74  interp);.    int
55f0: 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61   n;.    u8 *data
5600: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
5610: 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65 50 74  e = pVar->typePt
5620: 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74  r ? pVar->typePt
5630: 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20  r->name : "";.  
5640: 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65    char c = zType
5650: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  [0];.    if( c==
5660: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
5670: 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29  ype,"bytearray")
5680: 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74  ==0 && pVar->byt
5690: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  es==0 ){.      /
56a0: 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20  * Only return a 
56b0: 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65  BLOB type if the
56c0: 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73   Tcl variable is
56d0: 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64   a bytearray and
56e0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
56f0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
5700: 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  tation. */.     
5710: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
5720: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
5730: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
5740: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5750: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61  blob(context, da
5760: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52  ta, n, SQLITE_TR
5770: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
5780: 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26  lse if( c=='b' &
5790: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
57a0: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a  boolean")==0 ){.
57b0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74        Tcl_GetInt
57c0: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
57d0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
57e0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
57f0: 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20  ontext, n);.    
5800: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
5810: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
5820: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
5830: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b  .      double r;
5840: 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f  .      Tcl_GetDo
5850: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  ubleFromObj(0, p
5860: 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20  Var, &r);.      
5870: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
5880: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72  ouble(context, r
5890: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
58a0: 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63   (c=='w' && strc
58b0: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
58c0: 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20  t")==0) ||.     
58d0: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
58e0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
58f0: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
5900: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
5910: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64        Tcl_GetWid
5920: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  eIntFromObj(0, p
5930: 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  Var, &v);.      
5940: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
5950: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29  nt64(context, v)
5960: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5970: 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67     data = (unsig
5980: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
5990: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
59a0: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
59b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
59c0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
59d0: 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53  har *)data, n, S
59e0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
59f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
5a00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5a10: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
5a20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
5a30: 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  he authenticatio
5a40: 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  n function.  It 
5a50: 61 70 70 65 6e 64 73 20 74 68 65 20 61 75 74 68  appends the auth
5a60: 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79  entication.** ty
5a70: 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  pe code and the 
5a80: 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  two arguments to
5a90: 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76   zCmd[] then inv
5aa0: 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  okes the result.
5ab0: 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70  ** on the interp
5ac0: 72 65 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c  reter.  The repl
5ad0: 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f  y is examined to
5ae0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
5af0: 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74  e.** authenticat
5b00: 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63  ion fails or suc
5b10: 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ceeds..*/.static
5b20: 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61   int auth_callba
5b30: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ck(.  void *pArg
5b40: 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20  ,.  int code,.  
5b50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
5b60: 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1,.  const char 
5b70: 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20  *zArg2,.  const 
5b80: 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63  char *zArg3,.  c
5b90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34  onst char *zArg4
5ba0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64  .){.  char *zCod
5bb0: 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  e;.  Tcl_DString
5bc0: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   str;.  int rc;.
5bd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
5be0: 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62  eply;.  SqliteDb
5bf0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5c00: 62 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  b*)pArg;.  if( p
5c10: 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 20  Db->disableAuth 
5c20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
5c30: 4f 4b 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63  OK;..  switch( c
5c40: 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
5c50: 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20  SQLITE_COPY     
5c60: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
5c70: 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20  ="SQLITE_COPY"; 
5c80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5c90: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
5ca0: 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  DEX      : zCode
5cb0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5cc0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
5cd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5ce0: 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20  REATE_TABLE     
5cf0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5d00: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20  _CREATE_TABLE"; 
5d10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5d20: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5d30: 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65  MP_INDEX : zCode
5d40: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5d50: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
5d60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5d70: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5d80: 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53  TABLE : zCode="S
5d90: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5da0: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
5db0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5dc0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
5dd0: 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GGER: zCode="SQL
5de0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5df0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
5e00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5e10: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5e20: 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  W  : zCode="SQLI
5e30: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
5e40: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
5e50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
5e60: 41 54 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a  ATE_TRIGGER    :
5e70: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5e80: 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20  REATE_TRIGGER"; 
5e90: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5ea0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
5eb0: 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  EW       : zCode
5ec0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5ed0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
5ee0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
5ef0: 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20  LETE            
5f00: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5f10: 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a  DELETE"; break;.
5f20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5f30: 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20  DROP_INDEX      
5f40: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
5f50: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62  E_DROP_INDEX"; b
5f60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5f70: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
5f80: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
5f90: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42  "SQLITE_DROP_TAB
5fa0: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
5fb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5fc0: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20  _TEMP_INDEX   : 
5fd0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5fe0: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20  OP_TEMP_INDEX"; 
5ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6000: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6010: 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65  _TABLE   : zCode
6020: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
6030: 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  MP_TABLE"; break
6040: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6050: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
6060: 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GER : zCode="SQL
6070: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
6080: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6090: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
60a0: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20  ROP_TEMP_VIEW   
60b0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
60c0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22  _DROP_TEMP_VIEW"
60d0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
60e0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  e SQLITE_DROP_TR
60f0: 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f  IGGER      : zCo
6100: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6110: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
6120: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6130: 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20  _DROP_VIEW      
6140: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6150: 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62  TE_DROP_VIEW"; b
6160: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6170: 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20  QLITE_INSERT    
6180: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6190: 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b  "SQLITE_INSERT";
61a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
61b0: 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20   SQLITE_PRAGMA  
61c0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
61d0: 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e="SQLITE_PRAGMA
61e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
61f0: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20  se SQLITE_READ  
6200: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6210: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44  ode="SQLITE_READ
6220: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6230: 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  se SQLITE_SELECT
6240: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6250: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45  ode="SQLITE_SELE
6260: 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CT"; break;.    
6270: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e  case SQLITE_TRAN
6280: 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20  SACTION       : 
6290: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52  zCode="SQLITE_TR
62a0: 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61  ANSACTION"; brea
62b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
62c0: 54 45 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  TE_UPDATE       
62d0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
62e0: 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72  LITE_UPDATE"; br
62f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6300: 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20 20 20  LITE_ATTACH     
6310: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6320: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20  SQLITE_ATTACH"; 
6330: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6340: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20  SQLITE_DETACH   
6350: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6360: 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22  ="SQLITE_DETACH"
6370: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6380: 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  e SQLITE_ALTER_T
6390: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
63a0: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52  de="SQLITE_ALTER
63b0: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
63c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
63d0: 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
63e0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
63f0: 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61  E_REINDEX"; brea
6400: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6410: 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20  TE_ANALYZE      
6420: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6430: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62  LITE_ANALYZE"; b
6440: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6450: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41  QLITE_CREATE_VTA
6460: 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  BLE     : zCode=
6470: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56  "SQLITE_CREATE_V
6480: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
6490: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
64a0: 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20  ROP_VTABLE      
64b0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
64c0: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62  _DROP_VTABLE"; b
64d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
64e0: 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20  QLITE_FUNCTION  
64f0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6500: 22 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e  "SQLITE_FUNCTION
6510: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6520: 73 65 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  se SQLITE_SAVEPO
6530: 49 4e 54 20 20 20 20 20 20 20 20 20 3a 20 7a 43  INT         : zC
6540: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 41 56 45  ode="SQLITE_SAVE
6550: 50 4f 49 4e 54 22 3b 20 62 72 65 61 6b 3b 0a 20  POINT"; break;. 
6560: 20 20 20 64 65 66 61 75 6c 74 20 20 20 20 20 20     default      
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b   : zCode="????";
6590: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63   break;.  }.  Tc
65a0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
65b0: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
65c0: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
65d0: 44 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a  Db->zAuth, -1);.
65e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
65f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
6600: 20 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44   zCode);.  Tcl_D
6610: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
6620: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20  ent(&str, zArg1 
6630: 3f 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20  ? zArg1 : "");. 
6640: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
6650: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
6660: 7a 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20  zArg2 ? zArg2 : 
6670: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
6680: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
6690: 26 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41  &str, zArg3 ? zA
66a0: 72 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg3 : "");.  Tcl
66b0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
66c0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
66d0: 34 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b  4 ? zArg4 : "");
66e0: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62  .  rc = Tcl_Glob
66f0: 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  alEval(pDb->inte
6700: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
6710: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
6720: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
6730: 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d  str);.  zReply =
6740: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
6750: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
6760: 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  );.  if( strcmp(
6770: 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f  zReply,"SQLITE_O
6780: 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  K")==0 ){.    rc
6790: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
67a0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
67b0: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
67c0: 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20  DENY")==0 ){.   
67d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e   rc = SQLITE_DEN
67e0: 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  Y;.  }else if( s
67f0: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
6800: 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30  LITE_IGNORE")==0
6810: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
6820: 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65  ITE_IGNORE;.  }e
6830: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39  lse{.    rc = 99
6840: 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  9;.  }.  return 
6850: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
6860: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6870: 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a  ORIZATION */../*
6880: 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20 61 20 70  .** zText is a p
6890: 6f 69 6e 74 65 72 20 74 6f 20 74 65 78 74 20 6f  ointer to text o
68a0: 62 74 61 69 6e 65 64 20 76 69 61 20 61 6e 20 73  btained via an s
68b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
68c0: 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c  xt().** or simil
68d0: 61 72 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68  ar interface. Th
68e0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
68f0: 6e 73 20 61 20 54 63 6c 20 73 74 72 69 6e 67 20  ns a Tcl string 
6900: 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65  object, .** refe
6910: 72 65 6e 63 65 20 63 6f 75 6e 74 20 73 65 74 20  rence count set 
6920: 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67  to 0, containing
6930: 20 74 68 65 20 74 65 78 74 2e 20 49 66 20 61 20   the text. If a 
6940: 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62  translation.** b
6950: 65 74 77 65 65 6e 20 69 73 6f 38 38 35 39 20 61  etween iso8859 a
6960: 6e 64 20 55 54 46 2d 38 20 69 73 20 72 65 71 75  nd UTF-8 is requ
6970: 69 72 65 64 2c 20 69 74 20 69 73 20 70 72 65 66  ired, it is pref
6980: 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ormed..*/.static
6990: 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74   Tcl_Obj *dbText
69a0: 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73 74  ToObj(char const
69b0: 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f   *zText){.  Tcl_
69c0: 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65  Obj *pVal;.#ifde
69d0: 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f  f UTF_TRANSLATIO
69e0: 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f 44  N_NEEDED.  Tcl_D
69f0: 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54  String dCol;.  T
6a00: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
6a10: 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74  dCol);.  Tcl_Ext
6a20: 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e  ernalToUtfDStrin
6a30: 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d  g(NULL, zText, -
6a40: 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61  1, &dCol);.  pVa
6a50: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
6a60: 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67  gObj(Tcl_DString
6a70: 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31  Value(&dCol), -1
6a80: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
6a90: 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c  Free(&dCol);.#el
6aa0: 73 65 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f  se.  pVal = Tcl_
6ab0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65  NewStringObj(zTe
6ac0: 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a  xt, -1);.#endif.
6ad0: 20 20 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d    return pVal;.}
6ae0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6af0: 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e  tine reads a lin
6b00: 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46  e of text from F
6b10: 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a  ILE in, stores.*
6b20: 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65  * the text in me
6b30: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
6b40: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  om malloc() and 
6b50: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
6b60: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74  r.** to the text
6b70: 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  .  NULL is retur
6b80: 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69  ned at end of fi
6b90: 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63  le, or if malloc
6ba0: 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a  ().** fails..**.
6bb0: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
6bc0: 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69   is like "readli
6bd0: 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61  ne" but no comma
6be0: 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a  nd-line editing.
6bf0: 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  ** is done..**.*
6c00: 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68  * copied from sh
6c10: 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70  ell.c from '.imp
6c20: 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a  ort' command.*/.
6c30: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63  static char *loc
6c40: 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20  al_getline(char 
6c50: 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a  *zPrompt, FILE *
6c60: 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  in){.  char *zLi
6c70: 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b  ne;.  int nLine;
6c80: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
6c90: 65 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20  eol;..  nLine = 
6ca0: 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d  100;.  zLine = m
6cb0: 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a  alloc( nLine );.
6cc0: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
6cd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d   return 0;.  n =
6ce0: 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20   0;.  eol = 0;. 
6cf0: 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a   while( !eol ){.
6d00: 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c      if( n+100>nL
6d10: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69  ine ){.      nLi
6d20: 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31  ne = nLine*2 + 1
6d30: 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20  00;.      zLine 
6d40: 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c  = realloc(zLine,
6d50: 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69   nLine);.      i
6d60: 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65  f( zLine==0 ) re
6d70: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
6d80: 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69    if( fgets(&zLi
6d90: 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e  ne[n], nLine - n
6da0: 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , in)==0 ){.    
6db0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
6dc0: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
6dd0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
6de0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
6df0: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
6e00: 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a  .      eol = 1;.
6e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6e20: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c   }.    while( zL
6e30: 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d  ine[n] ){ n++; }
6e40: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
6e50: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27  zLine[n-1]=='\n'
6e60: 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20   ){.      n--;. 
6e70: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
6e80: 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31  0;.      eol = 1
6e90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c  ;.    }.  }.  zL
6ea0: 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a  ine = realloc( z
6eb0: 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72  Line, n+1 );.  r
6ec0: 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a  eturn zLine;.}..
6ed0: 0a 2f 2a 0a 2a 2a 20 46 69 67 75 72 65 20 6f 75  ./*.** Figure ou
6ee0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  t the column nam
6ef0: 65 73 20 66 6f 72 20 74 68 65 20 64 61 74 61 20  es for the data 
6f00: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
6f10: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 70 61 73  statement.** pas
6f20: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
6f30: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
6f40: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 70  * If parameter p
6f50: 61 70 43 6f 6c 4e 61 6d 65 20 69 73 20 6e 6f 74  apColName is not
6f60: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 61 70   NULL, then *pap
6f70: 43 6f 6c 4e 61 6d 65 20 69 73 20 73 65 74 20 74  ColName is set t
6f80: 6f 20 70 6f 69 6e 74 0a 2a 2a 20 61 74 20 61 6e  o point.** at an
6f90: 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64   array allocated
6fa0: 20 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63   using Tcl_Alloc
6fb0: 28 29 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  (). It is the ca
6fc0: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
6fd0: 6c 69 74 79 0a 2a 2a 20 74 6f 20 66 72 65 65 20  lity.** to free 
6fe0: 74 68 69 73 20 61 72 72 61 79 20 75 73 69 6e 67  this array using
6ff0: 20 54 63 6c 5f 46 72 65 65 28 29 2c 20 61 6e 64   Tcl_Free(), and
7000: 20 74 6f 20 64 65 63 72 65 6d 65 6e 74 20 74 68   to decrement th
7010: 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 63  e reference.** c
7020: 6f 75 6e 74 20 6f 66 20 65 61 63 68 20 54 63 6c  ount of each Tcl
7030: 5f 4f 62 6a 2a 20 6d 65 6d 62 65 72 20 6f 66 20  _Obj* member of 
7040: 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  the array..**.**
7050: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
7060: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
7070: 6f 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  on is the number
7080: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
7090: 61 74 61 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  ata.** returned 
70a0: 62 79 20 70 53 74 6d 74 20 28 61 6e 64 20 68 65  by pStmt (and he
70b0: 6e 63 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nce the size of 
70c0: 74 68 65 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20  the *papColName 
70d0: 61 72 72 61 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  array)..**.** If
70e0: 20 70 41 72 72 61 79 20 69 73 20 6e 6f 74 20 4e   pArray is not N
70f0: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f 6e  ULL, then it con
7100: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
7110: 66 20 61 20 54 63 6c 20 61 72 72 61 79 0a 2a 2a  f a Tcl array.**
7120: 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 22   variable. The "
7130: 2a 22 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 69  *" member of thi
7140: 73 20 61 72 72 61 79 20 69 73 20 73 65 74 20 74  s array is set t
7150: 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  o a list contain
7160: 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73  ing.** the names
7170: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
7180: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
7190: 73 74 61 74 65 6d 65 6e 74 2c 20 69 6e 20 6f 72  statement, in or
71a0: 64 65 72 20 66 72 6f 6d 0a 2a 2a 20 6c 65 66 74  der from.** left
71b0: 20 74 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e 20   to right. e.g. 
71c0: 69 66 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  if the names of 
71d0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c  the returned col
71e0: 75 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e  umns are a, b an
71f0: 64 0a 2a 2a 20 63 2c 20 69 74 20 64 6f 65 73 20  d.** c, it does 
7200: 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
7210: 66 20 74 68 65 20 74 63 6c 20 63 6f 6d 6d 61 6e  f the tcl comman
7220: 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74  d:.**.**     set
7230: 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61   ${pArray}(*) {a
7240: 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20   b c}.*/.static 
7250: 69 6e 74 0a 63 6f 6d 70 75 74 65 43 6f 6c 75 6d  int.computeColum
7260: 6e 4e 61 6d 65 73 28 0a 20 20 54 63 6c 5f 49 6e  nNames(.  Tcl_In
7270: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20  terp *interp, . 
7280: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
7290: 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  Stmt,           
72a0: 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
72b0: 65 6e 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ent */.  Tcl_Obj
72c0: 20 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 2c 20   ***papColName, 
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
72e0: 54 3a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  T: Array of colu
72f0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54 63  mn names */.  Tc
7300: 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 20 20  l_Obj *pArray   
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79  /* Name of array
7330: 20 76 61 72 69 61 62 6c 65 20 28 6d 61 79 20 62   variable (may b
7340: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 29 7b 0a 20 20  e null) */.){.  
7350: 69 6e 74 20 6e 43 6f 6c 3b 0a 0a 20 20 2f 2a 20  int nCol;..  /* 
7360: 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e  Compute column n
7370: 61 6d 65 73 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d  ames */.  nCol =
7380: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7390: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
73a0: 69 66 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29  if( papColName )
73b0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
73c0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c   Tcl_Obj **apCol
73d0: 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a  Name = (Tcl_Obj*
73e0: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
73f0: 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43  eof(Tcl_Obj*)*nC
7400: 6f 6c 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ol );.    for(i=
7410: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
7420: 0a 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65  .      apColName
7430: 5b 69 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62  [i] = dbTextToOb
7440: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
7450: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
7460: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
7470: 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d  efCount(apColNam
7480: 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e[i]);.    }..  
7490: 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20    /* If results 
74a0: 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  are being stored
74b0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72   in an array var
74c0: 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61  iable, then crea
74d0: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72  te.    ** the ar
74e0: 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72  ray(*) entry for
74f0: 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20 20   that array.    
7500: 2a 2f 0a 20 20 20 20 69 66 28 20 70 41 72 72 61  */.    if( pArra
7510: 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  y ){.      Tcl_O
7520: 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54  bj *pColList = T
7530: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
7540: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61     Tcl_Obj *pSta
7550: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
7560: 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 20  gObj("*", -1);. 
7570: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
7580: 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b  Count(pColList);
7590: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
75a0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
75b0: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
75c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
75d0: 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c  nterp, pColList,
75e0: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a   apColName[i]);.
75f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63        }.      Tc
7600: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
7610: 53 74 61 72 29 3b 0a 20 20 20 20 20 20 54 63 6c  Star);.      Tcl
7620: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
7630: 72 70 2c 20 70 41 72 72 61 79 2c 20 70 53 74 61  rp, pArray, pSta
7640: 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a  r, pColList,0);.
7650: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
7660: 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29  fCount(pColList)
7670: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  ;.      Tcl_Decr
7680: 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b  RefCount(pStar);
7690: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 61 70 43  .    }.    *papC
76a0: 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e 61  olName = apColNa
76b0: 6d 65 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  me;.  }..  retur
76c0: 6e 20 6e 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nCol;.}../*.**
76d0: 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
76e0: 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61  mmand below crea
76f0: 74 65 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f  tes a new Tcl co
7700: 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a  mmand for each.*
7710: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20  * connection it 
7720: 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69  opens to an SQLi
7730: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  te database.  Th
7740: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
7750: 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65  voked.** wheneve
7760: 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63  r one of those c
7770: 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66  onnection-specif
7780: 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65  ic commands is e
7790: 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63  xecuted.** in Tc
77a0: 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
77b0: 20 69 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20   if you run Tcl 
77c0: 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a  code like this:.
77d0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69  **.**       sqli
77e0: 74 65 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74  te3 db1  "my_dat
77f0: 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20  abase".**       
7800: 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20  db1 close.**.** 
7810: 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e  The first comman
7820: 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63  d opens a connec
7830: 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f  tion to the "my_
7840: 64 61 74 61 62 61 73 65 22 20 64 61 74 61 62 61  database" databa
7850: 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20  se.** and calls 
7860: 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  that connection 
7870: 22 64 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f  "db1".  The seco
7880: 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65  nd command cause
7890: 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75  s this.** subrou
78a0: 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tine to be invok
78b0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
78c0: 74 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20  t DbObjCmd(void 
78d0: 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  *cd, Tcl_Interp 
78e0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
78f0: 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  c,Tcl_Obj *const
7900: 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65  *objv){.  Sqlite
7910: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
7920: 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63  eDb*)cd;.  int c
7930: 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20  hoice;.  int rc 
7940: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74  = TCL_OK;.  stat
7950: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44  ic const char *D
7960: 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  B_strs[] = {.   
7970: 20 22 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20   "authorizer",  
7980: 20 20 20 20 20 20 20 22 62 75 73 79 22 2c 20 20         "busy",  
7990: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 63              "cac
79a0: 68 65 22 2c 0a 20 20 20 20 22 63 68 61 6e 67 65  he",.    "change
79b0: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  s",            "
79c0: 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20  close",         
79d0: 20 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 0a 20      "collate",. 
79e0: 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65     "collation_ne
79f0: 65 64 65 64 22 2c 20 20 20 22 63 6f 6d 6d 69 74  eded",   "commit
7a00: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 63  _hook",       "c
7a10: 6f 6d 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 63  omplete",.    "c
7a20: 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  opy",           
7a30: 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64      "enable_load
7a40: 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 22 65 72 72  _extension","err
7a50: 6f 72 63 6f 64 65 22 2c 0a 20 20 20 20 22 65 76  orcode",.    "ev
7a60: 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  al",            
7a70: 20 20 20 22 65 78 69 73 74 73 22 2c 20 20 20 20     "exists",    
7a80: 20 20 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f          "functio
7a90: 6e 22 2c 0a 20 20 20 20 22 69 6e 63 72 62 6c 6f  n",.    "incrblo
7aa0: 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 69  b",           "i
7ab0: 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20 20 20  nterrupt",      
7ac0: 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f     "last_insert_
7ad0: 72 6f 77 69 64 22 2c 0a 20 20 20 20 22 6e 75 6c  rowid",.    "nul
7ae0: 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20  lvalue",        
7af0: 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20 20    "onecolumn",  
7b00: 20 20 20 20 20 20 20 22 70 72 6f 66 69 6c 65 22         "profile"
7b10: 2c 0a 20 20 20 20 22 70 72 6f 67 72 65 73 73 22  ,.    "progress"
7b20: 2c 20 20 20 20 20 20 20 20 20 20 20 22 72 65 6b  ,           "rek
7b30: 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey",            
7b40: 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22   "rollback_hook"
7b50: 2c 0a 20 20 20 20 22 73 74 61 74 75 73 22 2c 20  ,.    "status", 
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 69 6d              "tim
7b70: 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20  eout",          
7b80: 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22   "total_changes"
7b90: 2c 0a 20 20 20 20 22 74 72 61 63 65 22 2c 20 20  ,.    "trace",  
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 72 61              "tra
7bb0: 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  nsaction",      
7bc0: 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 0a   "update_hook",.
7bd0: 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c 20 20      "version",  
7be0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
7c00: 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65    };.  enum DB_e
7c10: 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54  num {.    DB_AUT
7c20: 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20  HORIZER,        
7c30: 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20 20 20  DB_BUSY,        
7c40: 20 20 20 20 20 44 42 5f 43 41 43 48 45 2c 0a 20       DB_CACHE,. 
7c50: 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20 20     DB_CHANGES,  
7c60: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c 4f 53           DB_CLOS
7c70: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42  E,            DB
7c80: 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20 20 44 42  _COLLATE,.    DB
7c90: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
7ca0: 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f  D,  DB_COMMIT_HO
7cb0: 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43 4f 4d 50  OK,      DB_COMP
7cc0: 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 50  LETE,.    DB_COP
7cd0: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,              
7ce0: 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  DB_ENABLE_LOAD_E
7cf0: 58 54 45 4e 53 49 4f 4e 2c 44 42 5f 45 52 52 4f  XTENSION,DB_ERRO
7d00: 52 43 4f 44 45 2c 0a 20 20 20 20 44 42 5f 45 56  RCODE,.    DB_EV
7d10: 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AL,             
7d20: 20 44 42 5f 45 58 49 53 54 53 2c 20 20 20 20 20   DB_EXISTS,     
7d30: 20 20 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f        DB_FUNCTIO
7d40: 4e 2c 0a 20 20 20 20 44 42 5f 49 4e 43 52 42 4c  N,.    DB_INCRBL
7d50: 4f 42 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  OB,          DB_
7d60: 49 4e 54 45 52 52 55 50 54 2c 20 20 20 20 20 20  INTERRUPT,      
7d70: 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54    DB_LAST_INSERT
7d80: 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44 42 5f 4e  _ROWID,.    DB_N
7d90: 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20 20 20 20  ULLVALUE,       
7da0: 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20    DB_ONECOLUMN, 
7db0: 20 20 20 20 20 20 20 44 42 5f 50 52 4f 46 49 4c         DB_PROFIL
7dc0: 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f 47 52 45  E,.    DB_PROGRE
7dd0: 53 53 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  SS,          DB_
7de0: 52 45 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20  REKEY,          
7df0: 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f    DB_ROLLBACK_HO
7e00: 4f 4b 2c 0a 20 20 20 20 44 42 5f 53 54 41 54 55  OK,.    DB_STATU
7e10: 53 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42  S,            DB
7e20: 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20  _TIMEOUT,       
7e30: 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e     DB_TOTAL_CHAN
7e40: 47 45 53 2c 0a 20 20 20 20 44 42 5f 54 52 41 43  GES,.    DB_TRAC
7e50: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  E,             D
7e60: 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20  B_TRANSACTION,  
7e70: 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f      DB_UPDATE_HO
7e80: 4f 4b 2c 20 0a 20 20 20 20 44 42 5f 56 45 52 53  OK, .    DB_VERS
7e90: 49 4f 4e 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f  ION.  };.  /* do
7ea0: 6e 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69  n't leave traili
7eb0: 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f  ng commas on DB_
7ec0: 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65  enum, it confuse
7ed0: 73 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f  s the AIX xlc co
7ee0: 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28  mpiler */..  if(
7ef0: 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54   objc<2 ){.    T
7f00: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
7f10: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
7f20: 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e   "SUBCOMMAND ...
7f30: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
7f40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
7f50: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
7f60: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
7f70: 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73  objv[1], DB_strs
7f80: 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26  , "option", 0, &
7f90: 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72  choice) ){.    r
7fa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7fb0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
7fc0: 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68  (enum DB_enum)ch
7fd0: 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20  oice ){..  /*   
7fe0: 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20   $db authorizer 
7ff0: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
8000: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
8010: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74  given callback t
8020: 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68  o authorize each
8030: 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61   SQL operation a
8040: 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  s it is.  ** com
8050: 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65  piled.  5 argume
8060: 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64  nts are appended
8070: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
8080: 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20   before it is.  
8090: 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a  ** invoked:.  **
80a0: 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20  .  **   (1) The 
80b0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79  authorization ty
80c0: 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43  pe (ex: SQLITE_C
80d0: 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c  REATE_TABLE, SQL
80e0: 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29  ITE_INSERT, ...)
80f0: 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73  .  **   (2) Firs
8100: 74 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  t descriptive na
8110: 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61  me (depends on a
8120: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
8130: 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65  e).  **   (3) Se
8140: 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65  cond descriptive
8150: 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29   name.  **   (4)
8160: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
8170: 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e  abase (ex: "main
8180: 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20  ", "temp").  ** 
8190: 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72    (5) Name of tr
81a0: 69 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f  igger that is do
81b0: 69 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20  ing the access. 
81c0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
81d0: 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74  lback should ret
81e0: 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f  urn on of the fo
81f0: 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a  llowing strings:
8200: 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a   SQLITE_OK,.  **
8210: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20   SQLITE_IGNORE, 
8220: 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20  or SQLITE_DENY. 
8230: 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
8240: 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72  n value is an er
8250: 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ror..  **.  ** I
8260: 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73  f this method is
8270: 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f   invoked with no
8280: 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20   arguments, the 
8290: 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a  current authoriz
82a0: 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62  ation.  ** callb
82b0: 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65  ack string is re
82c0: 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  turned..  */.  c
82d0: 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45  ase DB_AUTHORIZE
82e0: 52 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  R: {.#ifdef SQLI
82f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
8300: 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70  ATION.    Tcl_Ap
8310: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8320: 70 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  p, "authorizatio
8330: 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  n not available 
8340: 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20  in this build", 
8350: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
8360: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
8370: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
8380: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
8390: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
83a0: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
83b0: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
83c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
83d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
83e0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
83f0: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
8400: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
8410: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8420: 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30  p, pDb->zAuth, 0
8430: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8440: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
8450: 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69   *zAuth;.      i
8460: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
8470: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
8480: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
8490: 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20  (pDb->zAuth);.  
84a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74      }.      zAut
84b0: 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  h = Tcl_GetStrin
84c0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
84d0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
84e0: 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e  f( zAuth && len>
84f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
8500: 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c  ->zAuth = Tcl_Al
8510: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
8520: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
8530: 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68  Db->zAuth, zAuth
8540: 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
8550: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
8560: 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20  Db->zAuth = 0;. 
8570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8580: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
8590: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
85a0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
85b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
85c0: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
85d0: 3e 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61  >db, auth_callba
85e0: 63 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  ck, pDb);.      
85f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8600: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
8610: 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30  rizer(pDb->db, 0
8620: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
8630: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
8640: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
8650: 20 20 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c     $db busy ?CAL
8660: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
8670: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
8680: 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e  n callback if an
8690: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
86a0: 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a  ttempts to open.
86b0: 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61    ** a locked da
86c0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
86d0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 55 53 59  /.  case DB_BUSY
86e0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
86f0: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
8700: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8710: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43  erp, 2, objv, "C
8720: 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20  ALLBACK");.     
8730: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8740: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
8750: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
8760: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
8770: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
8780: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8790: 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c  erp, pDb->zBusy,
87a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
87b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
87c0: 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20  ar *zBusy;.     
87d0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
87e0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
87f0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
8800: 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a  ee(pDb->zBusy);.
8810: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42        }.      zB
8820: 75 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  usy = Tcl_GetStr
8830: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8840: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
8850: 20 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65   if( zBusy && le
8860: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
8870: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f  Db->zBusy = Tcl_
8880: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
8890: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
88a0: 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75  (pDb->zBusy, zBu
88b0: 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  sy, len+1);.    
88c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
88d0: 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b   pDb->zBusy = 0;
88e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
88f0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
8900: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
8910: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
8920: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
8930: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
8940: 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c  >db, DbBusyHandl
8950: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
8960: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8970: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
8980: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
8990: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
89a0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
89b0: 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
89c0: 61 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20  ache flush.  ** 
89d0: 20 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69      $db cache si
89e0: 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  ze n.  **.  ** F
89f0: 6c 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65  lush the prepare
8a00: 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  d statement cach
8a10: 65 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61  e, or set the ma
8a20: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a  ximum number of.
8a30: 20 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74    ** cached stat
8a40: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63  ements..  */.  c
8a50: 61 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a  ase DB_CACHE: {.
8a60: 20 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64      char *subCmd
8a70: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  ;.    int n;..  
8a80: 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b    if( objc<=2 ){
8a90: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
8aa0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8ab0: 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20  1, objv, "cache 
8ac0: 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a  option ?arg?");.
8ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8ae0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8af0: 20 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47    subCmd = Tcl_G
8b00: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
8b10: 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20   objv[2], 0 );. 
8b20: 20 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d     if( *subCmd==
8b30: 27 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  'f' && strcmp(su
8b40: 62 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30  bCmd,"flush")==0
8b50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
8b60: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
8b70: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
8b80: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
8b90: 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20  v, "flush");.   
8ba0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8bb0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
8bc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73  se{.        flus
8bd0: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
8be0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8bf0: 65 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64  else if( *subCmd
8c00: 3d 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28  =='s' && strcmp(
8c10: 73 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d  subCmd,"size")==
8c20: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 ){.      if( o
8c30: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
8c40: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
8c50: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
8c60: 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20  jv, "size n");. 
8c70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
8c80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
8c90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
8ca0: 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c  ( TCL_ERROR==Tcl
8cb0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
8cc0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
8cd0: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  &n) ){.         
8ce0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8cf0: 74 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  t( interp, "cann
8d00: 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20  ot convert \"", 
8d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8d20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8d30: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c  mObj(objv[3],0),
8d40: 20 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22   "\" to integer"
8d50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
8d60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8d70: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8d80: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
8d90: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
8da0: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
8db0: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20  ( pDb );.       
8dc0: 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20       n = 0;.    
8dd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8de0: 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  n>MAX_PREPARED_S
8df0: 54 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20  TMTS ){.        
8e00: 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50      n = MAX_PREP
8e10: 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20  ARED_STMTS;.    
8e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8e30: 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d    pDb->maxStmt =
8e40: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   n;.        }.  
8e50: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
8e60: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
8e70: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
8e80: 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22   "bad option \""
8e90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  , .          Tcl
8ea0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8eb0: 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c  j(objv[2],0), "\
8ec0: 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68  ": must be flush
8ed0: 20 6f 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20   or size", 0);. 
8ee0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8ef0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8f00: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
8f10: 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65  *     $db change
8f20: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  s.  **.  ** Retu
8f30: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8f40: 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
8f50: 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74  modified, insert
8f60: 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62  ed, or deleted b
8f70: 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20  y.  ** the most 
8f80: 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55  recent INSERT, U
8f90: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
8fa0: 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69  statement, not i
8fb0: 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61  ncluding .  ** a
8fc0: 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
8fd0: 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
8fe0: 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ams..  */.  case
8ff0: 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20   DB_CHANGES: {. 
9000: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
9010: 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ult;.    if( obj
9020: 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
9030: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
9040: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
9050: 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
9060: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9070: 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d   }.    pResult =
9080: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
9090: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
90a0: 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
90b0: 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68  sult, sqlite3_ch
90c0: 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
90d0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
90e0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f  .  /*    $db clo
90f0: 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75  se.  **.  ** Shu
9100: 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61  tdown the databa
9110: 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  se.  */.  case D
9120: 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54  B_CLOSE: {.    T
9130: 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
9140: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
9150: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
9160: 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20  jv[0], 0));.    
9170: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
9180: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
9190: 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50  llate NAME SCRIP
91a0: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
91b0: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
91c0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
91d0: 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
91e0: 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
91f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
9200: 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
9210: 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
9220: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
9230: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
9240: 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f  ATE: {.    SqlCo
9250: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
9260: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
9270: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72  ;.    char *zScr
9280: 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63  ipt;.    int nSc
9290: 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  ript;.    if( ob
92a0: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
92b0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
92c0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
92d0: 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b   "NAME SCRIPT");
92e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
92f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9300: 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
9310: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9320: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
9330: 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47   zScript = Tcl_G
9340: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9350: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70  objv[3], &nScrip
9360: 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  t);.    pCollate
9370: 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29   = (SqlCollate*)
9380: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
9390: 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e  f(*pCollate) + n
93a0: 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20  Script + 1 );.  
93b0: 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d    if( pCollate==
93c0: 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
93d0: 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  RROR;.    pColla
93e0: 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  te->interp = int
93f0: 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  erp;.    pCollat
9400: 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  e->pNext = pDb->
9410: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43  pCollate;.    pC
9420: 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20  ollate->zScript 
9430: 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61  = (char*)&pColla
9440: 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e  te[1];.    pDb->
9450: 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c  pCollate = pColl
9460: 61 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ate;.    memcpy(
9470: 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70  pCollate->zScrip
9480: 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72  t, zScript, nScr
9490: 69 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  ipt+1);.    if( 
94a0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
94b0: 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62  ollation(pDb->db
94c0: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
94d0: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70  UTF8, .        p
94e0: 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43  Collate, tclSqlC
94f0: 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20  ollate) ){.     
9500: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
9510: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
9520: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
9530: 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41  b->db), TCL_VOLA
9540: 54 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74  TILE);.      ret
9550: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9560: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
9570: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
9580: 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e     $db collation
9590: 5f 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20  _needed SCRIPT. 
95a0: 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
95b0: 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74  a new SQL collat
95c0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ion function cal
95d0: 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65  led NAME.  Whene
95e0: 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75  ver.  ** that fu
95f0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
9600: 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20  , invoke SCRIPT 
9610: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
9620: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
9630: 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49   case DB_COLLATI
9640: 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20  ON_NEEDED: {.   
9650: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
9660: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9670: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9680: 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22  , objv, "SCRIPT"
9690: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
96a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
96b0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43  .    if( pDb->pC
96c0: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a  ollateNeeded ){.
96d0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
96e0: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
96f0: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
9700: 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c   }.    pDb->pCol
9710: 6c 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c  lateNeeded = Tcl
9720: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62  _DuplicateObj(ob
9730: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f  jv[2]);.    Tcl_
9740: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  IncrRefCount(pDb
9750: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
9760: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
9770: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
9780: 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63  pDb->db, pDb, tc
9790: 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  lCollateNeeded);
97a0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
97b0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d  .  /*    $db com
97c0: 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41  mit_hook ?CALLBA
97d0: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
97e0: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
97f0: 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66  allback just bef
9800: 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65  ore committing e
9810: 76 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63  very SQL transac
9820: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68  tion..  ** If th
9830: 65 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77  e callback throw
9840: 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f  s an exception o
9850: 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  r returns non-ze
9860: 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ro, then the.  *
9870: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
9880: 20 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41   aborted.  If CA
9890: 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70  LLBACK is an emp
98a0: 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63  ty string, the c
98b0: 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20  allback.  ** is 
98c0: 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20  disabled..  */. 
98d0: 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f   case DB_COMMIT_
98e0: 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20  HOOK: {.    if( 
98f0: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
9900: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
9910: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
9920: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
9930: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9940: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
9950: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
9960: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
9970: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
9980: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9990: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
99a0: 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20  ->zCommit, 0);. 
99b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
99c0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
99d0: 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74  ommit;.      int
99e0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
99f0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
9a00: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
9a10: 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a  (pDb->zCommit);.
9a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43        }.      zC
9a30: 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53  ommit = Tcl_GetS
9a40: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
9a50: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
9a60: 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26     if( zCommit &
9a70: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
9a80: 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
9a90: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
9aa0: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
9ab0: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d  memcpy(pDb->zCom
9ac0: 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65  mit, zCommit, le
9ad0: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
9ae0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
9af0: 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  zCommit = 0;.   
9b00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
9b10: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
9b20: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
9b30: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
9b40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d       sqlite3_com
9b50: 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  mit_hook(pDb->db
9b60: 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65  , DbCommitHandle
9b70: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
9b80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
9b90: 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
9ba0: 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  k(pDb->db, 0, 0)
9bb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9bd0: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70    /*    $db comp
9be0: 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20  lete SQL.  **.  
9bf0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
9c00: 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c  f SQL is a compl
9c10: 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
9c20: 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  t.  Return FALSE
9c30: 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f   if.  ** additio
9c40: 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70  nal lines of inp
9c50: 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20  ut are needed.  
9c60: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
9c70: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c  to the.  ** buil
9c80: 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c  t-in "info compl
9c90: 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20  ete" command of 
9ca0: 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  Tcl..  */.  case
9cb0: 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a   DB_COMPLETE: {.
9cc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9cd0: 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20  MIT_COMPLETE.   
9ce0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
9cf0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d  t;.    int isCom
9d00: 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f  plete;.    if( o
9d10: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
9d20: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
9d30: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
9d40: 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
9d50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9d60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f  ;.    }.    isCo
9d70: 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33  mplete = sqlite3
9d80: 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47  _complete( Tcl_G
9d90: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9da0: 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20  objv[2], 0) );. 
9db0: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
9dc0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
9dd0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
9de0: 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65  etBooleanObj(pRe
9df0: 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65  sult, isComplete
9e00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72  );.#endif.    br
9e10: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
9e20: 20 20 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c    $db copy confl
9e30: 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61  ict-algorithm ta
9e40: 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45  ble filename ?SE
9e50: 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
9e60: 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20  DICATOR?.  **.  
9e70: 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74  ** Copy data int
9e80: 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c  o table from fil
9e90: 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c  ename, optionall
9ea0: 79 20 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f  y using SEPARATO
9eb0: 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e  R.  ** as column
9ec0: 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66   separators.  If
9ed0: 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69   a column contai
9ee0: 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  ns a null string
9ef0: 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61  , or the.  ** va
9f00: 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43  lue of NULLINDIC
9f10: 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20  ATOR, a NULL is 
9f20: 69 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68 65  inserted for the
9f30: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f   column..  ** co
9f40: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
9f50: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   is one of the s
9f60: 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61  qlite conflict a
9f70: 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20  lgorithms:.  ** 
9f80: 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f     rollback, abo
9f90: 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65  rt, fail, ignore
9fa0: 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f  , replace.  ** O
9fb0: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
9fc0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9fd0: 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c  lines processed,
9fe0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
9ff0: 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64   same.  ** as 'd
a000: 62 20 63 68 61 6e 67 65 73 27 20 64 75 65 20 74  b changes' due t
a010: 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  o conflict-algor
a020: 69 74 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20  ithm selected.. 
a030: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
a040: 64 65 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20  de is basically 
a050: 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
a060: 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66  n/enhancement of
a070: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
a080: 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f  3 shell.c ".impo
a090: 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a  rt" command..  *
a0a0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
a0b0: 61 6e 64 20 75 73 61 67 65 20 69 73 20 65 71 75  and usage is equ
a0c0: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73  ivalent to the s
a0d0: 71 6c 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74  qlite2.x COPY st
a0e0: 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68  atement,.  ** wh
a0f0: 69 63 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65  ich imports file
a100: 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62   data into a tab
a110: 6c 65 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73  le using the Pos
a120: 74 67 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c  tgreSQL COPY fil
a130: 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20  e format:.  **  
a140: 20 24 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c   $db copy $confl
a150: 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e  it_algo $table_n
a160: 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74  ame $filename \t
a170: 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65   \\N.  */.  case
a180: 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20   DB_COPY: {.    
a190: 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20  char *zTable;   
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a1b0: 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
a1c0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
a1d0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20    char *zFile;  
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a1f0: 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77   The file from w
a200: 68 69 63 68 20 74 6f 20 65 78 74 72 61 63 74 20  hich to extract 
a210: 64 61 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72  data */.    char
a220: 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20   *zConflict;    
a230: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
a240: 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68  onflict algorith
a250: 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  m to use */.    
a260: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
a270: 74 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  tmt;        /* A
a280: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a290: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a2b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
a2c0: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
a2d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
a2e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a2f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a300: 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
a310: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
a320: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
a330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
a340: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
a350: 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a370: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
a380: 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20   in zSep[] */.  
a390: 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20    int nNull;    
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a3b0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
a3c0: 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20   in zNull[] */. 
a3d0: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a3f0: 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  * An SQL stateme
a400: 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
a410: 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  zLine;          
a420: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
a430: 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20  e line of input 
a440: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f  from the file */
a450: 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
a460: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a470: 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b   /* zLine[] brok
a480: 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d  en up into colum
a490: 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ns */.    char *
a4a0: 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20  zCommit;        
a4b0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
a4c0: 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a  commit changes *
a4d0: 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20  /.    FILE *in; 
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66    /* The input f
a500: 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ile */.    int l
a510: 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20  ineno = 0;      
a520: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
a530: 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66  umber of input f
a540: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
a550: 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20  zLineNum[80];   
a560: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
a570: 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66 66  umber print buff
a580: 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  er */.    Tcl_Ob
a590: 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20  j *pResult;     
a5a0: 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20        /* interp 
a5b0: 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63  result */..    c
a5c0: 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63  har *zSep;.    c
a5d0: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20  har *zNull;.    
a5e0: 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62  if( objc<5 || ob
a5f0: 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>7 ){.      Tc
a600: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
a610: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
a620: 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c  .         "CONFL
a630: 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41  ICT-ALGORITHM TA
a640: 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45  BLE FILENAME ?SE
a650: 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
a660: 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20  DICATOR?");.    
a670: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a680: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
a690: 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20  ( objc>=6 ){.   
a6a0: 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65     zSep = Tcl_Ge
a6b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
a6c0: 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[5], 0);.    
a6d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65  }else{.      zSe
a6e0: 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a  p = "\t";.    }.
a6f0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20      if( objc>=7 
a700: 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d  ){.      zNull =
a710: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a720: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30  omObj(objv[6], 0
a730: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a740: 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a      zNull = "";.
a750: 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c      }.    zConfl
a760: 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ict = Tcl_GetStr
a770: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
a780: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62  2], 0);.    zTab
a790: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
a7a0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
a7b0: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ], 0);.    zFile
a7c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
a7d0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c  FromObj(objv[4],
a7e0: 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20   0);.    nSep = 
a7f0: 73 74 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a  strlen30(zSep);.
a800: 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c      nNull = strl
a810: 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20  en30(zNull);.   
a820: 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
a830: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
a840: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
a850: 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73  rror: non-null s
a860: 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
a870: 64 20 66 6f 72 20 63 6f 70 79 22 2c 30 29 3b 0a  d for copy",0);.
a880: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
a890: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
a8a0: 20 20 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e    if(strcmp(zCon
a8b0: 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b  flict, "rollback
a8c0: 22 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20  ") != 0 &&.     
a8d0: 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
a8e0: 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20  ct, "abort"   ) 
a8f0: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
a900: 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
a910: 20 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20   "fail"    ) != 
a920: 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
a930: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69  mp(zConflict, "i
a940: 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26  gnore"  ) != 0 &
a950: 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28  &.       strcmp(
a960: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c  zConflict, "repl
a970: 61 63 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a  ace" ) != 0 ) {.
a980: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
a990: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a9a0: 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e  Error: \"", zCon
a9b0: 66 6c 69 63 74 2c 20 0a 20 20 20 20 20 20 20 20  flict, .        
a9c0: 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63      "\", conflic
a9d0: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74  t-algorithm must
a9e0: 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c   be one of: roll
a9f0: 62 61 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20  back, ".        
aa00: 20 20 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c      "abort, fail
aa10: 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70  , ignore, or rep
aa20: 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  lace", 0);.     
aa30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
aa40: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
aa50: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
aa60: 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
aa70: 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65  OM '%q'", zTable
aa80: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
aa90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
aaa0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
aab0: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20  erp, "Error: no 
aac0: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a  such table: ", z
aad0: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
aae0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
aaf0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  R;.    }.    nBy
ab00: 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53  te = strlen30(zS
ab10: 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ql);.    rc = sq
ab20: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
ab30: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
ab40: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
ab50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
ab60: 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
ab70: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
ab80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ab90: 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  , "Error: ", sql
aba0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
abb0: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
abc0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  nCol = 0;.    }e
abd0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20  lse{.      nCol 
abe0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
abf0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
ac00: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ac10: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
ac20: 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d  ;.    if( nCol==
ac30: 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  0 ) {.      retu
ac40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ac50: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d    }.    zSql = m
ac60: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35  alloc( nByte + 5
ac70: 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20  0 + nCol*2 );.  
ac80: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
ac90: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
aca0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
acb0: 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d   "Error: can't m
acc0: 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20  alloc()", 0);.  
acd0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ace0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
acf0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ad00: 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c 2c  (nByte+50, zSql,
ad10: 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20 49   "INSERT OR %q I
ad20: 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28  NTO '%q' VALUES(
ad30: 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43 6f  ?",.         zCo
ad40: 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29 3b  nflict, zTable);
ad50: 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33  .    j = strlen3
ad60: 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72  0(zSql);.    for
ad70: 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=1; i<nCol; i+
ad80: 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  +){.      zSql[j
ad90: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
ada0: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27   zSql[j++] = '?'
adb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
adc0: 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [j++] = ')';.   
add0: 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zSql[j] = 0;.  
ade0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
adf0: 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20  repare(pDb->db, 
ae00: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
ae10: 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  , 0);.    free(z
ae20: 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
ae30: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
ae40: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ae50: 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  p, "Error: ", sq
ae60: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
ae70: 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
ae80: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
ae90: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
aea0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
aeb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
aec0: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72   fopen(zFile, "r
aed0: 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  b");.    if( in=
aee0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
aef0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
af00: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
af10: 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22  not open file: "
af20: 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  , zFile, NULL);.
af30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
af40: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
af50: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
af60: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
af70: 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28   azCol = malloc(
af80: 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d   sizeof(azCol[0]
af90: 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20  )*(nCol+1) );.  
afa0: 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29    if( azCol==0 )
afb0: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
afc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
afd0: 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20  , "Error: can't 
afe0: 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20  malloc()", 0);. 
aff0: 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b       fclose(in);
b000: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
b010: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
b020: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
b030: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22  _exec(pDb->db, "
b040: 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29  BEGIN", 0, 0, 0)
b050: 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20  ;.    zCommit = 
b060: 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68  "COMMIT";.    wh
b070: 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f  ile( (zLine = lo
b080: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69  cal_getline(0, i
b090: 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n))!=0 ){.      
b0a0: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69  char *z;.      i
b0b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65   = 0;.      line
b0c0: 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f  no++;.      azCo
b0d0: 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20  l[0] = zLine;.  
b0e0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a      for(i=0, z=z
b0f0: 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  Line; *z; z++){.
b100: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d          if( *z==
b110: 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63  zSep[0] && strnc
b120: 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70  mp(z, zSep, nSep
b130: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
b140: 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20    *z = 0;.      
b150: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
b160: 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b     if( i<nCol ){
b170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43  .            azC
b180: 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d  ol[i] = &z[nSep]
b190: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  ;.            z 
b1a0: 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20  += nSep-1;.     
b1b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
b1c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b1d0: 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a  f( i+1!=nCol ){.
b1e0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45          char *zE
b1f0: 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rr;.        int 
b200: 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 33 30 28  nErr = strlen30(
b210: 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20  zFile) + 200;.  
b220: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c        zErr = mal
b230: 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20  loc(nErr);.     
b240: 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20     if( zErr ){. 
b250: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b260: 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20  _snprintf(nErr, 
b270: 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  zErr,.          
b280: 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69     "Error: %s li
b290: 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20  ne %d: expected 
b2a0: 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  %d columns of da
b2b0: 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22  ta but found %d"
b2c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  ,.             z
b2d0: 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43  File, lineno, nC
b2e0: 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  ol, i+1);.      
b2f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b300: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
b310: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
b320: 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20   free(zErr);.   
b330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
b340: 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41  Commit = "ROLLBA
b350: 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  CK";.        bre
b360: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b370: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
b380: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
b390: 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75   /* check for nu
b3a0: 6c 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20  ll data, if so, 
b3b0: 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a  bind as null */.
b3c0: 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 4e 75          if( (nNu
b3d0: 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61  ll>0 && strcmp(a
b3e0: 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d  zCol[i], zNull)=
b3f0: 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  =0).          ||
b400: 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b   strlen30(azCol[
b410: 69 5d 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  i])==0 .        
b420: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b430: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
b440: 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20  Stmt, i+1);.    
b450: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b460: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
b470: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b  d_text(pStmt, i+
b480: 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c  1, azCol[i], -1,
b490: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
b4a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b4b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b4c0: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
b4d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b4e0: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
b4f0: 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29       free(zLine)
b500: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
b510: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b520: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
b530: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
b540: 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
b550: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
b560: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f   0);.        zCo
b570: 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
b580: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
b590: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b5a0: 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b      free(azCol);
b5b0: 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
b5c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
b5d0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
b5e0: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
b5f0: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43  exec(pDb->db, zC
b600: 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ommit, 0, 0, 0);
b610: 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69  ..    if( zCommi
b620: 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20  t[0] == 'C' ){. 
b630: 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c       /* success,
b640: 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e   set result as n
b650: 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70  umber of lines p
b660: 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
b670: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
b680: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
b690: 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  erp);.      Tcl_
b6a0: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
b6b0: 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  t, lineno);.    
b6c0: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
b6d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b6e0: 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65  /* failure, appe
b6f0: 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20  nd lineno where 
b700: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
b710: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
b720: 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d  (sizeof(zLineNum
b730: 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22  ), zLineNum,"%d"
b740: 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  ,lineno);.      
b750: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b760: 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65  (interp,", faile
b770: 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  d while processi
b780: 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65  ng line: ",zLine
b790: 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63  Num,0);.      rc
b7a0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
b7b0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
b7c0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
b7d0: 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64   $db enable_load
b7e0: 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45  _extension BOOLE
b7f0: 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72  AN.  **.  ** Tur
b800: 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  n the extension 
b810: 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65 20  loading feature 
b820: 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69  on or off.  It i
b830: 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65  f off by.  ** de
b840: 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61  fault..  */.  ca
b850: 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41  se DB_ENABLE_LOA
b860: 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23  D_EXTENSION: {.#
b870: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b880: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
b890: 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b  N.    int onoff;
b8a0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
b8b0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
b8c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
b8d0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f  p, 2, objv, "BOO
b8e0: 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65  LEAN");.      re
b8f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b900: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63      }.    if( Tc
b910: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
b920: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
b930: 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a  [2], &onoff) ){.
b940: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
b950: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
b960: 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
b970: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
b980: 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b  pDb->db, onoff);
b990: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73  .    break;.#els
b9a0: 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  e.    Tcl_Append
b9b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b9c0: 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e  extension loadin
b9d0: 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20  g is turned off 
b9e0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22  at compile-time"
b9f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ba00: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 72         0);.    r
ba10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ba20: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
ba30: 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72  *.  **    $db er
ba40: 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a  rorcode.  **.  *
ba50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
ba60: 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20  eric error code 
ba70: 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65  that was returne
ba80: 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  d by the most re
ba90: 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74  cent.  ** call t
baa0: 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  o sqlite3_exec()
bab0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
bac0: 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20  _ERRORCODE: {.  
bad0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
bae0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
baf0: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
bb00: 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
bb10: 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  )));.    break;.
bb20: 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a    }.   .  /*.  *
bb30: 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73  *    $db eval $s
bb40: 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e  ql ?array? ?{  .
bb50: 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a  ..code... }?.  *
bb60: 2a 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75  *    $db onecolu
bb70: 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a  mn $sql.  **.  *
bb80: 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * The SQL statem
bb90: 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65  ent in $sql is e
bba0: 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65  valuated.  For e
bbb0: 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c  ach row, the val
bbc0: 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61  ues are.  ** pla
bbd0: 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20  ced in elements 
bbe0: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d  of the array nam
bbf0: 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e  ed "array" and .
bc00: 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65  ..code... is exe
bc10: 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22  cuted..  ** If "
bc20: 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65  array" and "code
bc30: 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74  " are omitted, t
bc40: 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20  hen no callback 
bc50: 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64  is every invoked
bc60: 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
bc70: 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  " is an empty st
bc80: 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76  ring, then the v
bc90: 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64  alues are placed
bca0: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20   in variables.  
bcb0: 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65  ** that have the
bcc0: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
bcd0: 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74  e fields extract
bce0: 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e  ed by the query.
bcf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f  .  **.  ** The o
bd00: 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20  necolumn method 
bd10: 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  is the equivalen
bd20: 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c  t of:.  **     l
bd30: 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20  index [$db eval 
bd40: 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63  $sql] 0.  */.  c
bd50: 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
bd60: 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c  :.  case DB_EVAL
bd70: 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53  :.  case DB_EXIS
bd80: 54 53 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 63  TS: {.    char c
bd90: 6f 6e 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20  onst *zSql;     
bda0: 20 2f 2a 20 4e 65 78 74 20 53 51 4c 20 73 74 61   /* Next SQL sta
bdb0: 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
bdc0: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  e */.    char co
bdd0: 6e 73 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20  nst *zLeft;     
bde0: 2f 2a 20 57 68 61 74 20 69 73 20 6c 65 66 74 20  /* What is left 
bdf0: 61 66 74 65 72 20 66 69 72 73 74 20 73 74 6d 74  after first stmt
be00: 20 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20   in zSql */.    
be10: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
be20: 74 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c  tmt;   /* Compil
be30: 65 64 20 53 51 4c 20 73 74 61 74 6d 65 6e 74 20  ed SQL statment 
be40: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
be50: 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 2f 2a  pArray;       /*
be60: 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 69   Name of array i
be70: 6e 74 6f 20 77 68 69 63 68 20 72 65 73 75 6c 74  nto which result
be80: 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 2a 2f  s are written */
be90: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
bea0: 63 72 69 70 74 3b 20 20 20 20 20 20 2f 2a 20 53  cript;      /* S
beb0: 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72  cript to run for
bec0: 20 65 61 63 68 20 72 65 73 75 6c 74 20 73 65 74   each result set
bed0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
bee0: 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20 20 20 2f  **apParm;      /
bef0: 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 68 61  * Parameters tha
bf00: 74 20 6e 65 65 64 20 61 20 54 63 6c 5f 44 65 63  t need a Tcl_Dec
bf10: 72 52 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20  rRefCount() */. 
bf20: 20 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20     int nParm;   
bf30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
bf40: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 75  ber of entries u
bf50: 73 65 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20  sed in apParm[] 
bf60: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
bf70: 61 50 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a  aParm[10];    /*
bf80: 20 53 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   Static space fo
bf90: 72 20 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68  r apParm[] in th
bfa0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
bfb0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
bfc0: 65 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56  et;         /* V
bfd0: 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
bfe0: 6e 65 64 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72  ned */.    SqlPr
bff0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
c000: 53 74 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  Stmt;  /* Pointe
c010: 72 20 74 6f 20 61 20 70 72 65 70 61 72 65 64 20  r to a prepared 
c020: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
c030: 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 69   int rc2;..    i
c040: 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56  f( choice==DB_EV
c050: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
c060: 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35  objc<3 || objc>5
c070: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
c080: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
c090: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
c0a0: 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20  QL ?ARRAY-NAME? 
c0b0: 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
c0c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c0d0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
c0e0: 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e      pRet = Tcl_N
c0f0: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
c100: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c110: 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRet);.    }else
c120: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
c130: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
c140: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
c150: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
c160: 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 20   "SQL");.       
c170: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c180: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
c190: 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
c1a0: 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20  EXISTS ){.      
c1b0: 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
c1c0: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 30 29 3b 0a 20  BooleanObj(0);. 
c1d0: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
c1e0: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
c1f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c200: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
c210: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
c220: 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
c230: 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 53       pArray = pS
c240: 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d  cript = 0;.    }
c250: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
c260: 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79   ){.      pArray
c270: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72   = 0;.      pScr
c280: 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ipt = objv[3];. 
c290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c2a0: 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d  pArray = objv[3]
c2b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
c2c0: 47 65 74 53 74 72 69 6e 67 28 70 41 72 72 61 79  GetString(pArray
c2d0: 29 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72 61 79  )[0]==0 ) pArray
c2e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72   = 0;.      pScr
c2f0: 69 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20  ipt = objv[4];. 
c300: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e     }..    Tcl_In
c310: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b  crRefCount(objv[
c320: 32 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  2]);.    zSql = 
c330: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
c340: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
c350: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
c360: 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b  =TCL_OK && zSql[
c370: 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
c380: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c390: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c3a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
c3b0: 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
c3c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c3d0: 6d 62 65 72 20 6f 66 20 62 69 6e 64 20 70 61 72  mber of bind par
c3e0: 61 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20 70  ameters in the p
c3f0: 53 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  Stmt */.      in
c400: 74 20 6e 43 6f 6c 20 3d 20 2d 31 3b 20 20 20 20  t nCol = -1;    
c410: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c420: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
c430: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
c440: 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  */.      Tcl_Obj
c450: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30   **apColName = 0
c460: 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  ;   /* Array of 
c470: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
c480: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20        int len;  
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67 74   /* String lengt
c4b0: 68 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a  h of zSql */.  .
c4c0: 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
c4d0: 66 69 6e 64 20 61 20 53 51 4c 20 73 74 61 74 65  find a SQL state
c4e0: 6d 65 6e 74 20 74 68 61 74 20 68 61 73 20 61 6c  ment that has al
c4f0: 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 69  ready been compi
c500: 6c 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  led and.      **
c510: 20 77 68 69 63 68 20 6d 61 74 63 68 65 73 20 74   which matches t
c520: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 63 65  he next sequence
c530: 20 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a   of SQL..      *
c540: 2f 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20  /.      pStmt = 
c550: 30 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73  0;.      len = s
c560: 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
c570: 20 20 20 20 20 66 6f 72 28 70 50 72 65 53 74 6d       for(pPreStm
c580: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
c590: 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72  t; pPreStmt; pPr
c5a0: 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e  eStmt=pPreStmt->
c5b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
c5c0: 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74  int n = pPreStmt
c5d0: 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  ->nSql;.        
c5e0: 69 66 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20  if( len>=n .    
c5f0: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
c600: 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c  p(pPreStmt->zSql
c610: 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20  , zSql, n)==0.  
c620: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 7a 53            && (zS
c630: 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c  ql[n]==0 || zSql
c640: 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20  [n-1]==';').    
c650: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
c660: 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d   pStmt = pPreStm
c670: 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20  t->pStmt;.      
c680: 20 20 20 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71      zLeft = &zSq
c690: 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  l[pPreStmt->nSql
c6a0: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ];..          /*
c6b0: 20 57 68 65 6e 20 61 20 70 72 65 70 61 72 65 64   When a prepared
c6c0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f   statement is fo
c6d0: 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66  und, unlink it f
c6e0: 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20  rom the.        
c6f0: 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e    ** cache list.
c700: 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20    It will later 
c710: 62 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f  be added back to
c720: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
c730: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74           ** of t
c740: 68 65 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e  he cache list in
c750: 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
c760: 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d  ent LRU replacem
c770: 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
c780: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
c790: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
c7a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
c7b0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e  PreStmt->pPrev->
c7c0: 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74  pNext = pPreStmt
c7d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
c7e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c7f0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
c800: 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ist = pPreStmt->
c810: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
c820: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
c830: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
c840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c850: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d  pPreStmt->pNext-
c860: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
c870: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
c880: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c890: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
c8a0: 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Last = pPreStmt-
c8b0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  >pPrev;.        
c8c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44    }.          pD
c8d0: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
c8e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c8f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c900: 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f   .      /* If no
c910: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
c920: 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  ent was found.  
c930: 43 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20  Compile the SQL 
c940: 74 65 78 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  text.      */.  
c950: 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30      if( pStmt==0
c960: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c970: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
c980: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 44  e3_prepare_v2(pD
c990: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
c9a0: 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29   &pStmt, &zLeft)
c9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
c9c0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
c9d0: 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
c9e0: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
c9f0: 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  g(pDb->db)));.  
ca00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
ca10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
ca20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ca30: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
ca40: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
ca50: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
ca60: 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
ca70: 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a  ode(pDb->db) ){.
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ca90: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72   compile-time er
caa0: 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65  ror in the state
cab0: 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  ment.           
cac0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
cad0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
cae0: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
caf0: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  oObj(sqlite3_err
cb00: 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  msg(pDb->db)));.
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
cb20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
cb30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cb40: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cb60: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  he statement was
cb70: 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69   a no-op.  Conti
cb80: 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nue to the next 
cb90: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
cba0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
cbb0: 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  SQL string..    
cbc0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
cbd0: 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c         zSql = zL
cbe0: 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
cbf0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
cc00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
cc10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cc20: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a   pPreStmt==0 );.
cc30: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
cc40: 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74 6f  * Bind values to
cc50: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
cc60: 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f 72   begin with $ or
cc70: 20 3a 0a 20 20 20 20 20 20 2a 2f 20 20 0a 20 20   :.      */  .  
cc80: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
cc90: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
cca0: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
ccb0: 20 20 20 20 20 20 6e 50 61 72 6d 20 3d 20 30 3b        nParm = 0;
ccc0: 0a 20 20 20 20 20 20 69 66 28 20 6e 56 61 72 3e  .      if( nVar>
ccd0: 73 69 7a 65 6f 66 28 61 50 61 72 6d 29 2f 73 69  sizeof(aParm)/si
cce0: 7a 65 6f 66 28 61 50 61 72 6d 5b 30 5d 29 20 29  zeof(aParm[0]) )
ccf0: 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d  {.        apParm
cd00: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63   = (Tcl_Obj**)Tc
cd10: 6c 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a 73 69 7a  l_Alloc(nVar*siz
cd20: 65 6f 66 28 61 70 50 61 72 6d 5b 30 5d 29 29 3b  eof(apParm[0]));
cd30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cd40: 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 61        apParm = a
cd50: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Parm;.      }.  
cd60: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
cd70: 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVar; i++){.    
cd80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cd90: 7a 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  zVar = sqlite3_b
cda0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
cdb0: 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  me(pStmt, i);.  
cdc0: 20 20 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d        if( zVar!=
cdd0: 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27  0 && (zVar[0]=='
cde0: 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27  $' || zVar[0]=='
cdf0: 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27  :' || zVar[0]=='
ce00: 40 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  @') ){.         
ce10: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d   Tcl_Obj *pVar =
ce20: 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
ce30: 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c  nterp, &zVar[1],
ce40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
ce50: 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20    if( pVar ){.  
ce60: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b            int n;
ce70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
ce80: 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20  *data;.         
ce90: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d     char *zType =
cea0: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f   pVar->typePtr ?
ceb0: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e   pVar->typePtr->
cec0: 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20  name : "";.     
ced0: 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
cee0: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20  zType[0];.      
cef0: 20 20 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30        if( zVar[0
cf00: 5d 3d 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20 20  ]=='@' ||.      
cf10: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 62 27           (c=='b'
cf20: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
cf30: 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30  ,"bytearray")==0
cf40: 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d   && pVar->bytes=
cf50: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
cf60: 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42       /* Load a B
cf70: 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20  LOB type if the 
cf80: 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  Tcl variable is 
cf90: 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a  a bytearray and.
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
cfb0: 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e   it has no strin
cfc0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
cfd0: 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20   or the host.   
cfe0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61             ** pa
cff0: 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 62 65 67  rameter name beg
d000: 69 6e 73 20 77 69 74 68 20 22 40 22 2e 20 2a 2f  ins with "@". */
d010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
d020: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
d030: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
d040: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
d050: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
d060: 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
d070: 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  i, data, n, SQLI
d080: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
d090: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
d0a0: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
d0b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d0c0: 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20  apParm[nParm++] 
d0d0: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
d0e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
d0f0: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
d100: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
d110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
d120: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
d130: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
d140: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
d150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
d160: 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69  ind_int(pStmt, i
d170: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
d180: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
d190: 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  d' && strcmp(zTy
d1a0: 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  pe,"double")==0 
d1b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d1c0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20   double r;.     
d1d0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
d1e0: 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  DoubleFromObj(in
d1f0: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b  terp, pVar, &r);
d200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
d210: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
d220: 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b  le(pStmt, i, r);
d230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
d240: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
d250: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
d260: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
d270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d280: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
d290: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
d2a0: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
d2b0: 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49         Tcl_WideI
d2c0: 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20  nt v;.          
d2d0: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
d2e0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
d2f0: 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20  , pVar, &v);.   
d300: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d310: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
d320: 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20  tmt, i, v);.    
d330: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d350: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
d360: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
d370: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
d380: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
d390: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
d3a0: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28  text(pStmt, i, (
d3b0: 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20  char *)data, n, 
d3c0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
d3e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
d3f0: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
d400: 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d      apParm[nParm
d410: 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20  ++] = pVar;.    
d420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d430: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
d450: 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74 2c  ind_null( pStmt,
d460: 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   i );.          
d470: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
d480: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78    }..      /* Ex
d490: 65 63 75 74 65 20 74 68 65 20 53 51 4c 0a 20 20  ecute the SQL.  
d4a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69      */.      whi
d4b0: 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26  le( rc==TCL_OK &
d4c0: 26 20 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54  & pStmt && SQLIT
d4d0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
d4e0: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 0a 09  tep(pStmt) ){...
d4f0: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d  /* Compute colum
d500: 6e 20 6e 61 6d 65 73 2e 20 54 68 69 73 20 6d 75  n names. This mu
d510: 73 74 20 62 65 20 64 6f 6e 65 20 61 66 74 65 72  st be done after
d520: 20 74 68 65 20 66 69 72 73 74 20 73 75 63 63 65   the first succe
d530: 73 73 66 75 6c 0a 09 2a 2a 20 63 61 6c 6c 20 74  ssful..** call t
d540: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
d550: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 71 75  , in case the qu
d560: 65 72 79 20 69 73 20 72 65 63 6f 6d 70 69 6c 65  ery is recompile
d570: 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  d and the.      
d580: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 72 20 6e    ** number or n
d590: 61 6d 65 73 20 6f 66 20 74 68 65 20 72 65 74 75  ames of the retu
d5a0: 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 63 68 61  rned columns cha
d5b0: 6e 67 65 73 2e 20 0a 20 20 20 20 20 20 20 20 2a  nges. .        *
d5c0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
d5d0: 28 21 70 41 72 72 61 79 7c 7c 70 53 63 72 69 70  (!pArray||pScrip
d5e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  t);.        if (
d5f0: 6e 43 6f 6c 20 3c 20 30 29 20 7b 0a 20 20 20 20  nCol < 0) {.    
d600: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a        Tcl_Obj **
d610: 2a 61 70 20 3d 20 28 70 53 63 72 69 70 74 3f 26  *ap = (pScript?&
d620: 61 70 43 6f 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20  apColName:0);.  
d630: 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 63          nCol = c
d640: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  omputeColumnName
d650: 73 28 69 6e 74 65 72 70 2c 20 70 53 74 6d 74 2c  s(interp, pStmt,
d660: 20 61 70 2c 20 70 41 72 72 61 79 29 3b 0a 20 20   ap, pArray);.  
d670: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
d680: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
d690: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d6a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
d6b0: 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
d6c0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61        /* Set pVa
d6d0: 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  l to contain the
d6e0: 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i'th column of 
d6f0: 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20  this row. */.   
d700: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
d710: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
d720: 70 65 28 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a  pe(pStmt, i) ){.
d730: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
d740: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d760: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
d770: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
d780: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
d790: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
d7a0: 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69  ar *zBlob = sqli
d7b0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
d7c0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
d7d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 42           if( !zB
d7e0: 6c 6f 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b  lob ) bytes = 0;
d7f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
d800: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  Val = Tcl_NewByt
d810: 65 41 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a  eArrayObj((u8*)z
d820: 42 6c 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20  Blob, bytes);.  
d830: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
d840: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
d850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
d860: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
d870: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
d880: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76    sqlite_int64 v
d890: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
d8a0: 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  n_int64(pStmt, i
d8b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d8c0: 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33   if( v>=-2147483
d8d0: 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38  647 && v<=214748
d8e0: 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20  3647 ){.        
d8f0: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
d900: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b  cl_NewIntObj(v);
d910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
d920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d930: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
d940: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76  _NewWideIntObj(v
d950: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d960: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
d970: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d980: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d990: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
d9a0: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  OAT: {.         
d9b0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
d9c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
d9d0: 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b  ouble(pStmt, i);
d9e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
d9f0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75  Val = Tcl_NewDou
da00: 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20  bleObj(r);.     
da10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
da20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
da30: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
da40: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
da50: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
da60: 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70   = dbTextToObj(p
da70: 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20  Db->zNull);.    
da80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
da90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
daa0: 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75             defau
dab0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lt: {.          
dac0: 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78      pVal = dbTex
dad0: 74 54 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73  tToObj((char *)s
dae0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
daf0: 78 74 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20  xt(pStmt, i));. 
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
db10: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
db20: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
db30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
db40: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
db50: 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79        if( pArray
db60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
db70: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
db80: 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f  ar2(interp, apCo
db90: 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61  lName[i], 0, pVa
dba0: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
dbb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dbc0: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53          Tcl_ObjS
dbd0: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
dbe0: 41 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65  Array, apColName
dbf0: 5b 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20  [i], pVal, 0);. 
dc00: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
dc10: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
dc20: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43   choice==DB_ONEC
dc30: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
dc40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
dc50: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
dc60: 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20      if( pRet==0 
dc70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
dc80: 20 70 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20   pRet = pVal;.  
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
dca0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
dcb0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
dcc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  }.            rc
dcd0: 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20   = TCL_BREAK;.  
dce0: 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43            i = nC
dcf0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ol;.          }e
dd00: 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d  lse if( choice==
dd10: 44 42 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20  DB_EXISTS ){.   
dd20: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63           Tcl_Dec
dd30: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
dd40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65  .            pRe
dd50: 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  t = Tcl_NewBoole
dd60: 61 6e 4f 62 6a 28 31 29 3b 0a 20 20 20 20 20 20  anObj(1);.      
dd70: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
dd80: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
dd90: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
dda0: 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20  CL_BREAK;.      
ddb0: 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a        i = nCol;.
ddc0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
ddd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
dde0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ddf0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
de00: 65 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20  et, pVal);.     
de10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
de20: 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  .  .        if( 
de30: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
de40: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20       pDb->nStep 
de50: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
de60: 74 61 74 75 73 28 70 53 74 6d 74 2c 20 0a 20 20  tatus(pStmt, .  
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
dea0: 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c  S_FULLSCAN_STEP,
deb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
dec0: 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69  Db->nSort = sqli
ded0: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
dee0: 70 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 20 20  pStmt,.         
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
df10: 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
df20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   0);.          r
df30: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
df40: 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  x(interp, pScrip
df50: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
df60: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e   if( rc==TCL_CON
df70: 54 49 4e 55 45 20 29 7b 0a 20 20 20 20 20 20 20  TINUE ){.       
df80: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
df90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dfa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dfb0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
dfc0: 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
dfd0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
dfe0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
dff0: 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6c 75 6d  * Free the colum
e000: 6e 20 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a  n name objects *
e010: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72  /.      if( pScr
e020: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ipt ){.        /
e030: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 72  * If the query r
e040: 65 74 75 72 6e 65 64 20 6e 6f 20 72 6f 77 73 2c  eturned no rows,
e050: 20 62 75 74 20 61 6e 20 61 72 72 61 79 20 76 61   but an array va
e060: 72 69 61 62 6c 65 20 77 61 73 20 0a 20 20 20 20  riable was .    
e070: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
e080: 2c 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 43 6f  , call computeCo
e090: 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 6e 6f 77 20  lumnNames() now 
e0a0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
e0b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 72 61  .        ** arra
e0c0: 79 6e 61 6d 65 28 2a 29 20 76 61 72 69 61 62 6c  yname(*) variabl
e0d0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
e0e0: 20 20 20 20 20 20 69 66 20 28 70 41 72 72 61 79        if (pArray
e0f0: 20 26 26 20 6e 43 6f 6c 20 3c 20 30 29 20 7b 0a   && nCol < 0) {.
e100: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
e110: 6a 20 2a 2a 2a 61 70 20 3d 20 28 70 53 63 72 69  j ***ap = (pScri
e120: 70 74 3f 26 61 70 43 6f 6c 4e 61 6d 65 3a 30 29  pt?&apColName:0)
e130: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c  ;.          nCol
e140: 20 3d 20 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e   = computeColumn
e150: 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20 70 53  Names(interp, pS
e160: 74 6d 74 2c 20 61 70 2c 20 70 41 72 72 61 79 29  tmt, ap, pArray)
e170: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e180: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e190: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
e1a0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
e1b0: 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b  Count(apColName[
e1c0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
e1d0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
e1e0: 28 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65  (char*)apColName
e1f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
e200: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f    /* Free the bo
e210: 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62  und string and b
e220: 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a  lob parameters *
e230: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
e240: 20 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nParm; i++){.
e250: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
e260: 52 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b  RefCount(apParm[
e270: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
e280: 20 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61     if( apParm!=a
e290: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
e2a0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
e2b0: 61 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  apParm);.      }
e2c0: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
e2d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
e2e0: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63   If the result c
e2f0: 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43  ode is SQLITE_SC
e300: 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20  HEMA, then.     
e310: 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74   ** flush the st
e320: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e  atement cache an
e330: 64 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d  d try the statem
e340: 65 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20  ent again..     
e350: 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20   */.      rc2 = 
e360: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
e370: 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  tmt);.      pDb-
e380: 3e 6e 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33  >nStep = sqlite3
e390: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
e3a0: 6d 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  mt, .           
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
e3d0: 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
e3e0: 4e 5f 53 54 45 50 2c 20 31 29 3b 0a 20 20 20 20  N_STEP, 1);.    
e3f0: 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73    pDb->nSort = s
e400: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
e410: 75 73 28 70 53 74 6d 74 2c 0a 20 20 20 20 20 20  us(pStmt,.      
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e440: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
e450: 52 54 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  RT, 1);.      if
e460: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 32  ( SQLITE_OK!=rc2
e470: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
e480: 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  f a run-time err
e490: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f 72  or occurs, repor
e4a0: 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64 20  t the error and 
e4b0: 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20 20  stop reading.   
e4c0: 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 0a       ** the SQL.
e4d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
e4e0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
e4f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
e500: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
e510: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29  errmsg(pDb->db))
e520: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e530: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
e540: 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
e550: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e560: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
e570: 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61   ) Tcl_Free((cha
e580: 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  r*)pPreStmt);.  
e590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e5a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 62     }else if( pDb
e5b0: 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 29 7b 0a  ->maxStmt<=0 ){.
e5c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
e5d0: 65 20 63 61 63 68 65 20 69 73 20 74 75 72 6e 65  e cache is turne
e5e0: 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74  d off, deallocat
e5f0: 65 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ed the statement
e600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
e610: 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46  pPreStmt ) Tcl_F
e620: 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65 53  ree((char*)pPreS
e630: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tmt);.        sq
e640: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
e650: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Stmt);.      }el
e660: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
e670: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
e680: 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 69   and the cache i
e690: 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c 2e 0a 20  s operational.. 
e6a0: 20 20 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65         ** Create
e6b0: 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72   a new SqlPrepar
e6c0: 65 64 53 74 6d 74 20 73 74 72 75 63 74 75 72 65  edStmt structure
e6d0: 20 69 66 20 77 65 20 6e 65 65 64 20 6f 6e 65 2e   if we need one.
e6e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 49 66 20  .        ** (If 
e6f0: 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
e700: 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75 73 74 20  one we can just 
e710: 72 65 75 73 65 20 69 74 2e 29 0a 20 20 20 20 20  reuse it.).     
e720: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
e730: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b  ( pPreStmt==0 ){
e740: 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  .          len =
e750: 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c 3b 0a 20   zLeft - zSql;. 
e760: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
e770: 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64  t = (SqlPrepared
e780: 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Stmt*)Tcl_Alloc(
e790: 20 73 69 7a 65 6f 66 28 2a 70 50 72 65 53 74 6d   sizeof(*pPreStm
e7a0: 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
e7b0: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
e7c0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e7d0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OR;.          pP
e7e0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20  reStmt->pStmt = 
e7f0: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20  pStmt;.         
e800: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20   pPreStmt->nSql 
e810: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  = len;.         
e820: 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20   pPreStmt->zSql 
e830: 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
e840: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
e850: 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30  assert( strlen30
e860: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29  (pPreStmt->zSql)
e870: 3d 3d 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  ==len );.       
e880: 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65     assert( 0==me
e890: 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a  mcmp(pPreStmt->z
e8a0: 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e 29 20  Sql, zSql, len) 
e8b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
e8c0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
e8d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
e8e0: 65 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ent to the begin
e8f0: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68  ning of the cach
e900: 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 2a  e list.        *
e910: 2f 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74  /.        pPreSt
e920: 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  mt->pNext = pDb-
e930: 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20  >stmtList;.     
e940: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
e950: 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
e960: 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  if( pDb->stmtLis
e970: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 44  t ){.         pD
e980: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72  b->stmtList->pPr
e990: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  ev = pPreStmt;. 
e9a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e9b0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
e9c0: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
e9d0: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
e9e0: 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
e9f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
ea00: 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->nStmt==0 );.  
ea10: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
ea20: 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tLast = pPreStmt
ea30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ea40: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
ea50: 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20  t( pDb->nStmt>0 
ea60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ea70: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b       pDb->nStmt+
ea80: 2b 3b 0a 20 20 20 0a 20 20 20 20 20 20 20 20 2f  +;.   .        /
ea90: 2a 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f  * If we have too
eaa0: 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20   many statement 
eab0: 69 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65  in cache, remove
eac0: 20 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f   the surplus fro
ead0: 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  m the.        **
eae0: 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68   end of the cach
eaf0: 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  e list..        
eb00: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
eb10: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62  ( pDb->nStmt>pDb
eb20: 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20  ->maxStmt ){.   
eb30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
eb40: 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d  inalize(pDb->stm
eb50: 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  tLast->pStmt);. 
eb60: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
eb70: 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74  mtLast = pDb->st
eb80: 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20  mtLast->pPrev;. 
eb90: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65           Tcl_Fre
eba0: 65 28 28 63 68 61 72 2a 29 70 44 62 2d 3e 73 74  e((char*)pDb->st
ebb0: 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a  mtLast->pNext);.
ebc0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
ebd0: 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d  tmtLast->pNext =
ebe0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44   0;.          pD
ebf0: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
ec00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
ec10: 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 65 64 20       /* Proceed 
ec20: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
ec30: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
ec40: 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20  Sql = zLeft;.   
ec50: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
ec60: 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29  efCount(objv[2])
ec70: 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  ;..    if( pRet 
ec80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
ec90: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
eca0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
ecb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
ecc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ecd0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
ece0: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c  t(pRet);.    }el
ecf0: 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f  se if( rc==TCL_O
ed00: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 52  K ){.      Tcl_R
ed10: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
ed20: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  p);.    }.    br
ed30: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
ed40: 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63   **     $db func
ed50: 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63  tion NAME [-argc
ed60: 6f 75 6e 74 20 4e 5d 20 53 43 52 49 50 54 0a 20  ount N] SCRIPT. 
ed70: 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
ed80: 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69  a new SQL functi
ed90: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
eda0: 20 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66   Whenever that f
edb0: 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  unction is.  ** 
edc0: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
edd0: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
ede0: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
edf0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46    */.  case DB_F
ee00: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53  UNCTION: {.    S
ee10: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  qlFunc *pFunc;. 
ee20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72     Tcl_Obj *pScr
ee30: 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ipt;.    char *z
ee40: 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41  Name;.    int nA
ee50: 72 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  rg = -1;.    if(
ee60: 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20   objc==6 ){.    
ee70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
ee80: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
ee90: 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20  objv[3]);.      
eea0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
eeb0: 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  (z);.      if( n
eec0: 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c  >2 && strncmp(z,
eed0: 20 22 2d 61 72 67 63 6f 75 6e 74 22 2c 6e 29 3d   "-argcount",n)=
eee0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
eef0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
ef00: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
ef10: 5b 34 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65  [4], &nArg) ) re
ef20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ef30: 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
ef40: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
ef50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ef60: 28 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72  (interp, "number
ef70: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75   of arguments mu
ef80: 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  st be non-negati
ef90: 76 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ve",.           
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
efc0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
efd0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
efe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
eff0: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 35 5d  Script = objv[5]
f000: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f010: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
f020: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f030: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
f040: 76 2c 20 22 4e 41 4d 45 20 5b 2d 61 72 67 63 6f  v, "NAME [-argco
f050: 75 6e 74 20 4e 5d 20 53 43 52 49 50 54 22 29 3b  unt N] SCRIPT");
f060: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f070: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
f080: 73 65 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70  se{.      pScrip
f090: 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  t = objv[3];.   
f0a0: 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54   }.    zName = T
f0b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
f0c0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
f0d0: 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e  .    pFunc = fin
f0e0: 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e  dSqlFunc(pDb, zN
f0f0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ame);.    if( pF
f100: 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  unc==0 ) return 
f110: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69  TCL_ERROR;.    i
f120: 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  f( pFunc->pScrip
f130: 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  t ){.      Tcl_D
f140: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
f150: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
f160: 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53   }.    pFunc->pS
f170: 63 72 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b  cript = pScript;
f180: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
f190: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
f1a0: 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76      pFunc->useEv
f1b0: 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55  alObjv = safeToU
f1c0: 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72  seEvalObjv(inter
f1d0: 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20  p, pScript);.   
f1e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
f1f0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44  eate_function(pD
f200: 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  b->db, zName, nA
f210: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
f220: 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20  .        pFunc, 
f230: 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  tclSqlFunc, 0, 0
f240: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
f250: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f260: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
f270: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  ;.      Tcl_SetR
f280: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
f290: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
f2a0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
f2b0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
f2c0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
f2d0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
f2e0: 20 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f    $db incrblob ?
f2f0: 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20  -readonly? ?DB? 
f300: 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57  TABLE COLUMN ROW
f310: 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  ID.  */.  case D
f320: 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69  B_INCRBLOB: {.#i
f330: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
f340: 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63  _INCRBLOB.    Tc
f350: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f360: 6e 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62  nterp, "incrblob
f370: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
f380: 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
f390: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f3a0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
f3b0: 20 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c     int isReadonl
f3c0: 79 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  y = 0;.    const
f3d0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61   char *zDb = "ma
f3e0: 69 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  in";.    const c
f3f0: 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20  har *zTable;.   
f400: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
f410: 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
f420: 5f 69 6e 74 36 34 20 69 52 6f 77 3b 0a 0a 20 20  _int64 iRow;..  
f430: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74    /* Check for t
f440: 68 65 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74  he -readonly opt
f450: 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ion */.    if( o
f460: 62 6a 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28  bjc>3 && strcmp(
f470: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f480: 6a 76 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e  jv[2]), "-readon
f490: 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ly")==0 ){.     
f4a0: 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   isReadonly = 1;
f4b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
f4c0: 6f 62 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f  objc!=(5+isReado
f4d0: 6e 6c 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36  nly) && objc!=(6
f4e0: 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a  +isReadonly) ){.
f4f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f500: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f510: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f  , objv, "?-reado
f520: 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20  nly? ?DB? TABLE 
f530: 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a  COLUMN ROWID");.
f540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f550: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
f560: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b     if( objc==(6+
f570: 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20  isReadonly) ){. 
f580: 20 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47       zDb = Tcl_G
f590: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
f5a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61  );.    }.    zTa
f5b0: 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ble = Tcl_GetStr
f5c0: 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d  ing(objv[objc-3]
f5d0: 29 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d  );.    zColumn =
f5e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f5f0: 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20  bjv[objc-2]);.  
f600: 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69    rc = Tcl_GetWi
f610: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
f620: 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31  erp, objv[objc-1
f630: 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20  ], &iRow);..    
f640: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
f650: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 72 65  {.      rc = cre
f660: 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  ateIncrblobChann
f670: 65 6c 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e  el(.          in
f680: 74 65 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20  terp, pDb, zDb, 
f690: 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c  zTable, zColumn,
f6a0: 20 69 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c   iRow, isReadonl
f6b0: 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  y.      );.    }
f6c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
f6d0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
f6e0: 2a 20 20 20 20 20 24 64 62 20 69 6e 74 65 72 72  *     $db interr
f6f0: 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  upt.  **.  ** In
f700: 74 65 72 72 75 70 74 20 74 68 65 20 65 78 65 63  terrupt the exec
f710: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e  ution of the inn
f720: 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65  er-most SQL inte
f730: 72 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20  rpreter.  This. 
f740: 20 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 53   ** causes the S
f750: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
f760: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
f770: 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  of SQLITE_INTERR
f780: 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  UPT..  */.  case
f790: 20 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b   DB_INTERRUPT: {
f7a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
f7b0: 65 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b  errupt(pDb->db);
f7c0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f7d0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
f7e0: 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54  db nullvalue ?ST
f7f0: 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RING?.  **.  ** 
f800: 43 68 61 6e 67 65 20 74 65 78 74 20 75 73 65 64  Change text used
f810: 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d   when a NULL com
f820: 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
f830: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53   database. If ?S
f840: 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e  TRING?.  ** is n
f850: 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
f860: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 72   the current str
f870: 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c  ing used for NUL
f880: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  L is returned.. 
f890: 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73   ** If STRING is
f8a0: 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53   present, then S
f8b0: 54 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65  TRING is returne
f8c0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63  d..  **.  */.  c
f8d0: 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45  ase DB_NULLVALUE
f8e0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
f8f0: 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
f900: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
f910: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f920: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56   2, objv, "NULLV
f930: 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65  ALUE");.      re
f940: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f950: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
f960: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69  jc==3 ){.      i
f970: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68  nt len;.      ch
f980: 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f  ar *zNull = Tcl_
f990: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
f9a0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
f9b0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f9c0: 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  zNull ){.       
f9d0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
f9e0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
f9f0: 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26       if( zNull &
fa00: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
fa10: 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
fa20: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
fa30: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74   1 );.        st
fa40: 72 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c  rncpy(pDb->zNull
fa50: 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20  , zNull, len);. 
fa60: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
fa70: 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  l[len] = '\0';. 
fa80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fa90: 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d      pDb->zNull =
faa0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
fab0: 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
fac0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
fad0: 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e  bTextToObj(pDb->
fae0: 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65  zNull));.    bre
faf0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
fb00: 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f  **     $db last_
fb10: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20  insert_rowid .  
fb20: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  **.  ** Return a
fb30: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
fb40: 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72  is the ROWID for
fb50: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
fb60: 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20   insert..  */.  
fb70: 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53  case DB_LAST_INS
fb80: 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20  ERT_ROWID: {.   
fb90: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
fba0: 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49  t;.    Tcl_WideI
fbb0: 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66  nt rowid;.    if
fbc0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
fbd0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
fbe0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
fbf0: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
fc00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fc10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69  ;.    }.    rowi
fc20: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
fc30: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44  _insert_rowid(pD
fc40: 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73  b->db);.    pRes
fc50: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
fc60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
fc70: 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49      Tcl_SetWideI
fc80: 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72  ntObj(pResult, r
fc90: 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  owid);.    break
fca0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
fcb0: 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d   The DB_ONECOLUM
fcc0: 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c  N method is impl
fcd0: 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72  emented together
fce0: 20 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20   with DB_EVAL.. 
fcf0: 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   */..  /*    $db
fd00: 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c   progress ?N CAL
fd10: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a  LBACK?.  ** .  *
fd20: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
fd30: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72  en callback ever
fd40: 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68  y N virtual mach
fd50: 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c  ine opcodes whil
fd60: 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a  e executing.  **
fd70: 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
fd80: 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53   case DB_PROGRES
fd90: 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  S: {.    if( obj
fda0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
fdb0: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
fdc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
fdd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fde0: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
fdf0: 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ess, 0);.      }
fe00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
fe10: 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
fe20: 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b  char *zProgress;
fe30: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
fe40: 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20        int N;.   
fe50: 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
fe60: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
fe70: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
fe80: 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  , &N) ){.       
fe90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fea0: 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  R;.      };.    
feb0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
fec0: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
fed0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
fee0: 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20  rogress);.      
fef0: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73  }.      zProgres
ff00: 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
ff10: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
ff20: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
ff30: 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20  f( zProgress && 
ff40: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
ff50: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
ff60: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
ff70: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
ff80: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  memcpy(pDb->zPro
ff90: 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73  gress, zProgress
ffa0: 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
ffb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
ffc0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20  Db->zProgress = 
ffd0: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
ffe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
fff0: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
10000 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
10010 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
10020 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
10030 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
10040 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72     sqlite3_progr
10050 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  ess_handler(pDb-
10060 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65  >db, N, DbProgre
10070 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  ssHandler, pDb);
10080 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10090 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
100a0 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70  ogress_handler(p
100b0 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29  Db->db, 0, 0, 0)
100c0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
100d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
100e0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
100f0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10100 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22  jv, "N CALLBACK"
10110 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10120 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10130 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10140 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f  .  /*    $db pro
10150 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  file ?CALLBACK?.
10160 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61    **.  ** Make a
10170 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69  rrangements to i
10180 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41  nvoke the CALLBA
10190 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  CK routine after
101a0 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
101b0 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61  ent.  ** that ha
101c0 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74  s run.  The text
101d0 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20   of the SQL and 
101e0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c  the amount of el
101f0 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20  apse time are.  
10200 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43  ** appended to C
10210 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74  ALLBACK before t
10220 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e  he script is run
10230 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
10240 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _PROFILE: {.    
10250 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
10260 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10270 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10280 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
10290 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
102a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
102b0 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
102c0 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
102d0 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
102e0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
102f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10300 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  , pDb->zProfile,
10310 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
10330 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20  ar *zProfile;.  
10340 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
10350 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
10360 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
10370 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
10380 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  rofile);.      }
10390 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20  .      zProfile 
103a0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
103b0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
103c0 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
103d0 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e   zProfile && len
103e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
103f0 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63  b->zProfile = Tc
10400 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
10410 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
10420 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  py(pDb->zProfile
10430 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b  , zProfile, len+
10440 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
10450 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
10460 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  rofile = 0;.    
10470 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
10480 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
10490 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
104a0 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
104b0 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
104c0 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
104d0 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70  qlite3_profile(p
104e0 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c  Db->db, DbProfil
104f0 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  eHandler, pDb);.
10500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10510 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
10520 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  file(pDb->db, 0,
10530 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
10540 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
10550 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
10560 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65   **     $db reke
10570 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y KEY.  **.  ** 
10580 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79  Change the encry
10590 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65  ption key on the
105a0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
105b0 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
105c0 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20   case DB_REKEY: 
105d0 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  {.    int nKey;.
105e0 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
105f0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
10600 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
10610 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10620 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22  , 2, objv, "KEY"
10630 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10640 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10650 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f  .    pKey = Tcl_
10660 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
10670 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b  Obj(objv[2], &nK
10680 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ey);.#ifdef SQLI
10690 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
106a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
106b0 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65  key(pDb->db, pKe
106c0 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66  y, nKey);.    if
106d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
106e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
106f0 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
10700 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20  rStr(rc), 0);.  
10710 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
10720 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OR;.    }.#endif
10730 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10740 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
10750 64 62 20 73 74 61 74 75 73 20 28 73 74 65 70 7c  db status (step|
10760 73 6f 72 74 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  sort).  **.  ** 
10770 44 69 73 70 6c 61 79 20 53 51 4c 49 54 45 5f 53  Display SQLITE_S
10780 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
10790 41 4e 5f 53 54 45 50 20 6f 72 20 0a 20 20 2a 2a  AN_STEP or .  **
107a0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
107b0 55 53 5f 53 4f 52 54 20 66 6f 72 20 74 68 65 20  US_SORT for the 
107c0 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c  most recent eval
107d0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
107e0 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 69  _STATUS: {.    i
107f0 6e 74 20 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt v;.    const 
10800 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69  char *zOp;.    i
10810 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
10820 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10830 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10840 6f 62 6a 76 2c 20 22 28 73 74 65 70 7c 73 6f 72  objv, "(step|sor
10850 74 29 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  t)");.      retu
10860 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10870 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20 54 63    }.    zOp = Tc
10880 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10890 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74  [2]);.    if( st
108a0 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65 70 22  rcmp(zOp, "step"
108b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )==0 ){.      v 
108c0 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a 20 20  = pDb->nStep;.  
108d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
108e0 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22 29 3d  mp(zOp, "sort")=
108f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
10900 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20 20 20  pDb->nSort;.    
10910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
10920 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10930 74 65 72 70 2c 20 22 62 61 64 20 61 72 67 75 6d  terp, "bad argum
10940 65 6e 74 3a 20 73 68 6f 75 6c 64 20 62 65 20 73  ent: should be s
10950 74 65 70 20 6f 72 20 73 6f 72 74 22 2c 20 0a 20  tep or sort", . 
10960 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
10970 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
10980 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10990 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
109a0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
109b0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
109c0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
109d0 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
109e0 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20      $db timeout 
109f0 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a  MILLESECONDS.  *
10a00 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72  *.  ** Delay for
10a10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
10a20 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63  illiseconds spec
10a30 69 66 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c  ified when a fil
10a40 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  e is locked..  *
10a50 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45  /.  case DB_TIME
10a60 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d  OUT: {.    int m
10a70 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  s;.    if( objc!
10a80 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
10a90 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10aa0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d  erp, 2, objv, "M
10ab0 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20  ILLISECONDS");. 
10ac0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10ad0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10ae0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
10af0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
10b00 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  bjv[2], &ms) ) r
10b10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10b20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
10b30 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64  y_timeout(pDb->d
10b40 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61  b, ms);.    brea
10b50 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20  k;.  }.  .  /*. 
10b60 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61   **     $db tota
10b70 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  l_changes.  **. 
10b80 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
10b90 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
10ba0 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
10bb0 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
10bc0 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  eleted .  ** sin
10bd0 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
10be0 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74  handle was creat
10bf0 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
10c00 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
10c10 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
10c20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66  *pResult;.    if
10c30 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10c40 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10c50 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10c60 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
10c70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10c80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73  ;.    }.    pRes
10c90 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
10ca0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
10cb0 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
10cc0 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74  j(pResult, sqlit
10cd0 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
10ce0 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  (pDb->db));.    
10cf0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10d00 20 20 20 20 24 64 62 20 74 72 61 63 65 20 3f 43      $db trace ?C
10d10 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
10d20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
10d30 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
10d40 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
10d50 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c  ine for each SQL
10d60 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
10d70 74 68 61 74 20 69 73 20 65 78 65 63 75 74 65 64  that is executed
10d80 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  .  The text of t
10d90 68 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64  he SQL is append
10da0 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62  ed to CALLBACK b
10db0 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  efore.  ** it is
10dc0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a   executed..  */.
10dd0 20 20 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a    case DB_TRACE:
10de0 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
10df0 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
10e00 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10e10 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
10e20 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
10e30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10e40 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
10e50 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
10e60 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
10e70 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
10e80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10e90 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61  nterp, pDb->zTra
10ea0 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ce, 0);.      }.
10eb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10ec0 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20   char *zTrace;. 
10ed0 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
10ee0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
10ef0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
10f00 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
10f10 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ace);.      }.  
10f20 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c      zTrace = Tcl
10f30 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10f40 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
10f50 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61  ;.      if( zTra
10f60 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ce && len>0 ){. 
10f70 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
10f80 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ce = Tcl_Alloc( 
10f90 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
10fa0 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
10fb0 54 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c  Trace, zTrace, l
10fc0 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
10fd0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
10fe0 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  >zTrace = 0;.   
10ff0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
11000 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
11010 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
11020 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
11030 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
11040 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
11050 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
11060 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64  >db, DbTraceHand
11070 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
11080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11090 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
110a0 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
110b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
110c0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
110d0 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
110e0 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66  ransaction [-def
110f0 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65  erred|-immediate
11100 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52  |-exclusive] SCR
11110 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74  IPT.  **.  ** St
11120 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
11130 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65  ction (if we are
11140 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
11150 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20  the midst of a. 
11160 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
11170 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65   and execute the
11180 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49   TCL script SCRI
11190 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50  PT.  After SCRIP
111a0 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  T.  ** completes
111b0 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20  , either commit 
111c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
111d0 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  or roll it back 
111e0 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74  if SCRIPT.  ** t
111f0 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
11200 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65  on.  Or if no ne
11210 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73  w transation was
11220 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74   started, do not
11230 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20  hing..  ** pass 
11240 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e  the exception on
11250 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   up the stack.. 
11260 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
11270 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72  mmand was inspir
11280 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61  ed by Dave Thoma
11290 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79  s's talk on Ruby
112a0 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30   at the.  ** 200
112b0 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20  5 O'Reilly Open 
112c0 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f  Source Conventio
112d0 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a  n (OSCON)..  */.
112e0 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41    case DB_TRANSA
112f0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c  CTION: {.    Tcl
11300 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
11310 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11320 42 65 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49  Begin = "SAVEPOI
11330 4e 54 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  NT _tcl_transact
11340 69 6f 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ion";.    const 
11350 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 20 20  char *zEnd;.    
11360 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
11370 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
11380 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11390 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
113a0 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54  , "[TYPE] SCRIPT
113b0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
113c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
113d0 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  }..    if( pDb->
113e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
113f0 20 20 20 20 20 20 7a 42 65 67 69 6e 20 3d 20 22        zBegin = "
11400 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74  SAVEPOINT _tcl_t
11410 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20  ransaction";.   
11420 20 7d 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e   }else if( pDb->
11430 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20  nTransaction==0 
11440 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  && objc==4 ){.  
11450 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
11460 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72   char *TTYPE_str
11470 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
11480 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22 65  "deferred",   "e
11490 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d  xclusive",  "imm
114a0 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20  ediate", 0.     
114b0 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54   };.      enum T
114c0 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20  TYPE_enum {.    
114d0 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52 52      TTYPE_DEFERR
114e0 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53  ED, TTYPE_EXCLUS
114f0 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44  IVE, TTYPE_IMMED
11500 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20  IATE.      };.  
11510 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20      int ttype;. 
11520 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
11530 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
11540 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54  erp, objv[2], TT
11550 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73  YPE_strs, "trans
11560 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20  action type",.  
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11580 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26              0, &
11590 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20  ttype) ){.      
115a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
115b0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
115c0 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
115d0 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65  TTYPE_enum)ttype
115e0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
115f0 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a   TTYPE_DEFERRED:
11600 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b      /* no-op */;
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11620 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11630 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55  case TTYPE_EXCLU
11640 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d  SIVE:   zBegin =
11650 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
11660 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  E";  break;.    
11670 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 49      case TTYPE_I
11680 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67  MMEDIATE:   zBeg
11690 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45  in = "BEGIN IMME
116a0 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a  DIATE";  break;.
116b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
116c0 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
116d0 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20 70  [objc-1];..    p
116e0 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b  Db->disableAuth+
116f0 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  +;.    rc = sqli
11700 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
11710 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20  , zBegin, 0, 0, 
11720 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69 73  0);.    pDb->dis
11730 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20  ableAuth--;.    
11740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11750 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  K ){.      Tcl_A
11760 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11770 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
11780 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
11790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
117a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
117b0 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61      pDb->nTransa
117c0 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 72 63 20  ction++;.    rc 
117d0 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
117e0 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
117f0 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 6e 54   0);.    pDb->nT
11800 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 0a 20  ransaction--;.. 
11810 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45     if( rc!=TCL_E
11820 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 69 66  RROR ){.      if
11830 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pDb->nTransact
11840 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ion ){.        z
11850 45 6e 64 20 3d 20 22 52 45 4c 45 41 53 45 20 5f  End = "RELEASE _
11860 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
11870 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11880 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 43         zEnd = "C
11890 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 20 20 7d 0a  OMMIT";.      }.
118a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
118b0 20 69 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73   if( pDb->nTrans
118c0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
118d0 20 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41    zEnd = "ROLLBA
118e0 43 4b 20 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73  CK TO _tcl_trans
118f0 61 63 74 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45  action ; RELEASE
11900 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
11910 6e 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n";.      }else{
11920 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20  .        zEnd = 
11930 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
11940 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
11950 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b  Db->disableAuth+
11960 2b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  +;.    if( sqlit
11970 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
11980 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20   zEnd, 0, 0, 0) 
11990 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
119a0 20 69 73 20 61 20 74 72 69 63 6b 79 20 73 63 65   is a tricky sce
119b0 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64 6c 65 2e  nario to handle.
119c0 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   The most likely
119d0 20 63 61 75 73 65 20 6f 66 20 61 6e 0a 20 20 20   cause of an.   
119e0 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 73 20 74     ** error is t
119f0 68 61 74 20 74 68 65 20 65 78 65 63 28 29 20 61  hat the exec() a
11a00 62 6f 76 65 20 77 61 73 20 61 6e 20 61 74 74 65  bove was an atte
11a10 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  mpt to commit th
11a20 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 70 2d  e .      ** top-
11a30 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69 6f  level transactio
11a40 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65 64 20  n that returned 
11a50 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f 72 2c  SQLITE_BUSY. Or,
11a60 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a 20 20   less likely,.  
11a70 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 20 49      ** that an I
11a80 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  O-error has occu
11a90 72 65 64 2e 20 49 6e 20 65 69 74 68 65 72 20 63  red. In either c
11aa0 61 73 65 2c 20 74 68 72 6f 77 20 61 20 54 63 6c  ase, throw a Tcl
11ab0 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
11ac0 20 2a 2a 20 61 6e 64 20 74 72 79 20 74 6f 20 72   ** and try to r
11ad0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
11ae0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
11af0 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 69  *.      ** But i
11b00 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  t could also be 
11b10 74 68 61 74 20 74 68 65 20 75 73 65 72 20 65 78  that the user ex
11b20 65 63 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  ecuted one or mo
11b30 72 65 20 42 45 47 49 4e 2c 20 0a 20 20 20 20 20  re BEGIN, .     
11b40 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56 45   ** COMMIT, SAVE
11b50 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 20 6f  POINT, RELEASE o
11b60 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61  r ROLLBACK comma
11b70 6e 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nds that are con
11b80 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  fusing.      ** 
11b90 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20 6c 6f  this method's lo
11ba0 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20 68  gic. Not clear h
11bb0 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20 62 65  ow this would be
11bc0 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a 20   best handled.. 
11bd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
11be0 28 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20  ( rc!=TCL_ERROR 
11bf0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
11c00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11c10 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
11c20 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
11c30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43  .        rc = TC
11c40 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
11c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
11c60 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52 4f  xec(pDb->db, "RO
11c70 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30  LLBACK", 0, 0, 0
11c80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
11c90 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b  ->disableAuth--;
11ca0 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ..    break;.  }
11cb0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
11cc0 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f  db update_hook ?
11cd0 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20  script?.  **    
11ce0 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  $db rollback_hoo
11cf0 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a  k ?script?.  */.
11d00 20 20 63 61 73 65 20 44 42 5f 55 50 44 41 54 45    case DB_UPDATE
11d10 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44  _HOOK: .  case D
11d20 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a  B_ROLLBACK_HOOK:
11d30 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 70   {..    /* set p
11d40 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61  pHook to point a
11d50 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72  t pUpdateHook or
11d60 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20   pRollbackHook, 
11d70 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20  depending on .  
11d80 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64    ** whether [$d
11d90 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f  b update_hook] o
11da0 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f  r [$db rollback_
11db0 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65  hook] was invoke
11dc0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  d..    */.    Tc
11dd0 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20  l_Obj **ppHook; 
11de0 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
11df0 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20  =DB_UPDATE_HOOK 
11e00 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20  ){.      ppHook 
11e10 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48  = &pDb->pUpdateH
11e20 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ook;.    }else{.
11e30 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26        ppHook = &
11e40 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
11e50 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ok;.    }..    i
11e60 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
11e70 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
11e80 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11e90 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11ea0 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  , "?SCRIPT?");. 
11eb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
11ec0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11ed0 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b    if( *ppHook ){
11ee0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
11ef0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
11f00 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
11f10 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
11f20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
11f30 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
11f40 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f  ;.        *ppHoo
11f50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 0;.      }. 
11f60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
11f70 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 61 73  c==3 ){.      as
11f80 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29  sert( !(*ppHook)
11f90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   );.      if( Tc
11fa0 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28  l_GetCharLength(
11fb0 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20  objv[2])>0 ){.  
11fc0 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20        *ppHook = 
11fd0 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  objv[2];.       
11fe0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
11ff0 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
12000 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
12010 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f  qlite3_update_ho
12020 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70 44 62  ok(pDb->db, (pDb
12030 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62  ->pUpdateHook?Db
12040 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29  UpdateHandler:0)
12050 2c 20 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , pDb);.    sqli
12060 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  te3_rollback_hoo
12070 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e  k(pDb->db,(pDb->
12080 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62  pRollbackHook?Db
12090 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a  RollbackHandler:
120a0 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62 72  0),pDb);..    br
120b0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
120c0 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20    $db version.  
120d0 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
120e0 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  he version strin
120f0 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  g for this datab
12100 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
12110 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20   DB_VERSION: {. 
12120 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
12130 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
12140 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  )sqlite3_libvers
12150 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49  ion(), TCL_STATI
12160 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  C);.    break;. 
12170 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20   }...  } /* End 
12180 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74  of the SWITCH st
12190 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74  atement */.  ret
121a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
121b0 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d     sqlite3 DBNAM
121c0 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73  E FILENAME ?-vfs
121d0 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20   VFSNAME? ?-key 
121e0 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20  KEY? ?-readonly 
121f0 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20  BOOLEAN?.**     
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12210 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65 20 42        ?-create B
12220 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65  OOLEAN? ?-nomute
12230 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a  x BOOLEAN?.**.**
12240 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   This is the mai
12250 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20  n Tcl command.  
12260 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65  When the "sqlite
12270 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73  " Tcl command is
12280 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69  .** invoked, thi
12290 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74  s routine runs t
122a0 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  o process that c
122b0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ommand..**.** Th
122c0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
122d0 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20  , DBNAME, is an 
122e0 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66  arbitrary name f
122f0 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61  or a new.** data
12300 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
12310 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63    This command c
12320 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d  reates a new com
12330 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42  mand named.** DB
12340 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65  NAME that is use
12350 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61  d to control tha
12360 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  t connection.  T
12370 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
12380 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c  onnection is del
12390 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42  eted when the DB
123a0 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20  NAME command is 
123b0 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
123c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
123d0 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
123e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
123f0 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ile..**.*/.stati
12400 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69  c int DbMain(voi
12410 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
12420 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
12430 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  bjc,Tcl_Obj *con
12440 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69  st*objv){.  Sqli
12450 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20  teDb *p;.  void 
12460 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  *pKey = 0;.  int
12470 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e   nKey = 0;.  con
12480 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
12490 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a   char *zErrMsg;.
124a0 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
124b0 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
124c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
124d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67   = 0;.  int flag
124e0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
124f0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
12500 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
12510 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
12520 55 54 45 58 3b 0a 20 20 54 63 6c 5f 44 53 74 72  UTEX;.  Tcl_DStr
12530 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69  ing translatedFi
12540 6c 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62  lename;.  if( ob
12550 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72  jc==2 ){.    zAr
12560 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
12570 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
12580 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
12590 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73  rcmp(zArg,"-vers
125a0 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
125b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
125c0 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
125d0 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20  3_version,0);.  
125e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
125f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
12600 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68   strcmp(zArg,"-h
12610 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b  as-codec")==0 ){
12620 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
12630 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54  AS_CODEC.      T
12640 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12650 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23  interp,"1",0);.#
12660 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41  else.      Tcl_A
12670 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12680 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69  rp,"0",0);.#endi
12690 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  f.      return T
126a0 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  CL_OK;.    }.  }
126b0 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c  .  for(i=3; i+1<
126c0 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  objc; i+=2){.   
126d0 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
126e0 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a  tring(objv[i]);.
126f0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
12700 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29  Arg,"-key")==0 )
12710 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54  {.      pKey = T
12720 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
12730 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d  romObj(objv[i+1]
12740 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65  , &nKey);.    }e
12750 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
12760 41 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20  Arg, "-vfs")==0 
12770 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
12780 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47      zVfs = Tcl_G
12790 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d  etString(objv[i]
127a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
127b0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
127c0 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  readonly")==0 ){
127d0 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
127e0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
127f0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
12800 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
12810 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
12820 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
12830 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
12840 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
12850 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
12860 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
12870 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66 6c  ATE);.        fl
12880 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
12890 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
128a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
128b0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
128c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
128d0 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
128e0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
128f0 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
12900 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
12910 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63  strcmp(zArg, "-c
12920 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  reate")==0 ){.  
12930 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
12940 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
12950 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
12960 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
12970 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12980 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
12990 62 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51  b && (flags & SQ
129a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
129b0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
129c0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
129d0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
129e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
129f0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
12a00 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
12a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
12a20 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
12a30 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22 29  Arg, "-nomutex")
12a40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
12a50 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
12a60 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
12a70 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
12a80 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
12a90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12aa0 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
12ab0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
12ac0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
12ad0 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  EX;.        flag
12ae0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
12af0 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
12b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12b10 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
12b20 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
12b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 7d 65 6c 73  .      }.   }els
12b40 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
12b50 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78 22 29  g, "-fullmutex")
12b60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
12b70 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
12b80 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
12b90 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
12ba0 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
12bb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12bc0 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
12bd0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
12be0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
12bf0 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c  UTEX;.        fl
12c00 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
12c10 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20  PEN_NOMUTEX;.   
12c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c30 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
12c40 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
12c50 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  X;.      }.    }
12c60 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
12c70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12c80 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  erp, "unknown op
12c90 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28  tion: ", zArg, (
12ca0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
12cb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12cd0 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a  ( objc<3 || (obj
12ce0 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20 20 54  c&1)!=1 ){.    T
12cf0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12d00 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
12d10 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20   .      "HANDLE 
12d20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56  FILENAME ?-vfs V
12d30 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e  FSNAME? ?-readon
12d40 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72  ly BOOLEAN? ?-cr
12d50 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20  eate BOOLEAN?". 
12d60 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78       " ?-nomutex
12d70 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c   BOOLEAN? ?-full
12d80 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 22 0a  mutex BOOLEAN?".
12d90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
12da0 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22 20  S_CODEC.      " 
12db0 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f 22  ?-key CODECKEY?"
12dc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20  .#endif.    );. 
12dd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12de0 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d  ROR;.  }.  zErrM
12df0 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53  sg = 0;.  p = (S
12e00 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c  qliteDb*)Tcl_All
12e10 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
12e20 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
12e30 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
12e40 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f  t(interp, "mallo
12e50 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53  c failed", TCL_S
12e60 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
12e70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12e80 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
12e90 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
12ea0 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
12eb0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
12ec0 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  v[2], 0);.  zFil
12ed0 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74  e = Tcl_Translat
12ee0 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70  eFileName(interp
12ef0 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c  , zFile, &transl
12f00 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  atedFilename);. 
12f10 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
12f20 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 2c 20  (zFile, &p->db, 
12f30 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20  flags, zVfs);.  
12f40 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
12f50 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
12f60 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  ame);.  if( SQLI
12f70 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
12f80 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
12f90 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
12fa0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
12fb0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
12fc0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
12fd0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
12fe0 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  ->db);.    p->db
12ff0 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66   = 0;.  }.#ifdef
13000 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
13010 43 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b  C.  if( p->db ){
13020 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  .    sqlite3_key
13030 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b  (p->db, pKey, nK
13040 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
13050 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
13060 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
13070 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
13080 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  Msg, TCL_VOLATIL
13090 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  E);.    Tcl_Free
130a0 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20  ((char*)p);.    
130b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
130c0 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
130d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
130e0 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20  .  p->maxStmt = 
130f0 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  NUM_PREPARED_STM
13100 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  TS;.  p->interp 
13110 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67  = interp;.  zArg
13120 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
13130 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
13140 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
13150 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
13160 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43  rp, zArg, DbObjC
13170 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62  md, (char*)p, Db
13180 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 72 65  DeleteCmd);.  re
13190 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
131a0 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20  /*.** Provide a 
131b0 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74  dummy Tcl_InitSt
131c0 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73  ubs if we are us
131d0 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74  ing this as a st
131e0 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e  atic.** library.
131f0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f  .*/.#ifndef USE_
13200 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65  TCL_STUBS.# unde
13210 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f  Tcl_InitStubs
13220 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e  .# define Tcl_In
13230 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23  itStubs(a,b,c).#
13240 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
13250 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
13260 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
13270 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
13280 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a   This will be.**
13290 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74   defined automat
132a0 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45  ically by the TE
132b0 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74  A makefile.  But
132c0 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73   other makefiles
132d0 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e  .** do not defin
132e0 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  e it..*/.#ifndef
132f0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
13300 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47  .# define PACKAG
13310 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45  E_VERSION SQLITE
13320 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a  _VERSION.#endif.
13330 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
13340 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
13350 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f  *.** This Tcl mo
13360 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  dule contains on
13370 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  ly a single new 
13380 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  Tcl command name
13390 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28  d "sqlite"..** (
133a0 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  Hence there is n
133b0 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68  o namespace.  Th
133c0 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
133d0 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73  in using a names
133e0 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65  pace.** if the e
133f0 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75  xtension only su
13400 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e  pplies one new n
13410 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69  ame!)  The "sqli
13420 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  te" command is.*
13430 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61  * used to open a
13440 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61   new SQLite data
13450 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44  base.  See the D
13460 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20  bMain() routine 
13470 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64  above.** for add
13480 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
13490 69 6f 6e 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69  ion..*/.EXTERN i
134a0 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  nt Sqlite3_Init(
134b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
134c0 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53  rp){.  Tcl_InitS
134d0 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
134e0 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  4", 0);.  Tcl_Cr
134f0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13500 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
13510 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
13520 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
13530 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  ;.  Tcl_PkgProvi
13540 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
13550 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  te3", PACKAGE_VE
13560 52 53 49 4f 4e 29 3b 0a 20 20 54 63 6c 5f 43 72  RSION);.  Tcl_Cr
13570 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13580 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
13590 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
135a0 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
135b0 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
135c0 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
135d0 65 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e", PACKAGE_VERS
135e0 49 4f 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ION);.  return T
135f0 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20  CL_OK;.}.EXTERN 
13600 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49  int Tclsqlite3_I
13610 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
13620 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
13630 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
13640 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69  erp); }.EXTERN i
13650 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49  nt Sqlite3_SafeI
13660 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
13670 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
13680 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
13690 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
136a0 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
136b0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
136c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
136d0 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
136e0 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  3_Unload(Tcl_Int
136f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
13700 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
13710 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
13720 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
13730 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
13740 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
13750 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
13760 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
13770 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 55  nt Sqlite3_SafeU
13780 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
13790 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
137a0 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
137b0 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
137c0 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66  t Tclsqlite3_Saf
137d0 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  eUnload(Tcl_Inte
137e0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
137f0 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
13800 43 4c 5f 4f 4b 3b 7d 0a 0a 0a 23 69 66 6e 64 65  CL_OK;}...#ifnde
13810 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
13820 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e  X_ONLY.EXTERN in
13830 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
13840 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13850 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
13860 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
13870 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
13880 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  sqlite_Init(Tcl_
13890 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
138a0 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
138b0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
138c0 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
138d0 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
138e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
138f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
13900 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
13910 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54  qlite_SafeInit(T
13920 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13930 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
13940 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
13950 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63  Sqlite_Unload(Tc
13960 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13970 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
13980 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
13990 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
139a0 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  ite_Unload(Tcl_I
139b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
139c0 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
139d0 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
139e0 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53 61  RN int Sqlite_Sa
139f0 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  feUnload(Tcl_Int
13a00 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
13a10 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
13a20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
13a30 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53   int Tclsqlite_S
13a40 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  afeUnload(Tcl_In
13a50 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
13a60 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
13a70 20 54 43 4c 5f 4f 4b 3b 7d 0a 23 65 6e 64 69 66   TCL_OK;}.#endif
13a80 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f  ..#ifdef TCLSH./
13a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13ae0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   The code that f
13af0 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74  ollows is used t
13b00 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f  o build standalo
13b10 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  ne TCL interpret
13b20 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  ers.** that are 
13b30 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65  statically linke
13b40 64 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20  d with SQLite.  
13b50 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .*/../*.** If th
13b60 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
13b70 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69   one, then put i
13b80 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20  n code this for 
13b90 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f  the.** "main" ro
13ba0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
13bb0 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61  initialize Tcl a
13bc0 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72  nd take input fr
13bd0 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  om.** standard i
13be0 6e 70 75 74 2c 20 6f 72 20 69 66 20 61 20 66 69  nput, or if a fi
13bf0 6c 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74  le is named on t
13c00 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a  he command line.
13c10 2a 2a 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  ** the TCL inter
13c20 70 72 65 74 65 72 20 72 65 61 64 73 20 61 6e 64  preter reads and
13c30 20 65 76 61 6c 75 61 74 65 73 20 74 68 61 74 20   evaluates that 
13c40 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c  file..*/.#if TCL
13c50 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61  SH==1.static cha
13c60 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a  r zMainloop[] =.
13c70 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
13c80 22 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f  ".  "while {![eo
13c90 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20  f stdin]} {\n". 
13ca0 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c     "if {$line!=\
13cb0 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
13cc0 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
13cd0 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"> \"\n".    "
13ce0 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
13cf0 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
13d00 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20  ne \"% \"\n".   
13d10 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73   "}\n".    "flus
13d20 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20  h stdout\n".    
13d30 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
13d40 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
13d50 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70   "if {[info comp
13d60 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e  lete $line]} {\n
13d70 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61  ".      "if {[ca
13d80 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20  tch {uplevel #0 
13d90 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20  $line} result]} 
13da0 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
13db0 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f  ts stderr \"Erro
13dc0 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a  r: $result\"\n".
13dd0 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20        "} elseif 
13de0 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20  {$result!=\"\"} 
13df0 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
13e00 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20  ts $result\n".  
13e10 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
13e20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
13e30 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
13e40 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c  .      "append l
13e50 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22  ine \\n\n".    "
13e60 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23  }\n".  "}\n".;.#
13e70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
13e80 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20  the macro TCLSH 
13e90 69 73 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74  is two, then get
13ea0 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63   the main loop c
13eb0 6f 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68  ode out of.** th
13ec0 65 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 20  e separate file 
13ed0 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68  "spaceanal_tcl.h
13ee0 22 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d  "..*/.#if TCLSH=
13ef0 3d 32 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  =2.static char z
13f00 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69  Mainloop[] = .#i
13f10 6e 63 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61  nclude "spaceana
13f20 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69  l_tcl.h".;.#endi
13f30 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48  f..#define TCLSH
13f40 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20  _MAIN main   /* 
13f50 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f  Needed to fake o
13f60 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69  ut mktclapp */.i
13f70 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e  nt TCLSH_MAIN(in
13f80 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
13f90 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  rgv){.  Tcl_Inte
13fa0 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
13fb0 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  l_FindExecutable
13fc0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74  (argv[0]);.  int
13fd0 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
13fe0 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69  Interp();.  Sqli
13ff0 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
14000 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
14010 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74  TEST.  {.    ext
14020 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74  ern int Md5_Init
14030 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
14040 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
14050 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28  liteconfig_Init(
14060 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
14070 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
14080 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
14090 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
140a0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
140b0 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f  etest2_Init(Tcl_
140c0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
140d0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
140e0 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est3_Init(Tcl_In
140f0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
14100 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
14110 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t4_Init(Tcl_Inte
14120 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
14130 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35   int Sqlitetest5
14140 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
14150 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
14160 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49  nt Sqlitetest6_I
14170 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
14180 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
14190 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69   Sqlitetest7_Ini
141a0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
141b0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
141c0 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28  qlitetest8_Init(
141d0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
141e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
141f0 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63  itetest9_Init(Tc
14200 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
14210 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
14220 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
14230 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
14240 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
14250 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f  itetest_autoext_
14260 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
14270 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
14280 74 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e  t Sqlitetest_fun
14290 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
142a0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
142b0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 68  int Sqlitetest_h
142c0 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  exio_Init(Tcl_In
142d0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
142e0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
142f0 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 54 63  t_malloc_Init(Tc
14300 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
14310 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
14320 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74  etest_mutex_Init
14330 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
14340 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
14350 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49  litetestschema_I
14360 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
14370 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
14380 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
14390 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
143a0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
143b0 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61   Sqlitetesttclva
143c0 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  r_Init(Tcl_Inter
143d0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
143e0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54 68  int SqlitetestTh
143f0 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  read_Init(Tcl_In
14400 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
14410 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
14420 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29 3b  tOnefile_Init();
14430 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
14440 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74  SqlitetestOsinst
14450 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
14460 2a 29 3b 0a 0a 20 20 20 20 4d 64 35 5f 49 6e 69  *);..    Md5_Ini
14470 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
14480 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74  qliteconfig_Init
14490 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
144a0 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69  litetest1_Init(i
144b0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
144c0 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74  tetest2_Init(int
144d0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
144e0 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72  test3_Init(inter
144f0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
14500 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st4_Init(interp)
14510 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
14520 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
14530 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f      Sqlitetest6_
14540 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
14550 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e    Sqlitetest7_In
14560 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
14570 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74  Sqlitetest8_Init
14580 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
14590 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69  litetest9_Init(i
145a0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
145b0 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74  tetestasync_Init
145c0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
145d0 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74  litetest_autoext
145e0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
145f0 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75     Sqlitetest_fu
14600 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  nc_Init(interp);
14610 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
14620 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72  hexio_Init(inter
14630 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
14640 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69  st_malloc_Init(i
14650 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
14660 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69  tetest_mutex_Ini
14670 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
14680 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f  qlitetestschema_
14690 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
146a0 20 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76    Sqlitetesttclv
146b0 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ar_Init(interp);
146c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 54  .    SqlitetestT
146d0 68 72 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72  hread_Init(inter
146e0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
146f0 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69  stOnefile_Init(i
14700 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
14710 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69  tetestOsinst_Ini
14720 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 64  t(interp);..#ifd
14730 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
14740 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f    Sqlitetestsse_
14750 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
14760 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
14770 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c    if( argc>=2 ||
14780 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20   TCLSH==2 ){.   
14790 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
147a0 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20   zArgc[32];.    
147b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
147c0 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20  (sizeof(zArgc), 
147d0 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67  zArgc, "%d", arg
147e0 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20  c-(3-TCLSH));.  
147f0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
14800 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67  erp,"argc", zArg
14810 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  c, TCL_GLOBAL_ON
14820 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
14830 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
14840 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
14850 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
14860 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
14870 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
14880 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
14890 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
148a0 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
148b0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
148c0 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
148d0 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
148e0 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
148f0 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
14900 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
14910 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
14920 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
14930 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
14940 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
14950 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
14960 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
14970 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
14980 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
14990 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
149a0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
149b0 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
149c0 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65  ) zInfo = Tcl_Ge
149d0 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
149e0 74 65 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72  terp);.      fpr
149f0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
14a00 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a   %s\n", *argv, z
14a10 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  Info);.      ret
14a20 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
14a30 0a 20 20 69 66 28 20 61 72 67 63 3c 3d 31 20 7c  .  if( argc<=1 |
14a40 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20  | TCLSH==2 ){.  
14a50 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c    Tcl_GlobalEval
14a60 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f  (interp, zMainlo
14a70 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  op);.  }.  retur
14a80 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
14a90 20 54 43 4c 53 48 20 2a 2f 0a                     TCLSH */.