/ Hex Artifact Content
Login

Artifact 47ecdb00e9bc135b37ad5bed84fefe20d7c19611:


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 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 74  ite.**.** $Id: t
01a0: 63 6c 73 71 6c 69 74 65 2e 63 2c 76 20 31 2e 31  clsqlite.c,v 1.1
01b0: 31 37 20 32 30 30 35 2f 30 31 2f 32 34 20 31 30  17 2005/01/24 10
01c0: 3a 32 35 3a 35 39 20 64 61 6e 69 65 6c 6b 31 39  :25:59 danielk19
01d0: 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e  77 Exp $.*/.#ifn
01e0: 64 65 66 20 4e 4f 5f 54 43 4c 20 20 20 20 20 2f  def NO_TCL     /
01f0: 2a 20 4f 6d 69 74 20 74 68 69 73 20 77 68 6f 6c  * Omit this whol
0200: 65 20 66 69 6c 65 20 69 66 20 54 43 4c 20 69 73  e file if TCL is
0210: 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a   unavailable */.
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0230: 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  eInt.h".#include
0240: 20 22 68 61 73 68 2e 68 22 0a 23 69 6e 63 6c 75   "hash.h".#inclu
0250: 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c  de "tcl.h".#incl
0260: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0270: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0280: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
0290: 65 72 74 2e 68 3e 0a 0a 23 64 65 66 69 6e 65 20  ert.h>..#define 
02a0: 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  NUM_PREPARED_STM
02b0: 54 53 20 31 30 0a 23 64 65 66 69 6e 65 20 4d 41  TS 10.#define MA
02c0: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
02d0: 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54   100../*.** If T
02e0: 43 4c 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e  CL uses UTF-8 an
02f0: 64 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66  d SQLite is conf
0300: 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 69 73  igured to use is
0310: 6f 38 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a  o8859, then we.*
0320: 2a 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74  * have to do a t
0330: 72 61 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20  ranslation when 
0340: 67 6f 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68  going between th
0350: 65 20 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20  e two.  Set the 
0360: 0a 2a 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  .** UTF_TRANSLAT
0370: 49 4f 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f  ION_NEEDED macro
0380: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
0390: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a  t we need to do.
03a0: 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74  ** this translat
03b0: 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65  ion.  .*/.#if de
03c0: 66 69 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41  fined(TCL_UTF_MA
03d0: 58 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  X) && !defined(S
03e0: 51 4c 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65  QLITE_UTF8).# de
03f0: 66 69 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41  fine UTF_TRANSLA
0400: 54 49 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65  TION_NEEDED 1.#e
0410: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20  ndif../*.** New 
0420: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  SQL functions ca
0430: 6e 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20  n be created as 
0440: 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61  TCL scripts.  Ea
0450: 63 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e  ch such function
0460: 0a 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65 64  .** is described
0470: 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   by an instance 
0480: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0490: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74   structure..*/.t
04a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71  ypedef struct Sq
04b0: 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73  lFunc SqlFunc;.s
04c0: 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a  truct SqlFunc {.
04d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
04e0: 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54  terp;   /* The T
04f0: 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20  CL interpret to 
0500: 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63  execute the func
0510: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
0520: 7a 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20  zScript;        
0530: 2f 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f  /* The script to
0540: 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c   be run */.  Sql
0550: 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20  Func *pNext;    
0560: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
0570: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
0580: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
0590: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c  ;../*.** New col
05a0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
05b0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62 65   function can be
05c0: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
05d0: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
05e0: 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  uch.** function 
05f0: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0600: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0620: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0630: 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f 6c  ef struct SqlCol
0640: 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65 3b  late SqlCollate;
0650: 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61  .struct SqlColla
0660: 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  te {.  Tcl_Inter
0670: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
0680: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
0690: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
06a0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
06b0: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20  har *zScript;   
06c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69       /* The scri
06d0: 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  pt to be run */.
06e0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e    SqlCollate *pN
06f0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
0700: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0710: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0720: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0730: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
0740: 65 6e 74 73 20 61 72 65 20 63 61 63 68 65 64 20  ents are cached 
0750: 66 6f 72 20 66 61 73 74 65 72 20 65 78 65 63 75  for faster execu
0760: 74 69 6f 6e 2e 20 20 45 61 63 68 20 70 72 65 70  tion.  Each prep
0770: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
0780: 74 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62  t is described b
0790: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  y an instance of
07a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
07b0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
07c0: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 50  edef struct SqlP
07d0: 72 65 70 61 72 65 64 53 74 6d 74 20 53 71 6c 50  reparedStmt SqlP
07e0: 72 65 70 61 72 65 64 53 74 6d 74 3b 0a 73 74 72  reparedStmt;.str
07f0: 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  uct SqlPreparedS
0800: 74 6d 74 20 7b 0a 20 20 53 71 6c 50 72 65 70 61  tmt {.  SqlPrepa
0810: 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20  redStmt *pNext; 
0820: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b   /* Next in link
0830: 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c  ed list */.  Sql
0840: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
0850: 72 65 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rev;  /* Previou
0860: 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  s on the list */
0870: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
0880: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54  *pStmt;     /* T
0890: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
08a0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
08b0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
08c0: 20 20 20 20 2f 2a 20 63 68 61 72 73 20 69 6e 20      /* chars in 
08d0: 7a 53 71 6c 5b 5d 20 2a 2f 0a 20 20 63 68 61 72  zSql[] */.  char
08e0: 20 7a 53 71 6c 5b 31 5d 3b 20 20 20 20 20 20 20   zSql[1];       
08f0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
0900: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
0910: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  t */.};../*.** T
0920: 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
0930: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
0940: 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 20  ucture for each 
0950: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a  SQLite database.
0960: 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  ** that has been
0970: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 53   opened by the S
0980: 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72 66  QLite TCL interf
0990: 61 63 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ace..*/.typedef 
09a0: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
09b0: 53 71 6c 69 74 65 44 62 3b 0a 73 74 72 75 63 74  SqliteDb;.struct
09c0: 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71   SqliteDb {.  sq
09d0: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
09e0: 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c      /* The "real
09f0: 22 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  " database struc
0a00: 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  ture */.  Tcl_In
0a10: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20  terp *interp;   
0a20: 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74  /* The interpret
0a30: 65 72 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  er used for this
0a40: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
0a50: 68 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20  har *zBusy;     
0a60: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 75 73 79       /* The busy
0a70: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0a80: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  e */.  char *zCo
0a90: 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  mmit;        /* 
0aa0: 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  The commit hook 
0ab0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0ac0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 61   */.  char *zTra
0ad0: 63 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ce;         /* T
0ae0: 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63  he trace callbac
0af0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0b00: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20  har *zProgress; 
0b10: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 67       /* The prog
0b20: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f  ress callback ro
0b30: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0b40: 2a 7a 41 75 74 68 3b 20 20 20 20 20 20 20 20 20  *zAuth;         
0b50: 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a   /* The authoriz
0b60: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72  ation callback r
0b70: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 71 6c 46  outine */.  SqlF
0b80: 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20  unc *pFunc;     
0b90: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c    /* List of SQL
0ba0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
0bb0: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c  SqlCollate *pCol
0bc0: 6c 61 74 65 3b 20 2f 2a 20 4c 69 73 74 20 6f 66  late; /* List of
0bd0: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
0be0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
0bf0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
0c00: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
0c10: 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e  de of most recen
0c20: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
0c30: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
0c40: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20  CollateNeeded;  
0c50: 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  /* Collation nee
0c60: 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ded script */.  
0c70: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
0c80: 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69  *stmtList; /* Li
0c90: 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  st of prepared s
0ca0: 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71  tatements*/.  Sq
0cb0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73  lPreparedStmt *s
0cc0: 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74  tmtLast; /* Last
0cd0: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
0ce0: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
0cf0: 6d 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20  maxStmt;        
0d00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
0d10: 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  xt maximum numbe
0d20: 72 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f  r of stmtList */
0d30: 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20  .  int nStmt;   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65   Number of state
0d60: 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73  ments in stmtLis
0d70: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46  t */.};../*.** F
0d80: 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65  inalize and free
0d90: 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61   a list of prepa
0da0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  red statements.*
0db0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c  /.static void fl
0dc0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 53 71  ushStmtCache( Sq
0dd0: 6c 69 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20  liteDb *pDb ){. 
0de0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0df0: 20 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77   *pPreStmt;..  w
0e00: 68 69 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74  hile(  pDb->stmt
0e10: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  List ){.    sqli
0e20: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44  te3_finalize( pD
0e30: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74  b->stmtList->pSt
0e40: 6d 74 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74  mt );.    pPreSt
0e50: 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
0e60: 73 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d  st;.    pDb->stm
0e70: 74 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d  tList = pDb->stm
0e80: 74 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  tList->pNext;.  
0e90: 20 20 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61    Tcl_Free( (cha
0ea0: 72 2a 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20  r*)pPreStmt );. 
0eb0: 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20   }.  pDb->nStmt 
0ec0: 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74  = 0;.  pDb->stmt
0ed0: 4c 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Last = 0;.}../*.
0ee0: 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69  ** TCL calls thi
0ef0: 73 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e  s procedure when
0f00: 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61   an sqlite3 data
0f10: 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a  base command is.
0f20: 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  ** deleted..*/.s
0f30: 74 61 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c  tatic void DbDel
0f40: 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29  eteCmd(void *db)
0f50: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
0f60: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64  b = (SqliteDb*)d
0f70: 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61  b;.  flushStmtCa
0f80: 63 68 65 28 70 44 62 29 3b 0a 20 20 73 71 6c 69  che(pDb);.  sqli
0f90: 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64  te3_close(pDb->d
0fa0: 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62  b);.  while( pDb
0fb0: 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53  ->pFunc ){.    S
0fc0: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20  qlFunc *pFunc = 
0fd0: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  pDb->pFunc;.    
0fe0: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  pDb->pFunc = pFu
0ff0: 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54  nc->pNext;.    T
1000: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
1010: 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69  Func);.  }.  whi
1020: 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  le( pDb->pCollat
1030: 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c  e ){.    SqlColl
1040: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20  ate *pCollate = 
1050: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20  pDb->pCollate;. 
1060: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
1070: 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65   = pCollate->pNe
1080: 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  xt;.    Tcl_Free
1090: 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65  ((char*)pCollate
10a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
10b0: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54  ->zBusy ){.    T
10c0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
10d0: 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  sy);.  }.  if( p
10e0: 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
10f0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
1100: 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69  zTrace);.  }.  i
1110: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
1120: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
1130: 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20  b->zAuth);.  }. 
1140: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1150: 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  )pDb);.}../*.** 
1160: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1170: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64 61  called when a da
1180: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6c  tabase file is l
1190: 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79 69  ocked while tryi
11a0: 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74 65  ng.** to execute
11b0: 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   SQL..*/.static 
11c0: 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c 65  int DbBusyHandle
11d0: 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74 20  r(void *cd, int 
11e0: 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69 74  nTries){.  Sqlit
11f0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
1200: 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20  teDb*)cd;.  int 
1210: 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b  rc;.  char zVal[
1220: 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6d  30];.  char *zCm
1230: 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  d;.  Tcl_DString
1240: 20 63 6d 64 3b 0a 0a 20 20 54 63 6c 5f 44 53 74   cmd;..  Tcl_DSt
1250: 72 69 6e 67 49 6e 69 74 28 26 63 6d 64 29 3b 0a  ringInit(&cmd);.
1260: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
1270: 65 6e 64 28 26 63 6d 64 2c 20 70 44 62 2d 3e 7a  end(&cmd, pDb->z
1280: 42 75 73 79 2c 20 2d 31 29 3b 0a 20 20 73 70 72  Busy, -1);.  spr
1290: 69 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64 22 2c  intf(zVal, "%d",
12a0: 20 6e 54 72 69 65 73 29 3b 0a 20 20 54 63 6c 5f   nTries);.  Tcl_
12b0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
12c0: 6d 65 6e 74 28 26 63 6d 64 2c 20 7a 56 61 6c 29  ment(&cmd, zVal)
12d0: 3b 0a 20 20 7a 43 6d 64 20 3d 20 54 63 6c 5f 44  ;.  zCmd = Tcl_D
12e0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 63 6d 64  StringValue(&cmd
12f0: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  );.  rc = Tcl_Ev
1300: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
1310: 7a 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zCmd);.  Tcl_DSt
1320: 72 69 6e 67 46 72 65 65 28 26 63 6d 64 29 3b 0a  ringFree(&cmd);.
1330: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
1340: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
1350: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
1360: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
1370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1380: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1390: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13a0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20  e is invoked as 
13b0: 74 68 65 20 27 70 72 6f 67 72 65 73 73 20 63 61  the 'progress ca
13c0: 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20  llback' for the 
13d0: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
13e0: 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65  tic int DbProgre
13f0: 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ssHandler(void *
1400: 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  cd){.  SqliteDb 
1410: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
1420: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
1430: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
1440: 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72  zProgress );.  r
1450: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
1460: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
1470: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28  Progress);.  if(
1480: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
1490: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
14a0: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
14b0: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
14c0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
14d0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
14e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
14f0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51  called by the SQ
1500: 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c  Lite trace handl
1510: 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65  er whenever a ne
1520: 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51  w.** block of SQ
1530: 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  L is executed.  
1540: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
1550: 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73  n pDb->zTrace is
1560: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74   executed..*/.st
1570: 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63  atic void DbTrac
1580: 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  eHandler(void *c
1590: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
15a0: 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  Sql){.  SqliteDb
15b0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
15c0: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74  b*)cd;.  Tcl_DSt
15d0: 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c  ring str;..  Tcl
15e0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
15f0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
1600: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
1610: 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a  b->zTrace, -1);.
1620: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
1630: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
1640: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76   zSql);.  Tcl_Ev
1650: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
1660: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
1670: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
1680: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
1690: 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
16a0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
16b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
16d0: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
16e0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
16f0: 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73  d.  The.** TCL s
1700: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43  cript in pDb->zC
1710: 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65  ommit is execute
1720: 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e  d.  If it return
1730: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a  s non-zero or.**
1740: 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e   if it throws an
1750: 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20   exception, the 
1760: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1770: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65  olled back inste
1780: 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63  ad.** of being c
1790: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61  ommitted..*/.sta
17a0: 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74  tic int DbCommit
17b0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
17c0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
17d0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
17e0: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
17f0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
1800: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
1810: 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  >zCommit);.  if(
1820: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
1830: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
1840: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
1850: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
1860: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
1870: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
1880: 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65   void tclCollate
1890: 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a  Needed(.  void *
18a0: 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20  pCtx,.  sqlite3 
18b0: 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  *db,.  int enc,.
18c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
18d0: 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  ame.){.  SqliteD
18e0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
18f0: 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  Db *)pCtx;.  Tcl
1900: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
1910: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
1920: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
1930: 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  eded);.  Tcl_Inc
1940: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
1950: 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  t);.  Tcl_ListOb
1960: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
1970: 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e  , pScript, Tcl_N
1980: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d  ewStringObj(zNam
1990: 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  e, -1));.  Tcl_E
19a0: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
19b0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
19c0: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
19d0: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
19e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
19f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1a00: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
1a10: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
1a20: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65  ction implemente
1a30: 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73  d.** using TCL s
1a40: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
1a50: 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61   int tclSqlColla
1a60: 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  te(.  void *pCtx
1a70: 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f  ,.  int nA,.  co
1a80: 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
1a90: 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20  int nB,.  const 
1aa0: 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71  void *zB.){.  Sq
1ab0: 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53  lCollate *p = (S
1ac0: 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78  qlCollate *)pCtx
1ad0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
1ae0: 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c  d;..  pCmd = Tcl
1af0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d  _NewStringObj(p-
1b00: 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20  >zScript, -1);. 
1b10: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
1b20: 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c  t(pCmd);.  Tcl_L
1b30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1b40: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
1b50: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
1b60: 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a  ngObj(zA, nA));.
1b70: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1b80: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
1b90: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  terp, pCmd, Tcl_
1ba0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c  NewStringObj(zB,
1bb0: 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   nB));.  Tcl_Eva
1bc0: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
1bd0: 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 54 63  , pCmd, 0);.  Tc
1be0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
1bf0: 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmd);.  return (
1c00: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
1c10: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
1c20: 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rp)));.}../*.** 
1c30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1c40: 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61  called to evalua
1c50: 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69  te an SQL functi
1c60: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
1c70: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
1c80: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
1c90: 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71  id tclSqlFunc(sq
1ca0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1cb0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
1cc0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
1cd0: 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e  *argv){.  SqlFun
1ce0: 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75  c *p = sqlite3_u
1cf0: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
1d00: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
1d10: 20 63 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   cmd;.  int i;. 
1d20: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 63 6c 5f   int rc;..  Tcl_
1d30: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 63 6d 64  DStringInit(&cmd
1d40: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
1d50: 41 70 70 65 6e 64 28 26 63 6d 64 2c 20 70 2d 3e  Append(&cmd, p->
1d60: 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20  zScript, -1);.  
1d70: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
1d80: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
1d90: 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69  QLITE_NULL==sqli
1da0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1db0: 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  rgv[i]) ){.     
1dc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
1dd0: 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64 2c 20  ndElement(&cmd, 
1de0: 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  "");.    }else{.
1df0: 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e        Tcl_DStrin
1e00: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
1e10: 63 6d 64 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  cmd, sqlite3_val
1e20: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
1e30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1e40: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 2d 3e  c = Tcl_Eval(p->
1e50: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
1e60: 69 6e 67 56 61 6c 75 65 28 26 63 6d 64 29 29 3b  ingValue(&cmd));
1e70: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1e80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1e90: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
1ea0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1eb0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
1ec0: 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1); .  }else{.  
1ed0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1ee0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 54  _text(context, T
1ef0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1f00: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
1f10: 31 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49  1, .        SQLI
1f20: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
1f30: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
1f40: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1f50: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68  IZATION./*.** Th
1f60: 69 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e  is is the authen
1f70: 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  tication functio
1f80: 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74  n.  It appends t
1f90: 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  he authenticatio
1fa0: 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61  n.** type code a
1fb0: 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d  nd the two argum
1fc0: 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74  ents to zCmd[] t
1fd0: 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  hen invokes the 
1fe0: 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65  result.** on the
1ff0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54   interpreter.  T
2000: 68 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d  he reply is exam
2010: 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  ined to determin
2020: 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68  e if the.** auth
2030: 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73  entication fails
2040: 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f   or succeeds..*/
2050: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68  .static int auth
2060: 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  _callback(.  voi
2070: 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63  d *pArg,.  int c
2080: 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode,.  const cha
2090: 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73  r *zArg1,.  cons
20a0: 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20  t char *zArg2,. 
20b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
20c0: 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g3,.  const char
20d0: 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61   *zArg4.){.  cha
20e0: 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f  r *zCode;.  Tcl_
20f0: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69  DString str;.  i
2100: 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
2110: 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53  har *zReply;.  S
2120: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
2130: 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a  SqliteDb*)pArg;.
2140: 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20  .  switch( code 
2150: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
2160: 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20  TE_COPY         
2170: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
2180: 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61  LITE_COPY"; brea
2190: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
21a0: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20  TE_CREATE_INDEX 
21b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
21c0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
21d0: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
21e0: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
21f0: 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a  E_TABLE      : z
2200: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
2210: 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  ATE_TABLE"; brea
2220: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2230: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
2240: 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51  NDEX : zCode="SQ
2250: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
2260: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
2270: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2280: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
2290: 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  E : zCode="SQLIT
22a0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
22b0: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
22c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
22d0: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
22e0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
22f0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47  CREATE_TEMP_TRIG
2300: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
2310: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
2320: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a  ATE_TEMP_VIEW  :
2330: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
2340: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22  REATE_TEMP_VIEW"
2350: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
2360: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
2370: 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f  TRIGGER    : zCo
2380: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
2390: 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  E_TRIGGER"; brea
23a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
23b0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20  TE_CREATE_VIEW  
23c0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
23d0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
23e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
23f0: 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  se SQLITE_DELETE
2400: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
2410: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45  ode="SQLITE_DELE
2420: 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TE"; break;.    
2430: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
2440: 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20  _INDEX        : 
2450: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
2460: 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  OP_INDEX"; break
2470: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2480: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20  E_DROP_TABLE    
2490: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
24a0: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b  ITE_DROP_TABLE";
24b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
24c0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
24d0: 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64  P_INDEX   : zCod
24e0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
24f0: 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  EMP_INDEX"; brea
2500: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2510: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
2520: 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  LE   : zCode="SQ
2530: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
2540: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
2550: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
2560: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20  OP_TEMP_TRIGGER 
2570: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
2580: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
2590: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
25a0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
25b0: 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a  TEMP_VIEW    : z
25c0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
25d0: 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  P_TEMP_VIEW"; br
25e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
25f0: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
2600: 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  R      : zCode="
2610: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
2620: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
2630: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
2640: 50 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a  P_VIEW         :
2650: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
2660: 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  ROP_VIEW"; break
2670: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2680: 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20  E_INSERT        
2690: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
26a0: 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65  ITE_INSERT"; bre
26b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
26c0: 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20  ITE_PRAGMA      
26d0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
26e0: 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62  QLITE_PRAGMA"; b
26f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2700: 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20  QLITE_READ      
2710: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
2720: 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62  "SQLITE_READ"; b
2730: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2740: 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20  QLITE_SELECT    
2750: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
2760: 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b  "SQLITE_SELECT";
2770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2780: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
2790: 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  ION       : zCod
27a0: 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e="SQLITE_TRANSA
27b0: 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20  CTION"; break;. 
27c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
27d0: 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20  PDATE           
27e0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
27f0: 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b  _UPDATE"; break;
2800: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2810: 5f 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20  _ATTACH         
2820: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
2830: 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61  TE_ATTACH"; brea
2840: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2850: 54 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20  TE_DETACH       
2860: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
2870: 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72  LITE_DETACH"; br
2880: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2890: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
28a0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
28b0: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
28c0: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
28d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e  case SQLITE_REIN
28e0: 44 45 58 20 20 20 20 20 20 20 20 20 20 20 3a 20  DEX           : 
28f0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
2900: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
2910: 20 20 20 64 65 66 61 75 6c 74 20 20 20 20 20 20     default      
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b   : zCode="????";
2940: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63   break;.  }.  Tc
2950: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
2960: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
2970: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
2980: 44 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a  Db->zAuth, -1);.
2990: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
29a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
29b0: 20 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44   zCode);.  Tcl_D
29c0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
29d0: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20  ent(&str, zArg1 
29e0: 3f 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20  ? zArg1 : "");. 
29f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2a00: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
2a10: 7a 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20  zArg2 ? zArg2 : 
2a20: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
2a30: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
2a40: 26 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41  &str, zArg3 ? zA
2a50: 72 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg3 : "");.  Tcl
2a60: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
2a70: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
2a80: 34 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b  4 ? zArg4 : "");
2a90: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62  .  rc = Tcl_Glob
2aa0: 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  alEval(pDb->inte
2ab0: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
2ac0: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
2ad0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
2ae0: 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d  str);.  zReply =
2af0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
2b00: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
2b10: 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  );.  if( strcmp(
2b20: 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f  zReply,"SQLITE_O
2b30: 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  K")==0 ){.    rc
2b40: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b50: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
2b60: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
2b70: 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20  DENY")==0 ){.   
2b80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e   rc = SQLITE_DEN
2b90: 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  Y;.  }else if( s
2ba0: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
2bb0: 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30  LITE_IGNORE")==0
2bc0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2bd0: 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65  ITE_IGNORE;.  }e
2be0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39  lse{.    rc = 99
2bf0: 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  9;.  }.  return 
2c00: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
2c10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
2c20: 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a  ORIZATION */../*
2c30: 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20 61 20 70  .** zText is a p
2c40: 6f 69 6e 74 65 72 20 74 6f 20 74 65 78 74 20 6f  ointer to text o
2c50: 62 74 61 69 6e 65 64 20 76 69 61 20 61 6e 20 73  btained via an s
2c60: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
2c70: 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c  xt().** or simil
2c80: 61 72 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68  ar interface. Th
2c90: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2ca0: 6e 73 20 61 20 54 63 6c 20 73 74 72 69 6e 67 20  ns a Tcl string 
2cb0: 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65  object, .** refe
2cc0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 73 65 74 20  rence count set 
2cd0: 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67  to 0, containing
2ce0: 20 74 68 65 20 74 65 78 74 2e 20 49 66 20 61 20   the text. If a 
2cf0: 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62  translation.** b
2d00: 65 74 77 65 65 6e 20 69 73 6f 38 38 35 39 20 61  etween iso8859 a
2d10: 6e 64 20 55 54 46 2d 38 20 69 73 20 72 65 71 75  nd UTF-8 is requ
2d20: 69 72 65 64 2c 20 69 74 20 69 73 20 70 72 65 66  ired, it is pref
2d30: 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ormed..*/.static
2d40: 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74   Tcl_Obj *dbText
2d50: 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73 74  ToObj(char const
2d60: 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f   *zText){.  Tcl_
2d70: 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65  Obj *pVal;.#ifde
2d80: 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f  f UTF_TRANSLATIO
2d90: 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f 44  N_NEEDED.  Tcl_D
2da0: 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54  String dCol;.  T
2db0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2dc0: 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74  dCol);.  Tcl_Ext
2dd0: 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e  ernalToUtfDStrin
2de0: 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d  g(NULL, zText, -
2df0: 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61  1, &dCol);.  pVa
2e00: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
2e10: 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67  gObj(Tcl_DString
2e20: 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31  Value(&dCol), -1
2e30: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
2e40: 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c  Free(&dCol);.#el
2e50: 73 65 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f  se.  pVal = Tcl_
2e60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65  NewStringObj(zTe
2e70: 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a  xt, -1);.#endif.
2e80: 20 20 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d    return pVal;.}
2e90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2ea0: 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e  tine reads a lin
2eb0: 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46  e of text from F
2ec0: 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a  ILE in, stores.*
2ed0: 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65  * the text in me
2ee0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
2ef0: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  om malloc() and 
2f00: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
2f10: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74  r.** to the text
2f20: 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  .  NULL is retur
2f30: 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69  ned at end of fi
2f40: 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63  le, or if malloc
2f50: 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a  ().** fails..**.
2f60: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
2f70: 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69   is like "readli
2f80: 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61  ne" but no comma
2f90: 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a  nd-line editing.
2fa0: 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  ** is done..**.*
2fb0: 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68  * copied from sh
2fc0: 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70  ell.c from '.imp
2fd0: 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a  ort' command.*/.
2fe0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63  static char *loc
2ff0: 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20  al_getline(char 
3000: 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a  *zPrompt, FILE *
3010: 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  in){.  char *zLi
3020: 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b  ne;.  int nLine;
3030: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
3040: 65 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20  eol;..  nLine = 
3050: 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d  100;.  zLine = m
3060: 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a  alloc( nLine );.
3070: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
3080: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d   return 0;.  n =
3090: 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20   0;.  eol = 0;. 
30a0: 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a   while( !eol ){.
30b0: 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c      if( n+100>nL
30c0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69  ine ){.      nLi
30d0: 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31  ne = nLine*2 + 1
30e0: 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20  00;.      zLine 
30f0: 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c  = realloc(zLine,
3100: 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69   nLine);.      i
3110: 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65  f( zLine==0 ) re
3120: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
3130: 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69    if( fgets(&zLi
3140: 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e  ne[n], nLine - n
3150: 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , in)==0 ){.    
3160: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
3170: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
3180: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3190: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
31a0: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
31b0: 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a  .      eol = 1;.
31c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31d0: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c   }.    while( zL
31e0: 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d  ine[n] ){ n++; }
31f0: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
3200: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27  zLine[n-1]=='\n'
3210: 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20   ){.      n--;. 
3220: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
3230: 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31  0;.      eol = 1
3240: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c  ;.    }.  }.  zL
3250: 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a  ine = realloc( z
3260: 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72  Line, n+1 );.  r
3270: 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a  eturn zLine;.}..
3280: 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74  /*.** The "sqlit
3290: 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77  e" command below
32a0: 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 54   creates a new T
32b0: 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65  cl command for e
32c0: 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ach.** connectio
32d0: 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e  n it opens to an
32e0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
32f0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
3300: 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68  is invoked.** wh
3310: 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68  enever one of th
3320: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73  ose connection-s
3330: 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73  pecific commands
3340: 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   is executed.** 
3350: 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61  in Tcl.  For exa
3360: 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e  mple, if you run
3370: 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74   Tcl code like t
3380: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
3390: 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d   sqlite3 db1  "m
33a0: 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20  y_database".**  
33b0: 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a       db1 close.*
33c0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63  *.** The first c
33d0: 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63  ommand opens a c
33e0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
33f0: 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64   "my_database" d
3400: 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63  atabase.** and c
3410: 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63  alls that connec
3420: 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65  tion "db1".  The
3430: 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20   second command 
3440: 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73  causes this.** s
3450: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20  ubroutine to be 
3460: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
3470: 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28  ic int DbObjCmd(
3480: 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
3490: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
34a0: 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
34b0: 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
34c0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
34d0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
34e0: 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e  int choice;.  in
34f0: 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20  t rc = TCL_OK;. 
3500: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
3510: 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20  ar *DB_strs[] = 
3520: 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65  {.    "authorize
3530: 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75 73  r",         "bus
3540: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
3550: 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22 63   "cache",.    "c
3560: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
3570: 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20 20      "close",    
3580: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74           "collat
3590: 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 69  e",.    "collati
35a0: 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22 63  on_needed",   "c
35b0: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20  ommit_hook",    
35c0: 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a 20     "complete",. 
35d0: 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20     "copy",      
35e0: 20 20 20 20 20 20 20 20 20 22 65 72 72 6f 72 63           "errorc
35f0: 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 22 65  ode",         "e
3600: 76 61 6c 22 2c 0a 20 20 20 20 22 66 75 6e 63 74  val",.    "funct
3610: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  ion",           
3620: 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  "last_insert_row
3630: 69 64 22 2c 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22  id", "onecolumn"
3640: 2c 0a 20 20 20 20 22 70 72 6f 67 72 65 73 73 22  ,.    "progress"
3650: 2c 20 20 20 20 20 20 20 20 20 20 20 22 72 65 6b  ,           "rek
3660: 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey",            
3670: 20 22 74 69 6d 65 6f 75 74 22 2c 0a 20 20 20 20   "timeout",.    
3680: 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c  "total_changes",
3690: 20 20 20 20 20 20 22 74 72 61 63 65 22 2c 20 20        "trace",  
36a0: 20 20 20 20 20 20 20 20 20 20 20 22 76 65 72 73             "vers
36b0: 69 6f 6e 22 2c 0a 20 20 20 20 30 20 20 20 20 20  ion",.    0     
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
36d0: 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65    };.  enum DB_e
36e0: 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54  num {.    DB_AUT
36f0: 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20  HORIZER,        
3700: 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20 20 20  DB_BUSY,        
3710: 20 20 20 20 20 44 42 5f 43 41 43 48 45 2c 0a 20       DB_CACHE,. 
3720: 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20 20     DB_CHANGES,  
3730: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c 4f 53           DB_CLOS
3740: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42  E,            DB
3750: 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20 20 44 42  _COLLATE,.    DB
3760: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
3770: 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f  D,  DB_COMMIT_HO
3780: 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43 4f 4d 50  OK,      DB_COMP
3790: 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 50  LETE,.    DB_COP
37a0: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,              
37b0: 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20 20 20  DB_ERRORCODE,   
37c0: 20 20 20 20 20 44 42 5f 45 56 41 4c 2c 0a 20 20       DB_EVAL,.  
37d0: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20    DB_FUNCTION,  
37e0: 20 20 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f          DB_LAST_
37f0: 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 44 42 5f  INSERT_ROWID,DB_
3800: 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44  ONECOLUMN,.    D
3810: 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20 20 20  B_PROGRESS,     
3820: 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20 20       DB_REKEY,  
3830: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 49 4d            DB_TIM
3840: 45 4f 55 54 2c 0a 20 20 20 20 44 42 5f 54 4f 54  EOUT,.    DB_TOT
3850: 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20  AL_CHANGES,     
3860: 44 42 5f 54 52 41 43 45 2c 20 20 20 20 20 20 20  DB_TRACE,       
3870: 20 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 0a       DB_VERSION.
3880: 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20    };.  /* don't 
3890: 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63  leave trailing c
38a0: 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d  ommas on DB_enum
38b0: 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68  , it confuses th
38c0: 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c  e AIX xlc compil
38d0: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  er */..  if( obj
38e0: 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
38f0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
3900: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 1, objv, "SU
3910: 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a  BCOMMAND ...");.
3920: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3930: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
3940: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
3950: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
3960: 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f  [1], DB_strs, "o
3970: 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69  ption", 0, &choi
3980: 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ce) ){.    retur
3990: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
39a0: 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75  ..  switch( (enu
39b0: 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65  m DB_enum)choice
39c0: 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   ){..  /*    $db
39d0: 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c   authorizer ?CAL
39e0: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
39f0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
3a00: 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  n callback to au
3a10: 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c  thorize each SQL
3a20: 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74   operation as it
3a30: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   is.  ** compile
3a40: 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20  d.  5 arguments 
3a50: 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20  are appended to 
3a60: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66  the callback bef
3a70: 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  ore it is.  ** i
3a80: 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  nvoked:.  **.  *
3a90: 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68  *   (1) The auth
3aa0: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28  orization type (
3ab0: 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ex: SQLITE_CREAT
3ac0: 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f  E_TABLE, SQLITE_
3ad0: 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a  INSERT, ...).  *
3ae0: 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65  *   (2) First de
3af0: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28  scriptive name (
3b00: 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f  depends on autho
3b10: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20  rization type). 
3b20: 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64   **   (3) Second
3b30: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
3b40: 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d  e.  **   (4) Nam
3b50: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
3b60: 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22  e (ex: "main", "
3b70: 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35  temp").  **   (5
3b80: 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65  ) Name of trigge
3b90: 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20  r that is doing 
3ba0: 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a  the access.  **.
3bb0: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63    ** The callbac
3bc0: 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  k should return 
3bd0: 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  on of the follow
3be0: 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c  ing strings: SQL
3bf0: 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c  ITE_OK,.  ** SQL
3c00: 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53  ITE_IGNORE, or S
3c10: 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79  QLITE_DENY.  Any
3c20: 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
3c30: 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  lue is an error.
3c40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
3c50: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76  is method is inv
3c60: 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67  oked with no arg
3c70: 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72  uments, the curr
3c80: 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ent authorizatio
3c90: 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  n.  ** callback 
3ca0: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
3cb0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
3cc0: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b  DB_AUTHORIZER: {
3cd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
3ce0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
3cf0: 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  N.    Tcl_Append
3d00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
3d10: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f  authorization no
3d20: 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
3d30: 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a  his build", 0);.
3d40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3d50: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
3d60: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
3d70: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
3d80: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
3d90: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
3da0: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
3db0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
3dc0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
3dd0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
3de0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
3df0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
3e00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
3e10: 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20  Db->zAuth, 0);. 
3e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
3e30: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41  {.      char *zA
3e40: 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  uth;.      int l
3e50: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
3e60: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
3e70: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3e80: 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20  ->zAuth);.      
3e90: 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20  }.      zAuth = 
3ea0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3eb0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
3ec0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
3ed0: 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Auth && len>0 ){
3ee0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
3ef0: 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  uth = Tcl_Alloc(
3f00: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
3f10: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
3f20: 7a 41 75 74 68 2c 20 7a 41 75 74 68 29 3b 0a 20  zAuth, zAuth);. 
3f30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3f40: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
3f50: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3f60: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
3f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
3f80: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
3f90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3fa0: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
3fb0: 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63  (pDb->db, auth_c
3fc0: 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20  allback, pDb);. 
3fd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3fe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
3ff0: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
4000: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
4010: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
4020: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4030: 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79    /*    $db busy
4040: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
4050: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
4060: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
4070: 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  if an SQL statem
4080: 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ent attempts to 
4090: 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  open.  ** a lock
40a0: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
40b0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
40c0: 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28  _BUSY: {.    if(
40d0: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
40e0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
40f0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
4100: 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a  v, "CALLBACK");.
4110: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
4120: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
4130: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
4140: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
4150: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
4160: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4170: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
4180: 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  Busy, 0);.      
4190: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
41a0: 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a     char *zBusy;.
41b0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
41c0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
41d0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
41e0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
41f0: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
4200: 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47     zBusy = Tcl_G
4210: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
4220: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
4230: 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20        if( zBusy 
4240: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
4250: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
4260: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
4270: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
4280: 74 72 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79  trcpy(pDb->zBusy
4290: 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20  , zBusy);.      
42a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
42b0: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20  Db->zBusy = 0;. 
42c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
42d0: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
42e0: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
42f0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
4300: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
4310: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
4320: 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  b, DbBusyHandler
4330: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
4340: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4350: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
4360: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
4370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4380: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4390: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63    /*     $db cac
43a0: 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20  he flush.  **   
43b0: 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a 65    $db cache size
43c0: 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75   n.  **.  ** Flu
43d0: 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64 20  sh the prepared 
43e0: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c  statement cache,
43f0: 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78 69   or set the maxi
4400: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  mum number of.  
4410: 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  ** cached statem
4420: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ents..  */.  cas
4430: 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20  e DB_CACHE: {.  
4440: 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a    char *subCmd;.
4450: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
4460: 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20  if( objc<=2 ){. 
4470: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
4480: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
4490: 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70   objv, "cache op
44a0: 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20  tion ?arg?");.  
44b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
44c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
44d0: 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74  subCmd = Tcl_Get
44e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f  StringFromObj( o
44f0: 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20  bjv[2], 0 );.   
4500: 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66   if( *subCmd=='f
4510: 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43  ' && strcmp(subC
4520: 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29  md,"flush")==0 )
4530: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
4540: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
4550: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
4560: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
4570: 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20   "flush");.     
4580: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4590: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
45a0: 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53  {.        flushS
45b0: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
45c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
45d0: 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d  se if( *subCmd==
45e0: 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  's' && strcmp(su
45f0: 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20  bCmd,"size")==0 
4600: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
4610: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=4 ){.        
4620: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
4630: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
4640: 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20  , "size n");.   
4650: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
4660: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
4670: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
4680: 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47  TCL_ERROR==Tcl_G
4690: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
46a0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
46b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
46c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
46d0: 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74   interp, "cannot
46e0: 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20   convert \"", . 
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
4700: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
4710: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22  bj(objv[3],0), "
4720: 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20  \" to integer", 
4730: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
4740: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4750: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4760: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30           if( n<0
4770: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4780: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
4790: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  pDb );.         
47a0: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
47b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
47c0: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
47d0: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
47e0: 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52    n = MAX_PREPAR
47f0: 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20  ED_STMTS;.      
4800: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4810: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e  pDb->maxStmt = n
4820: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4830: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
4840: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
4850: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
4860: 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20  bad option \"", 
4870: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
4880: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
4890: 6f 62 6a 76 5b 30 5d 2c 30 29 2c 20 22 5c 22 3a  objv[0],0), "\":
48a0: 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f   must be flush o
48b0: 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20  r size", 0);.   
48c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
48d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
48e0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
48f0: 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a      $db changes.
4900: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
4910: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
4920: 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
4930: 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
4940: 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a  , or deleted by.
4950: 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65    ** the most re
4960: 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44  cent INSERT, UPD
4970: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
4980: 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63  atement, not inc
4990: 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79  luding .  ** any
49a0: 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
49b0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
49c0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
49d0: 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  B_CHANGES: {.   
49e0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
49f0: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
4a00: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
4a10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
4a20: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
4a30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4a40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
4a50: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
4a60: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
4a70: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
4a80: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
4a90: 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  lt, sqlite3_chan
4aa0: 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
4ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
4ac0: 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65   /*    $db close
4ad0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64  .  **.  ** Shutd
4ae0: 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  own the database
4af0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
4b00: 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c  CLOSE: {.    Tcl
4b10: 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69  _DeleteCommand(i
4b20: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
4b30: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
4b40: 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72  [0], 0));.    br
4b50: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
4b60: 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f    $db commit_hoo
4b70: 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  k ?CALLBACK?.  *
4b80: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
4b90: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
4ba0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d   just before com
4bb0: 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51  mitting every SQ
4bc0: 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  L transaction.. 
4bd0: 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62   ** If the callb
4be0: 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78  ack throws an ex
4bf0: 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72  ception or retur
4c00: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
4c10: 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  n the.  ** trans
4c20: 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65  action is aborte
4c30: 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20  d.  If CALLBACK 
4c40: 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  is an empty stri
4c50: 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ng, the callback
4c60: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
4c70: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
4c80: 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b  B_COMMIT_HOOK: {
4c90: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
4ca0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
4cb0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
4cc0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
4cd0: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
4ce0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4cf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4d00: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
4d10: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
4d20: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
4d30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4d40: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d  terp, pDb->zComm
4d50: 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  it, 0);.      }.
4d60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4d70: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a   char *zCommit;.
4d80: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
4d90: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
4da0: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
4db0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
4dc0: 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  Commit);.      }
4dd0: 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d  .      zCommit =
4de0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
4df0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
4e00: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
4e10: 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30  zCommit && len>0
4e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
4e30: 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41  >zCommit = Tcl_A
4e40: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
4e50: 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
4e60: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43  pDb->zCommit, zC
4e70: 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 65  ommit);.      }e
4e80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
4e90: 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20  ->zCommit = 0;. 
4ea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4eb0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b   pDb->zCommit ){
4ec0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
4ed0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
4ee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
4ef0: 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e  ommit_hook(pDb->
4f00: 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  db, DbCommitHand
4f10: 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
4f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4f30: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
4f40: 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ook(pDb->db, 0, 
4f50: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
4f60: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
4f70: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
4f80: 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45  $db collate NAME
4f90: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
4fa0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
4fb0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
4fc0: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
4fd0: 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a  E.  Whenever.  *
4fe0: 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
4ff0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  is called, invok
5000: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
5010: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
5020: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
5030: 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  B_COLLATE: {.   
5040: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
5050: 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20  llate;.    char 
5060: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
5070: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
5080: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
5090: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
50a0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
50b0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
50c0: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
50d0: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
50e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
50f0: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
5100: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
5110: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
5120: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
5130: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
5140: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
5150: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43  nScript);.    pC
5160: 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c  ollate = (SqlCol
5170: 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  late*)Tcl_Alloc(
5180: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74   sizeof(*pCollat
5190: 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31  e) + nScript + 1
51a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
51b0: 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  late==0 ) return
51c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
51d0: 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70  pCollate->interp
51e0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70   = interp;.    p
51f0: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d  Collate->pNext =
5200: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
5210: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53      pCollate->zS
5220: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
5230: 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20  pCollate[1];.   
5240: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
5250: 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 73   pCollate;.    s
5260: 74 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e  trcpy(pCollate->
5270: 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74  zScript, zScript
5280: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
5290: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
52a0: 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
52b0: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  me, SQLITE_UTF8,
52c0: 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61   .        pColla
52d0: 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74  te, tclSqlCollat
52e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
52f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5300: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
5310: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
5320: 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f    $db collation_
5330: 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20  needed SCRIPT.  
5340: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
5350: 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
5360: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
5370: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
5380: 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
5390: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
53a0: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
53b0: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
53c0: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
53d0: 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  case DB_COLLATIO
53e0: 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20  N_NEEDED: {.    
53f0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
5400: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
5410: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
5420: 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
5430: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
5440: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5450: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f      if( pDb->pCo
5460: 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
5470: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
5480: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
5490: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
54a0: 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  }.    pDb->pColl
54b0: 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f  ateNeeded = Tcl_
54c0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
54d0: 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49  v[2]);.    Tcl_I
54e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
54f0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
5500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
5510: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70  llation_needed(p
5520: 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c  Db->db, pDb, tcl
5530: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
5540: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
5550: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70    /*    $db comp
5560: 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20  lete SQL.  **.  
5570: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
5580: 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c  f SQL is a compl
5590: 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
55a0: 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  t.  Return FALSE
55b0: 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f   if.  ** additio
55c0: 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70  nal lines of inp
55d0: 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20  ut are needed.  
55e0: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
55f0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c  to the.  ** buil
5600: 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c  t-in "info compl
5610: 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20  ete" command of 
5620: 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  Tcl..  */.  case
5630: 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a   DB_COMPLETE: {.
5640: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
5650: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  sult;.    int is
5660: 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66  Complete;.    if
5670: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
5680: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
5690: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
56a0: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
56b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
56c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
56d0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69  sComplete = sqli
56e0: 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63  te3_complete( Tc
56f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
5700: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29  bj(objv[2], 0) )
5710: 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  ;.    pResult = 
5720: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
5730: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
5740: 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_SetBooleanObj(
5750: 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c  pResult, isCompl
5760: 65 74 65 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ete);.    break;
5770: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
5780: 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65     $db errorcode
5790: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
57a0: 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72  n the numeric er
57b0: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61  ror code that wa
57c0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
57d0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20  e most recent.  
57e0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
57f0: 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a  e3_exec()..  */.
5800: 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43    case DB_ERRORC
5810: 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ODE: {.    Tcl_S
5820: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
5830: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
5840: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  j(sqlite3_errcod
5850: 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  e(pDb->db)));.  
5860: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20    break;.  }.   
5870: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
5880: 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72  b eval $sql ?arr
5890: 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e  ay? ?{  ...code.
58a0: 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24 64  .. }?.  **    $d
58b0: 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c  b onecolumn $sql
58c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53  .  **.  ** The S
58d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
58e0: 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65  $sql is evaluate
58f0: 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77  d.  For each row
5900: 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  , the values are
5910: 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20  .  ** placed in 
5920: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
5930: 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72  array named "arr
5940: 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e  ay" and ...code.
5950: 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  .. is executed..
5960: 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20    ** If "array" 
5970: 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f  and "code" are o
5980: 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20  mitted, then no 
5990: 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72  callback is ever
59a0: 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20  y invoked..  ** 
59b0: 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e  If "array" is an
59c0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
59d0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61  hen the values a
59e0: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72  re placed in var
59f0: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74  iables.  ** that
5a00: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
5a10: 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64  ame as the field
5a20: 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74  s extracted by t
5a30: 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  he query..  **. 
5a40: 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d   ** The onecolum
5a50: 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20  n method is the 
5a60: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20  equivalent of:. 
5a70: 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b   **     lindex [
5a80: 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30  $db eval $sql] 0
5a90: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
5aa0: 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61 73  ONECOLUMN:.  cas
5ab0: 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20 20 20  e DB_EVAL: {.   
5ac0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71   char const *zSq
5ad0: 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  l;      /* Next 
5ae0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
5af0: 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 20 20   execute */.    
5b00: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4c 65 66  char const *zLef
5b10: 74 3b 20 20 20 20 20 2f 2a 20 57 68 61 74 20 69  t;     /* What i
5b20: 73 20 6c 65 66 74 20 61 66 74 65 72 20 66 69 72  s left after fir
5b30: 73 74 20 73 74 6d 74 20 69 6e 20 7a 53 71 6c 20  st stmt in zSql 
5b40: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
5b50: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a  tmt *pStmt;   /*
5b60: 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74   Compiled SQL st
5b70: 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 54 63  atment */.    Tc
5b80: 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20  l_Obj *pArray;  
5b90: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
5ba0: 61 72 72 61 79 20 69 6e 74 6f 20 77 68 69 63 68  array into which
5bb0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69   results are wri
5bc0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  tten */.    Tcl_
5bd0: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20  Obj *pScript;   
5be0: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 74 6f 20     /* Script to 
5bf0: 72 75 6e 20 66 6f 72 20 65 61 63 68 20 72 65 73  run for each res
5c00: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 54  ult set */.    T
5c10: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b  cl_Obj **apParm;
5c20: 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74        /* Paramet
5c30: 65 72 73 20 74 68 61 74 20 6e 65 65 64 20 61 20  ers that need a 
5c40: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5c50: 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  () */.    int nP
5c60: 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  arm;            
5c70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
5c80: 74 72 69 65 73 20 75 73 65 64 20 69 6e 20 61 70  tries used in ap
5c90: 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54 63  Parm[] */.    Tc
5ca0: 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b 31 30 5d  l_Obj *aParm[10]
5cb0: 3b 20 20 20 20 2f 2a 20 53 74 61 74 69 63 20 73  ;    /* Static s
5cc0: 70 61 63 65 20 66 6f 72 20 61 70 50 61 72 6d 5b  pace for apParm[
5cd0: 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ] in the common 
5ce0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  case */.    Tcl_
5cf0: 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20 20 20 20  Obj *pRet;      
5d00: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62     /* Value to b
5d10: 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 20 20  e returned */.  
5d20: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
5d30: 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 2f 2a  t *pPreStmt;  /*
5d40: 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72   Pointer to a pr
5d50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
5d60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   */.    int rc2;
5d70: 0a 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ..    if( choice
5d80: 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
5d90: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
5da0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
5db0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
5dc0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
5dd0: 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 20   "SQL");.       
5de0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5df0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
5e00: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d   pRet = 0;.    }
5e10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
5e20: 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35  objc<3 || objc>5
5e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5e40: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
5e50: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
5e60: 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20  QL ?ARRAY-NAME? 
5e70: 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
5e80: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5e90: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
5ea0: 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e      pRet = Tcl_N
5eb0: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
5ec0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5ed0: 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pRet);.    }.   
5ee0: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
5ef0: 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 70        pArray = p
5f00: 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20  Script = 0;.    
5f10: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
5f20: 34 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61  4 ){.      pArra
5f30: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63  y = 0;.      pSc
5f40: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  ript = objv[3];.
5f50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5f60: 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33   pArray = objv[3
5f70: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  ];.      if( Tcl
5f80: 5f 47 65 74 53 74 72 69 6e 67 28 70 41 72 72 61  _GetString(pArra
5f90: 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72 61  y)[0]==0 ) pArra
5fa0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63  y = 0;.      pSc
5fb0: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a  ript = objv[4];.
5fc0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49      }..    Tcl_I
5fd0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ncrRefCount(objv
5fe0: 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  [2]);.    zSql =
5ff0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
6000: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
6010: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  );.    while( rc
6020: 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c  ==TCL_OK && zSql
6030: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
6040: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
6050: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6060: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
6070: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
6080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6090: 75 6d 62 65 72 20 6f 66 20 62 69 6e 64 20 70 61  umber of bind pa
60a0: 72 61 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20  rameters in the 
60b0: 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69  pStmt */.      i
60c0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
60d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
60e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
60f0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
6100: 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62   */.      Tcl_Ob
6110: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
6120: 30 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  0;   /* Array of
6130: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
6140: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20  .      int len; 
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6160: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67    /* String leng
6170: 74 68 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20  th of zSql */.  
6180: 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  .      /* Try to
6190: 20 66 69 6e 64 20 61 20 53 51 4c 20 73 74 61 74   find a SQL stat
61a0: 65 6d 65 6e 74 20 74 68 61 74 20 68 61 73 20 61  ement that has a
61b0: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70  lready been comp
61c0: 69 6c 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a  iled and.      *
61d0: 2a 20 77 68 69 63 68 20 6d 61 74 63 68 65 73 20  * which matches 
61e0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 63  the next sequenc
61f0: 65 20 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20 20  e of SQL..      
6200: 2a 2f 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d  */.      pStmt =
6210: 20 30 3b 0a 20 20 20 20 20 20 70 50 72 65 53 74   0;.      pPreSt
6220: 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
6230: 73 74 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20  st;.      len = 
6240: 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20  strlen(zSql);.  
6250: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
6260: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 78 70 69   && sqlite3_expi
6270: 72 65 64 28 70 50 72 65 53 74 6d 74 2d 3e 70 53  red(pPreStmt->pS
6280: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tmt) ){.        
6290: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 70  flushStmtCache(p
62a0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  Db);.        pPr
62b0: 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  eStmt = 0;.     
62c0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 70   }.      for(; p
62d0: 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d  PreStmt; pPreStm
62e0: 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  t=pPreStmt->pNex
62f0: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
6300: 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  n = pPreStmt->nS
6310: 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ql;.        if( 
6320: 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20  len>=n .        
6330: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50      && memcmp(pP
6340: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53  reStmt->zSql, zS
6350: 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20  ql, n)==0.      
6360: 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e        && (zSql[n
6370: 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31  ]==0 || zSql[n-1
6380: 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20  ]==';').        
6390: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 74  ){.          pSt
63a0: 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  mt = pPreStmt->p
63b0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
63c0: 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50  zLeft = &zSql[pP
63d0: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a  reStmt->nSql];..
63e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
63f0: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
6400: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
6410: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
6420: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
6430: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74   cache list.  It
6440: 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61   will later be a
6450: 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  dded back to the
6460: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
6470: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63       ** of the c
6480: 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64  ache list in ord
6490: 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
64a0: 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e  LRU replacement.
64b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
64c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
64d0: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
64e0: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53             pPreS
64f0: 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  tmt->pPrev->pNex
6500: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
6510: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
6520: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6530: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
6540: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
6550: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
6560: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
6570: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a  eStmt->pNext ){.
6580: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65              pPre
6590: 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Stmt->pNext->pPr
65a0: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  ev = pPreStmt->p
65b0: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
65c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
65d0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
65e0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
65f0: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ev;.          }.
6600: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
6610: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
6620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6630: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20   }.      }.  .  
6640: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65      /* If no pre
6650: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
6660: 77 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70  was found.  Comp
6670: 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78 74  ile the SQL text
6680: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6690: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
66a0: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
66b0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70  TE_OK!=sqlite3_p
66c0: 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20  repare(pDb->db, 
66d0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
66e0: 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20  , &zLeft) ){.   
66f0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
6700: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
6710: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
6720: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
6730: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  db)));.         
6740: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
6750: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6760: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6770: 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30      if( pStmt==0
6780: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
6790: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
67a0: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
67b0: 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20  ->db) ){.       
67c0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c       /* A compil
67d0: 65 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20  e-time error in 
67e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  the statement.  
67f0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
6800: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74           Tcl_Set
6810: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
6820: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
6830: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
6840: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20  ->db)));.       
6850: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
6860: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
6870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6890: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
68a0: 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f  ement was a no-o
68b0: 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  p.  Continue to 
68c0: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
68d0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  nt.            *
68e0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72  * in the SQL str
68f0: 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ing..           
6900: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6910: 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  zSql = zLeft;.  
6920: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
6930: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
6940: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6950: 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74    assert( pPreSt
6960: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  mt==0 );.      }
6970: 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20  ..      /* Bind 
6980: 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65  values to parame
6990: 74 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20  ters that begin 
69a0: 77 69 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20  with $ or :.    
69b0: 20 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61    */  .      nVa
69c0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
69d0: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
69e0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e  (pStmt);.      n
69f0: 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Parm = 0;.      
6a00: 69 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28  if( nVar>sizeof(
6a10: 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50  aParm)/sizeof(aP
6a20: 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  arm[0]) ){.     
6a30: 20 20 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c     apParm = (Tcl
6a40: 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63  _Obj**)Tcl_Alloc
6a50: 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50  (nVar*sizeof(apP
6a60: 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  arm[0]));.      
6a70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
6a80: 70 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20  pParm = aParm;. 
6a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
6aa0: 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69  (i=1; i<=nVar; i
6ab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
6ac0: 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20  st char *zVar = 
6ad0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
6ae0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d  ameter_name(pStm
6af0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
6b00: 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a  f( zVar!=0 && (z
6b10: 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a  Var[0]=='$' || z
6b20: 56 61 72 5b 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a  Var[0]==':') ){.
6b30: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
6b40: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
6b50: 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20  tVar2Ex(interp, 
6b60: 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b  &zVar[1], 0, 0);
6b70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6b80: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Var ){.         
6b90: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
6ba0: 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a        u8 *data;.
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
6bc0: 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e   *zType = pVar->
6bd0: 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e  typePtr ? pVar->
6be0: 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20  typePtr->name : 
6bf0: 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "";.            
6c00: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
6c10: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
6c20: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
6c30: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
6c40: 72 72 61 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rray")==0 ){.   
6c50: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
6c60: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
6c70: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
6c80: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
6c90: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
6ca0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
6cb0: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
6cc0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
6cd0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
6ce0: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
6d00: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
6d10: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
6d20: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62  }else if( (c=='b
6d30: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
6d40: 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29  e,"boolean")==0)
6d50: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
6d60: 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26        (c=='i' &&
6d70: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69   strcmp(zType,"i
6d80: 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nt")==0) ){.    
6d90: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
6da0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
6db0: 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  rp, pVar, &n);. 
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6dd0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
6de0: 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20  tmt, i, n);.    
6df0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6e00: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
6e10: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
6e20: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
6e30: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b         double r;
6e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
6e50: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
6e60: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
6e70: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20  , &r);.         
6e80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
6e90: 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  d_double(pStmt, 
6ea0: 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20  i, r);.         
6eb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6ec0: 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54          data = T
6ed0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
6ee0: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6f00: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
6f10: 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e  Stmt, i, data, n
6f20: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
6f30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6f40: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
6f50: 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20  (pVar);.        
6f60: 20 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61        apParm[nPa
6f70: 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20  rm++] = pVar;.  
6f80: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6f90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6fa0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6fb0: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d  _bind_null( pStm
6fc0: 74 2c 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20  t, i );.        
6fd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
6ff0: 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e  Compute column n
7000: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43  ames */.      nC
7010: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
7020: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
7030: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72  ;.      if( pScr
7040: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ipt ){.        a
7050: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f  pColName = (Tcl_
7060: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
7070: 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a   sizeof(Tcl_Obj*
7080: 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  )*nCol );.      
7090: 20 20 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d    if( apColName=
70a0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
70b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
70c0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
70d0: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
70e0: 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  ] = dbTextToObj(
70f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
7100: 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
7110: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
7120: 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e  rRefCount(apColN
7130: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ame[i]);.       
7140: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
7150: 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20    /* If results 
7160: 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  are being stored
7170: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72   in an array var
7180: 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61  iable, then crea
7190: 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
71a0: 61 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66  array(*) entry f
71b0: 6f 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20  or that array.  
71c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
71d0: 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20   pArray ){.     
71e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c     Tcl_Obj *pCol
71f0: 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  List = Tcl_NewOb
7200: 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  j();.        Tcl
7210: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
7220: 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  olList);.       
7230: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
7240: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
7260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
7270: 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43  p, pColList, apC
7280: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
7290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63      }.        Tc
72a0: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
72b0: 65 72 70 2c 20 70 41 72 72 61 79 2c 20 54 63 6c  erp, pArray, Tcl
72c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a  _NewStringObj("*
72d0: 22 2c 2d 31 29 2c 20 70 43 6f 6c 4c 69 73 74 2c  ",-1), pColList,
72e0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
72f0: 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68     /* Execute th
7300: 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20  e SQL.      */. 
7310: 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
7320: 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20  TCL_OK && pStmt 
7330: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
7340: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
7350: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  t) ){.        fo
7360: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
7370: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
7380: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20  cl_Obj *pVal;.  
7390: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
73a0: 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74     /* Set pVal t
73b0: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27  o contain the i'
73c0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69  th column of thi
73d0: 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  s row. */.      
73e0: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
73f0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
7400: 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20  pStmt, i) ){.   
7410: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
7420: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
7430: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62             int b
7440: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63  ytes = sqlite3_c
7450: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
7460: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
7470: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
7480: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
7490: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
74a0: 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 62  lob(pStmt, i), b
74b0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
74c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
74d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
74e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
74f0: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
7500: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7510: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
7520: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
7530: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
7540: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
7550: 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20  =-2147483647 && 
7560: 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  v<=2147483647 ){
7570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7580: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49   pVal = Tcl_NewI
7590: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
75a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
75c0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Val = Tcl_NewWid
75d0: 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  eIntObj(v);.    
75e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
75f0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
7600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7610: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
7620: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f                do
7640: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
7650: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
7660: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
7670: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
7680: 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
7690: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
76a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
76b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
76c0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
76e0: 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73   = dbTextToObj(s
76f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
7700: 78 74 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20  xt(pStmt, i));. 
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
7720: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7730: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
7740: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
7750: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
7760: 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79        if( pArray
7770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7780: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
7790: 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f  ar2(interp, apCo
77a0: 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61  lName[i], 0, pVa
77b0: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
77c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
77d0: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53          Tcl_ObjS
77e0: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
77f0: 41 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65  Array, apColName
7800: 5b 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20  [i], pVal, 0);. 
7810: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7820: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7830: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43   choice==DB_ONEC
7840: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
7850: 20 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30       if( pRet==0
7860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7870: 20 20 70 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20    pRet = pVal;. 
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
7890: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _IncrRefCount(pR
78a0: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
78b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   }.            r
78c0: 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20  c = TCL_BREAK;. 
78d0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
78f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7900: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
7910: 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, pVal);.      
7920: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7930: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
7940: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
7950: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
7960: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
7970: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
7980: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
7990: 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20  L_CONTINUE ){.  
79a0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
79b0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  CL_OK;.         
79c0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
79d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
79e0: 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
79f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
7a00: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  _OK;.      }..  
7a10: 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20      /* Free the 
7a20: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65  column name obje
7a30: 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  cts */.      if(
7a40: 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20   pScript ){.    
7a50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7a60: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
7a70: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
7a80: 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b  Count(apColName[
7a90: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
7aa0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
7ab0: 28 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65  (char*)apColName
7ac0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
7ad0: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f    /* Free the bo
7ae0: 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62  und string and b
7af0: 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a  lob parameters *
7b00: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
7b10: 20 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nParm; i++){.
7b20: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
7b30: 52 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b  RefCount(apParm[
7b40: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
7b50: 20 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61     if( apParm!=a
7b60: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
7b70: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
7b80: 61 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  apParm);.      }
7b90: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
7ba0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
7bb0: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63   If the result c
7bc0: 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43  ode is SQLITE_SC
7bd0: 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20  HEMA, then.     
7be0: 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74   ** flush the st
7bf0: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e  atement cache an
7c00: 64 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d  d try the statem
7c10: 65 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20  ent again..     
7c20: 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20   */.      rc2 = 
7c30: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
7c40: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
7c50: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 72  SQLITE_SCHEMA==r
7c60: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  c2 ){.        /*
7c70: 20 41 66 74 65 72 20 61 20 73 63 68 65 6d 61 20   After a schema 
7c80: 63 68 61 6e 67 65 2c 20 66 6c 75 73 68 20 74 68  change, flush th
7c90: 65 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20  e cache and try 
7ca0: 74 6f 20 72 75 6e 20 74 68 65 0a 20 20 20 20 20  to run the.     
7cb0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
7cc0: 61 67 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2f  again.        */
7cd0: 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74  .        flushSt
7ce0: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
7cf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7d00: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
7d10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
7d20: 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65  eStmt ) Tcl_Free
7d30: 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74  ((char*)pPreStmt
7d40: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
7d50: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
7d60: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
7d70: 72 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rc2 ){.        /
7d80: 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20  * If a run-time 
7d90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
7da0: 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61  port the error a
7db0: 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a  nd stop reading.
7dc0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
7dd0: 51 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  QL.        */.  
7de0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
7df0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
7e00: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
7e10: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
7e20: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  b)));.        sq
7e30: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
7e40: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Stmt);.        r
7e50: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
7e60: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
7e70: 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28  tmt ) Tcl_Free((
7e80: 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b  char*)pPreStmt);
7e90: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7ea0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7eb0: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20  pDb->maxStmt<=0 
7ec0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
7ed0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75   the cache is tu
7ee0: 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f  rned off, deallo
7ef0: 63 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d  cated the statem
7f00: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ent */.        i
7f10: 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63  f( pPreStmt ) Tc
7f20: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50  l_Free((char*)pP
7f30: 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  reStmt);.       
7f40: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
7f50: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
7f60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
7f70: 2a 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72  * Everything wor
7f80: 6b 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  ked and the cach
7f90: 65 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c  e is operational
7fa0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65  ..        ** Cre
7fb0: 61 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65  ate a new SqlPre
7fc0: 70 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74  paredStmt struct
7fd0: 75 72 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f  ure if we need o
7fe0: 6e 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  ne..        ** (
7ff0: 49 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  If we already ha
8000: 76 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75  ve one we can ju
8010: 73 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20  st reuse it.).  
8020: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8030: 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30   if( pPreStmt==0
8040: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65   ){.          le
8050: 6e 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c  n = zLeft - zSql
8060: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
8070: 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61  Stmt = (SqlPrepa
8080: 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c  redStmt*)Tcl_All
8090: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65  oc( sizeof(*pPre
80a0: 53 74 6d 74 29 20 2b 20 6c 65 6e 20 29 3b 0a 20  Stmt) + len );. 
80b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
80c0: 65 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  eStmt==0 ) retur
80d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
80e0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
80f0: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
8100: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
8110: 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a  mt->nSql = len;.
8120: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
8130: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
8140: 20 7a 53 71 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20   zSql, len);.   
8150: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
8160: 3e 7a 53 71 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a  >zSql[len] = 0;.
8170: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
8180: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72     /* Add the pr
8190: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
81a0: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
81b0: 67 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  g of the cache l
81c0: 69 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ist.        */. 
81d0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
81e0: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74  >pNext = pDb->st
81f0: 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  mtList;.        
8200: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
8210: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
8220: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29   pDb->stmtList )
8230: 7b 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  {.         pDb->
8240: 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20  stmtList->pPrev 
8250: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20  = pPreStmt;.    
8260: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44      }.        pD
8270: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
8280: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  reStmt;.        
8290: 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  if( pDb->stmtLas
82a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
82b0: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e    assert( pDb->n
82c0: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
82d0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
82e0: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
82f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8300: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8310: 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a  pDb->nStmt>0 );.
8320: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8330: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a    pDb->nStmt++;.
8340: 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49     .        /* I
8350: 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61  f we have too ma
8360: 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  ny statement in 
8370: 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68  cache, remove th
8380: 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74  e surplus from t
8390: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e  he.        ** en
83a0: 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  d of the cache l
83b0: 69 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ist..        */.
83c0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
83d0: 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d  Db->nStmt>pDb->m
83e0: 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  axStmt ){.      
83f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
8400: 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61  lize(pDb->stmtLa
8410: 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
8420: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
8430: 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ast = pDb->stmtL
8440: 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ast->pPrev;.    
8450: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
8460: 63 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c  char*)pDb->stmtL
8470: 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20  ast->pNext);.   
8480: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
8490: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Last->pNext = 0;
84a0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
84b0: 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20  nStmt--;.       
84c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
84d0: 20 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20    /* Proceed to 
84e0: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
84f0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c  nt */.      zSql
8500: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a   = zLeft;.    }.
8510: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
8520: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a  ount(objv[2]);..
8530: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
8540: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
8550: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  L_OK ){.        
8560: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
8570: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
8580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63        }.      Tc
8590: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
85a0: 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Ret);.    }.    
85b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
85c0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75  .  **     $db fu
85d0: 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49  nction NAME SCRI
85e0: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
85f0: 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75  ate a new SQL fu
8600: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
8610: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68  ME.  Whenever th
8620: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  at function is. 
8630: 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   ** called, invo
8640: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
8650: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
8660: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
8670: 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  DB_FUNCTION: {. 
8680: 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
8690: 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  c;.    char *zNa
86a0: 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  me;.    char *zS
86b0: 63 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e  cript;.    int n
86c0: 53 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20  Script;.    if( 
86d0: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
86e0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
86f0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
8700: 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22  v, "NAME SCRIPT"
8710: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8720: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8730: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
8740: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8750: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
8760: 20 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c     zScript = Tcl
8770: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8780: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72  j(objv[3], &nScr
8790: 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 20  ipt);.    pFunc 
87a0: 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f  = (SqlFunc*)Tcl_
87b0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
87c0: 46 75 6e 63 29 20 2b 20 6e 53 63 72 69 70 74 20  Func) + nScript 
87d0: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
87e0: 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  Func==0 ) return
87f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8800: 70 46 75 6e 63 2d 3e 69 6e 74 65 72 70 20 3d 20  pFunc->interp = 
8810: 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 46 75 6e  interp;.    pFun
8820: 63 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  c->pNext = pDb->
8830: 70 46 75 6e 63 3b 0a 20 20 20 20 70 46 75 6e 63  pFunc;.    pFunc
8840: 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61  ->zScript = (cha
8850: 72 2a 29 26 70 46 75 6e 63 5b 31 5d 3b 0a 20 20  r*)&pFunc[1];.  
8860: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
8870: 46 75 6e 63 3b 0a 20 20 20 20 73 74 72 63 70 79  Func;.    strcpy
8880: 28 70 46 75 6e 63 2d 3e 7a 53 63 72 69 70 74 2c  (pFunc->zScript,
8890: 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72   zScript);.    r
88a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
88b0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d  te_function(pDb-
88c0: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  >db, zName, -1, 
88d0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
88e0: 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53       pFunc, tclS
88f0: 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
8900: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8910: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 72  E_OK ){.       r
8920: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
8930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8940: 2f 2a 20 4d 75 73 74 20 66 6c 75 73 68 20 61 6e  /* Must flush an
8950: 79 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65  y cached stateme
8960: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 66 6c 75  nts */.      flu
8970: 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62  shStmtCache( pDb
8980: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72   );.    }.    br
8990: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
89a0: 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74   **     $db last
89b0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20  _insert_rowid . 
89c0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
89d0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
89e0: 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f   is the ROWID fo
89f0: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
8a00: 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20  t insert..  */. 
8a10: 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e   case DB_LAST_IN
8a20: 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20  SERT_ROWID: {.  
8a30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
8a40: 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77 69  lt;.    int rowi
8a50: 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  d;.    if( objc!
8a60: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
8a70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8a80: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
8a90: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8aa0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8ab0: 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c  .    rowid = sql
8ac0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
8ad0: 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b  _rowid(pDb->db);
8ae0: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
8af0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
8b00: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
8b10: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
8b20: 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20  lt, rowid);.    
8b30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
8b40: 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45  .  ** The DB_ONE
8b50: 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73  COLUMN method is
8b60: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67   implemented tog
8b70: 65 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 56  ether with DB_EV
8b80: 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20  AL..  */..  /*  
8b90: 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f    $db progress ?
8ba0: 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a  N CALLBACK?.  **
8bb0: 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68   .  ** Invoke th
8bc0: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
8bd0: 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
8be0: 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
8bf0: 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
8c00: 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
8c10: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
8c20: 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
8c30: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
8c40: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
8c50: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
8c60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8c70: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
8c80: 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20  Progress, 0);.  
8c90: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
8ca0: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
8cb0: 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67       char *zProg
8cc0: 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  ress;.      int 
8cd0: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e  len;.      int N
8ce0: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f  ;.      if( TCL_
8cf0: 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
8d00: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8d10: 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 09 72  jv[2], &N) ){..r
8d20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8d30: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
8d40: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
8d50: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
8d60: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
8d70: 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a  gress);.      }.
8d80: 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20        zProgress 
8d90: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
8da0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
8db0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
8dc0: 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65   zProgress && le
8dd0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
8de0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20  Db->zProgress = 
8df0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
8e00: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74   1 );.        st
8e10: 72 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72  rcpy(pDb->zProgr
8e20: 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 29 3b  ess, zProgress);
8e30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8e40: 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67        pDb->zProg
8e50: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  ress = 0;.      
8e60: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
8e70: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
8e80: 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66  ALLBACK.      if
8e90: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
8ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
8eb0: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
8ec0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8ed0: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
8ee0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44  er(pDb->db, N, D
8ef0: 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72  bProgressHandler
8f00: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
8f10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8f20: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
8f30: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30  ndler(pDb->db, 0
8f40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
8f50: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
8f60: 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
8f70: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8f80: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41  , 2, objv, "N CA
8f90: 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20  LLBACK");.      
8fa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8fb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
8fc0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
8fd0: 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20  *     $db rekey 
8fe0: 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  KEY.  **.  ** Ch
8ff0: 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74  ange the encrypt
9000: 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63  ion key on the c
9010: 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
9020: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
9030: 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a  ase DB_REKEY: {.
9040: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
9050: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
9060: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
9070: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
9080: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9090: 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b  2, objv, "KEY");
90a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
90b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
90c0: 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65     pKey = Tcl_Ge
90d0: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
90e0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79  j(objv[2], &nKey
90f0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
9100: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72  _HAS_CODEC.    r
9110: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65  c = sqlite3_reke
9120: 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c  y(pDb->db, pKey,
9130: 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20   nKey);.    if( 
9140: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
9150: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9160: 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  erp, sqlite3ErrS
9170: 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
9180: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
9190: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
91a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
91b0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
91c0: 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45   timeout MILLESE
91d0: 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CONDS.  **.  ** 
91e0: 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75  Delay for the nu
91f0: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
9200: 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77  onds specified w
9210: 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f  hen a file is lo
9220: 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  cked..  */.  cas
9230: 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a  e DB_TIMEOUT: {.
9240: 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20      int ms;.    
9250: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
9260: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
9270: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
9280: 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43   objv, "MILLISEC
9290: 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65  ONDS");.      re
92a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
92b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63      }.    if( Tc
92c0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
92d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
92e0: 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54   &ms) ) return T
92f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  CL_ERROR;.    sq
9300: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
9310: 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b  ut(pDb->db, ms);
9320: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
9330: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
9340: 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  db total_changes
9350: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
9360: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9370: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
9380: 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
9390: 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20  d, or deleted . 
93a0: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61   ** since the da
93b0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
93c0: 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a  s created..  */.
93d0: 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f    case DB_TOTAL_
93e0: 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54  CHANGES: {.    T
93f0: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
9400: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
9410: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
9420: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9430: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
9440: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9450: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9460: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
9470: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
9480: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
9490: 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
94a0: 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  , sqlite3_total_
94b0: 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29  changes(pDb->db)
94c0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
94d0: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
94e0: 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  race ?CALLBACK?.
94f0: 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61    **.  ** Make a
9500: 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69  rrangements to i
9510: 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41  nvoke the CALLBA
9520: 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65  CK routine for e
9530: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
9540: 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65  t.  ** that is e
9550: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
9560: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73  xt of the SQL is
9570: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c   appended to CAL
9580: 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a  LBACK before.  *
9590: 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64  * it is executed
95a0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
95b0: 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66  _TRACE: {.    if
95c0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
95d0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
95e0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
95f0: 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
9600: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9610: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9620: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
9630: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
9640: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
9650: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
9660: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
9670: 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20  b->zTrace, 0);. 
9680: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
9690: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
96a0: 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  race;.      int 
96b0: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
96c0: 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
96d0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
96e0: 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20  Db->zTrace);.   
96f0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63     }.      zTrac
9700: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
9710: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
9720: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
9730: 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e  f( zTrace && len
9740: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
9750: 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f  b->zTrace = Tcl_
9760: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
9770: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
9780: 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54  (pDb->zTrace, zT
9790: 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  race);.      }el
97a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
97b0: 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  >zTrace = 0;.   
97c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
97d0: 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
97e0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
97f0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
9800: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
9810: 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61  e(pDb->db, DbTra
9820: 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  ceHandler, pDb);
9830: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
9850: 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ace(pDb->db, 0, 
9860: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
9870: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
9880: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
9890: 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  py conflict-algo
98a0: 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65  rithm table file
98b0: 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f  name ?SEPARATOR?
98c0: 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
98d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20  .  **.  ** Copy 
98e0: 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20  data into table 
98f0: 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f  from filename, o
9900: 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20  ptionally using 
9910: 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61  SEPARATOR.  ** a
9920: 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  s column separat
9930: 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d  ors.  If a colum
9940: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c  n contains a nul
9950: 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65  l string, or the
9960: 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e  .  ** value of N
9970: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20  ULLINDICATOR, a 
9980: 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64  NULL is inserted
9990: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e   for the column.
99a0: 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61  .  ** conflict-a
99b0: 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20  lgorithm is one 
99c0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f  of the sqlite co
99d0: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
99e0: 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62  s:.  **    rollb
99f0: 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c  ack, abort, fail
9a00: 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63  , ignore, replac
9a10: 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73  e.  ** On succes
9a20: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  s, return the nu
9a30: 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
9a40: 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63  ocessed, not nec
9a50: 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20  essarily same.  
9a60: 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65  ** as 'db change
9a70: 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69  s' due to confli
9a80: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c  ct-algorithm sel
9a90: 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ected..  **.  **
9aa0: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61   This code is ba
9ab0: 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65  sically an imple
9ac0: 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63  mentation/enhanc
9ad0: 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68  ement of.  ** th
9ae0: 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e  e sqlite3 shell.
9af0: 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d  c ".import" comm
9b00: 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  and..  **.  ** T
9b10: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67  his command usag
9b20: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9b30: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78  to the sqlite2.x
9b40: 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c   COPY statement,
9b50: 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f  .  ** which impo
9b60: 72 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e  rts file data in
9b70: 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67  to a table using
9b80: 20 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20   the PostgreSQL 
9b90: 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74  COPY file format
9ba0: 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70  :.  **   $db cop
9bb0: 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20  y $conflit_algo 
9bc0: 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c  $table_name $fil
9bd0: 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a  ename \t \\N.  *
9be0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59  /.  case DB_COPY
9bf0: 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  : {.    char *zT
9c00: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
9c10: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
9c20: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
9c30: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
9c40: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
9c50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
9c60: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
9c70: 65 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a  extract data */.
9c80: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c      char *zConfl
9c90: 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ict;            
9ca0: 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20  /* The conflict 
9cb0: 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65  algorithm to use
9cc0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
9cd0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
9ce0: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65      /* A stateme
9cf0: 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  nt */.    int rc
9d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9d10: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
9d20: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  code */.    int 
9d30: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
9d40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9d50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
9d60: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
9d70: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d90: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
9da0: 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67  in an SQL string
9db0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   */.    int i, j
9dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9dd0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9de0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
9df0: 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nSep;           
9e00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9e10: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53  r of bytes in zS
9e20: 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ep[] */.    int 
9e30: 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nNull;          
9e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9e50: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e  r of bytes in zN
9e60: 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61  ull[] */.    cha
9e70: 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
9e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53           /* An S
9e90: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
9ea0: 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b      char *zLine;
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ec0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65  /* A single line
9ed0: 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74   of input from t
9ee0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  he file */.    c
9ef0: 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20  har **azCol;    
9f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c             /* zL
9f10: 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20  ine[] broken up 
9f20: 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  into columns */.
9f30: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
9f40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
9f50: 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74  /* How to commit
9f60: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
9f70: 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9f90: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
9fa0: 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .    int lineno 
9fb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9fc0: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
9fd0: 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
9fe0: 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e  .    char zLineN
9ff0: 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20  um[80];         
a000: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
a010: 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a  print buffer */.
a020: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
a030: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
a040: 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74  /* interp result
a050: 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a   */..    char *z
a060: 53 65 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Sep;.    char *z
a070: 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62  Null;.    if( ob
a080: 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29  jc<5 || objc>7 )
a090: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
a0a0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
a0b0: 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20   2, objv, .     
a0c0: 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c      "CONFLICT-AL
a0d0: 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49  GORITHM TABLE FI
a0e0: 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f  LENAME ?SEPARATO
a0f0: 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f  R? ?NULLINDICATO
a100: 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  R?");.      retu
a110: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a120: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
a130: 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65  >=6 ){.      zSe
a140: 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  p = Tcl_GetStrin
a150: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d  gFromObj(objv[5]
a160: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
a170: 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  .      zSep = "\
a180: 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t";.    }.    if
a190: 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20  ( objc>=7 ){.   
a1a0: 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47     zNull = Tcl_G
a1b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a1c0: 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20  objv[6], 0);.   
a1d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e   }else{.      zN
a1e0: 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a  ull = "";.    }.
a1f0: 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20      zConflict = 
a200: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a210: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
a220: 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54  ;.    zTable = T
a230: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
a240: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b  Obj(objv[3], 0);
a250: 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  .    zFile = Tcl
a260: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a270: 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20  j(objv[4], 0);. 
a280: 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
a290: 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c  (zSep);.    nNul
a2a0: 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c  l = strlen(zNull
a2b0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
a2c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
a2d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a2e0: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e  erp, "Error: non
a2f0: 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20  -null separator 
a300: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70  required for cop
a310: 79 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  y", 0);.      re
a320: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a330: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73 71 6c      }.    if(sql
a340: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e  ite3StrICmp(zCon
a350: 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b  flict, "rollback
a360: 22 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20  ") != 0 &&.     
a370: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
a380: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f  (zConflict, "abo
a390: 72 74 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a  rt"   ) != 0 &&.
a3a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
a3b0: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
a3c0: 20 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20   "fail"    ) != 
a3d0: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
a3e0: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
a3f0: 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20  lict, "ignore"  
a400: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
a410: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a420: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c  zConflict, "repl
a430: 61 63 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a  ace" ) != 0 ) {.
a440: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
a450: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a460: 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e  Error: \"", zCon
a470: 66 6c 69 63 74 2c 20 0a 20 20 20 20 20 20 20 20  flict, .        
a480: 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63      "\", conflic
a490: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74  t-algorithm must
a4a0: 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c   be one of: roll
a4b0: 62 61 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20  back, ".        
a4c0: 20 20 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c      "abort, fail
a4d0: 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70  , ignore, or rep
a4e0: 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  lace", 0);.     
a4f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a500: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
a510: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
a520: 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
a530: 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65  OM '%q'", zTable
a540: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
a550: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
a560: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a570: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20  erp, "Error: no 
a580: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a  such table: ", z
a590: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
a5a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a5b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  R;.    }.    nBy
a5c0: 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c  te = strlen(zSql
a5d0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
a5e0: 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
a5f0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70  >db, zSql, 0, &p
a600: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
a610: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
a620: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
a630: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
a640: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a650: 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  Error: ", sqlite
a660: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
a670: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f  ), 0);.      nCo
a680: 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
a690: 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73  {.      nCol = s
a6a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
a6b0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
a6c0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
a6d0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
a6e0: 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29     if( nCol==0 )
a6f0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
a700: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a710: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c  .    zSql = mall
a720: 6f 63 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b  oc( nByte + 50 +
a730: 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69   nCol*2 );.    i
a740: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20  f( zSql==0 ) {. 
a750: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
a760: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
a770: 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c  rror: can't mall
a780: 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  oc()", 0);.     
a790: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a7a0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
a7b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
a7c0: 79 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49  yte+50, zSql, "I
a7d0: 4e 53 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f  NSERT OR %q INTO
a7e0: 20 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c   '%q' VALUES(?",
a7f0: 0a 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c  .         zConfl
a800: 69 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  ict, zTable);.  
a810: 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71    j = strlen(zSq
a820: 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  l);.    for(i=1;
a830: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
a840: 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
a850: 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c   ',';.      zSql
a860: 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20  [j++] = '?';.   
a870: 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d   }.    zSql[j++]
a880: 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c   = ')';.    zSql
a890: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  [j] = 0;.    rc 
a8a0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
a8b0: 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
a8c0: 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a   0, &pStmt, 0);.
a8d0: 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a      free(zSql);.
a8e0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
a8f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a900: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
a910: 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
a920: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
a930: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a940: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
a950: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
a960: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a970: 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  }.    in = fopen
a980: 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  (zFile, "rb");. 
a990: 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
a9a0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
a9b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a9c0: 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
a9d0: 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c  en file: ", zFil
a9e0: 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  e, NULL);.      
a9f0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
aa00: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
aa10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
aa20: 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c  .    }.    azCol
aa30: 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
aa40: 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f  f(azCol[0])*(nCo
aa50: 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  l+1) );.    if( 
aa60: 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20  azCol==0 ) {.   
aa70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
aa80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
aa90: 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
aaa0: 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ()", 0);.      r
aab0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
aac0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
aad0: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
aae0: 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20   "BEGIN", 0, 0, 
aaf0: 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20  0);.    zCommit 
ab00: 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20  = "COMMIT";.    
ab10: 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20  while( (zLine = 
ab20: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c  local_getline(0,
ab30: 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   in))!=0 ){.    
ab40: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20    char *z;.     
ab50: 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69   i = 0;.      li
ab60: 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a  neno++;.      az
ab70: 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a  Col[0] = zLine;.
ab80: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a        for(i=0, z
ab90: 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  =zLine; *z; z++)
aba0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a  {.        if( *z
abb0: 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72  ==zSep[0] && str
abc0: 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53  ncmp(z, zSep, nS
abd0: 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ep)==0 ){.      
abe0: 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20      *z = 0;.    
abf0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
ac00: 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20       if( i<nCol 
ac10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
ac20: 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65  zCol[i] = &z[nSe
ac30: 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p];.            
ac40: 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20  z += nSep-1;.   
ac50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ac60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
ac70: 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29   if( i+1!=nCol )
ac80: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
ac90: 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 7a 45  zErr;.        zE
aca0: 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 32 30 30 20  rr = malloc(200 
acb0: 2b 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 29  + strlen(zFile))
acc0: 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74  ;.        sprint
acd0: 66 28 7a 45 72 72 2c 22 45 72 72 6f 72 3a 20 25  f(zErr,"Error: %
ace0: 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63  s line %d: expec
acf0: 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f  ted %d columns o
ad00: 66 20 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64  f data but found
ad10: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
ad20: 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20   zFile, lineno, 
ad30: 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20  nCol, i+1);.    
ad40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ad50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
ad60: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  r, 0);.        f
ad70: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20  ree(zErr);.     
ad80: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f     zCommit = "RO
ad90: 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20  LLBACK";.       
ada0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
adb0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
adc0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
add0: 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f       /* check fo
ade0: 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66 20  r null data, if 
adf0: 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c  so, bind as null
ae00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28   */.        if (
ae10: 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72 63  (nNull>0 && strc
ae20: 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75  mp(azCol[i], zNu
ae30: 6c 6c 29 3d 3d 30 29 20 7c 7c 20 73 74 72 6c 65  ll)==0) || strle
ae40: 6e 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 29 20  n(azCol[i])==0) 
ae50: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
ae60: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
ae70: 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  tmt, i+1);.     
ae80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ae90: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
aea0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31  _text(pStmt, i+1
aeb0: 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20  , azCol[i], -1, 
aec0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
aed0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aee0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
aef0: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
af00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
af10: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
af20: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
af30: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
af40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
af50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
af60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
af70: 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
af80: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
af90: 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d  0);.        zCom
afa0: 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
afb0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
afc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
afd0: 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a     free(azCol);.
afe0: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
aff0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
b000: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
b010: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
b020: 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20  b->db, zCommit, 
b030: 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69  0, 0, 0);..    i
b040: 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d  f( zCommit[0] ==
b050: 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a   'C' ){.      /*
b060: 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65   success, set re
b070: 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f  sult as number o
b080: 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65  f lines processe
b090: 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75  d */.      pResu
b0a0: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
b0b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
b0c0: 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f       Tcl_SetIntO
b0d0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65  bj(pResult, line
b0e0: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
b0f0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  TCL_OK;.    }els
b100: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c  e{.      /* fail
b110: 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65  ure, append line
b120: 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20  no where failed 
b130: 2a 2f 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  */.      sprintf
b140: 28 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c  (zLineNum,"%d",l
b150: 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63  ineno);.      Tc
b160: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b170: 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20  nterp,", failed 
b180: 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
b190: 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75   line: ",zLineNu
b1a0: 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  m,0);.      rc =
b1b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
b1c0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
b1d0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65  ..  /*    $db ve
b1e0: 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rsion.  **.  ** 
b1f0: 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69  Return the versi
b200: 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  on string for th
b210: 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  is database..  *
b220: 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53  /.  case DB_VERS
b230: 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ION: {.    Tcl_S
b240: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
b250: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
b260: 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54  _libversion(), T
b270: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
b280: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d  break;.  }...  }
b290: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53   /* End of the S
b2a0: 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20  WITCH statement 
b2b0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
b2c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  }../*.**   sqlit
b2d0: 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41  e3 DBNAME FILENA
b2e0: 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20  ME ?MODE? ?-key 
b2f0: 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  KEY?.**.** This 
b300: 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20  is the main Tcl 
b310: 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74  command.  When t
b320: 68 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20  he "sqlite" Tcl 
b330: 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e  command is.** in
b340: 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74  voked, this rout
b350: 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63  ine runs to proc
b360: 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64  ess that command
b370: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
b380: 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41  t argument, DBNA
b390: 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72  ME, is an arbitr
b3a0: 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ary name for a n
b3b0: 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  ew.** database c
b3c0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73  onnection.  This
b3d0: 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73   command creates
b3e0: 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e   a new command n
b3f0: 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74  amed.** DBNAME t
b400: 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63  hat is used to c
b410: 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e  ontrol that conn
b420: 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74  ection.  The dat
b430: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
b440: 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77  ion is deleted w
b450: 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63  hen the DBNAME c
b460: 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65  ommand is delete
b470: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  d..**.** The sec
b480: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
b490: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b4a0: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
b4b0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 73  ontains.** the s
b4c0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
b4d0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 63 63  hat is to be acc
b4e0: 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  essed..**.** For
b4f0: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
b500: 73 2c 20 77 65 20 61 6c 73 6f 20 73 75 70 70 6f  s, we also suppo
b510: 72 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  rt the following
b520: 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33  :.**.**  sqlite3
b530: 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a   -encoding.**.**
b540: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74 68         Return th
b550: 65 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  e encoding used 
b560: 62 79 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  by LIKE and GLOB
b570: 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 43 68 6f   operators.  Cho
b580: 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 61 72  ices.**       ar
b590: 65 20 55 54 46 2d 38 20 61 6e 64 20 69 73 6f 38  e UTF-8 and iso8
b5a0: 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  859..**.**  sqli
b5b0: 74 65 33 20 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a  te3 -version.**.
b5c0: 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20  **       Return 
b5d0: 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
b5e0: 65 72 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  er of the SQLite
b5f0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20   library..**.** 
b600: 20 73 71 6c 69 74 65 33 20 2d 74 63 6c 2d 75 73   sqlite3 -tcl-us
b610: 65 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20  es-utf.**.**    
b620: 20 20 20 52 65 74 75 72 6e 20 22 31 22 20 69 66     Return "1" if
b630: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61   compiled with a
b640: 20 54 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e   Tcl uses UTF-8.
b650: 20 20 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a    Return "0" if.
b660: 2a 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55  **       not.  U
b670: 73 65 64 20 62 79 20 74 65 73 74 73 20 74 6f 20  sed by tests to 
b680: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69  make sure the li
b690: 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
b6a0: 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72  ed .**       cor
b6b0: 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
b6c0: 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69  c int DbMain(voi
b6d0: 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
b6e0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
b6f0: 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  bjc,Tcl_Obj *con
b700: 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69  st*objv){.  Sqli
b710: 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20  teDb *p;.  void 
b720: 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  *pKey = 0;.  int
b730: 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e   nKey = 0;.  con
b740: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
b750: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a   char *zErrMsg;.
b760: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
b770: 69 6c 65 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  ile;.  char zBuf
b780: 5b 38 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63  [80];.  if( objc
b790: 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20  ==2 ){.    zArg 
b7a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
b7b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
b7c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  0);.    if( strc
b7d0: 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f  mp(zArg,"-versio
b7e0: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
b7f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b800: 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f  (interp,sqlite3_
b810: 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20  version,0);.    
b820: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
b830: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
b840: 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73  trcmp(zArg,"-has
b850: 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23  -codec")==0 ){.#
b860: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
b870: 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c  _CODEC.      Tcl
b880: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b890: 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c  terp,"1",0);.#el
b8a0: 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  se.      Tcl_App
b8b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b8c0: 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a  ,"0",0);.#endif.
b8d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
b8e0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
b8f0: 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
b900: 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 22 29 3d  -tcl-uses-utf")=
b910: 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 54 43 4c  =0 ){.#ifdef TCL
b920: 5f 55 54 46 5f 4d 41 58 0a 20 20 20 20 20 20 54  _UTF_MAX.      T
b930: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b940: 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23  interp,"1",0);.#
b950: 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41  else.      Tcl_A
b960: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b970: 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69  rp,"0",0);.#endi
b980: 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  f.      return T
b990: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  CL_OK;.    }.  }
b9a0: 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 7c  .  if( objc==5 |
b9b0: 7c 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20  | objc==6 ){.   
b9c0: 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
b9d0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
b9e0: 76 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b 0a 20  v[objc-2], 0);. 
b9f0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
ba00: 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b  rg,"-key")==0 ){
ba10: 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63  .      pKey = Tc
ba20: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
ba30: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d  omObj(objv[objc-
ba40: 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20  1], &nKey);.    
ba50: 20 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20 20 20    objc -= 2;.   
ba60: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a   }.  }.  if( obj
ba70: 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=3 && objc!=4 
ba80: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
ba90: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
baa0: 31 2c 20 6f 62 6a 76 2c 20 0a 23 69 66 64 65 66  1, objv, .#ifdef
bab0: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
bac0: 43 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20  C.      "HANDLE 
bad0: 46 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79 20 43  FILENAME ?-key C
bae0: 4f 44 45 43 2d 4b 45 59 3f 22 0a 23 65 6c 73 65  ODEC-KEY?".#else
baf0: 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46  .      "HANDLE F
bb00: 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 22 0a  ILENAME ?MODE?".
bb10: 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20  #endif.    );.  
bb20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
bb30: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73  OR;.  }.  zErrMs
bb40: 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71  g = 0;.  p = (Sq
bb50: 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f  liteDb*)Tcl_Allo
bb60: 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
bb70: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
bb80: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
bb90: 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63  (interp, "malloc
bba0: 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54   failed", TCL_ST
bbb0: 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72  ATIC);.    retur
bbc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
bbd0: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
bbe0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a  sizeof(*p));.  z
bbf0: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
bc00: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
bc10: 5b 32 5d 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  [2], 0);.  sqlit
bc20: 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 26  e3_open(zFile, &
bc30: 70 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20 53 51  p->db);.  if( SQ
bc40: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
bc50: 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20  _errcode(p->db) 
bc60: 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  ){.    zErrMsg =
bc70: 20 73 74 72 64 75 70 28 73 71 6c 69 74 65 33 5f   strdup(sqlite3_
bc80: 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
bc90: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
bca0: 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d  e(p->db);.    p-
bcb0: 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66  >db = 0;.  }.#if
bcc0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
bcd0: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b  ODEC.  sqlite3_k
bce0: 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  ey(p->db, pKey, 
bcf0: 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nKey);.#endif.  
bd00: 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
bd10: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
bd20: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73  t(interp, zErrMs
bd30: 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  g, TCL_VOLATILE)
bd40: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
bd50: 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 66 72  char*)p);.    fr
bd60: 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
bd70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bd80: 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53  R;.  }.  p->maxS
bd90: 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52  tmt = NUM_PREPAR
bda0: 45 44 5f 53 54 4d 54 53 3b 0a 20 20 7a 41 72 67  ED_STMTS;.  zArg
bdb0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
bdc0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
bdd0: 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
bde0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
bdf0: 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43  rp, zArg, DbObjC
be00: 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62  md, (char*)p, Db
be10: 44 65 6c 65 74 65 43 6d 64 29 3b 0a 0a 20 20 2f  DeleteCmd);..  /
be20: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
be30: 75 65 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  ue is the value 
be40: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 2a 20 70  of the sqlite* p
be50: 6f 69 6e 74 65 72 0a 20 20 2a 2f 0a 20 20 73 70  ointer.  */.  sp
be60: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 70 22  rintf(zBuf, "%p"
be70: 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20  , p->db);.  if( 
be80: 73 74 72 6e 63 6d 70 28 7a 42 75 66 2c 22 30 78  strncmp(zBuf,"0x
be90: 22 2c 32 29 20 29 7b 0a 20 20 20 20 73 70 72 69  ",2) ){.    spri
bea0: 6e 74 66 28 7a 42 75 66 2c 20 22 30 78 25 70 22  ntf(zBuf, "0x%p"
beb0: 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20  , p->db);.  }.  
bec0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bed0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
bee0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6d 70  );..  /* If comp
bef0: 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
bf00: 5f 54 45 53 54 20 74 75 72 6e 65 64 20 6f 6e 2c  _TEST turned on,
bf10: 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 74   then register t
bf20: 68 65 20 22 6d 64 35 73 75 6d 22 0a 20 20 2a 2a  he "md5sum".  **
bf30: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   SQL function.. 
bf40: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
bf50: 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65  E_TEST.  {.    e
bf60: 78 74 65 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52  xtern void Md5_R
bf70: 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 2a  egister(sqlite3*
bf80: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
bf90: 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 69 6e  _MEMDEBUG.    in
bfa0: 74 20 6d 61 6c 6c 6f 63 66 61 69 6c 20 3d 20 73  t mallocfail = s
bfb0: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
bfc0: 69 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  il;.    sqlite3_
bfd0: 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 30 3b  iMallocFail = 0;
bfe0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 4d 64 35 5f  .#endif.    Md5_
bff0: 52 65 67 69 73 74 65 72 28 70 2d 3e 64 62 29 3b  Register(p->db);
c000: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
c010: 45 4d 44 45 42 55 47 0a 20 20 20 20 73 71 6c 69  EMDEBUG.    sqli
c020: 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20  te3_iMallocFail 
c030: 3d 20 6d 61 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65  = mallocfail;.#e
c040: 6e 64 69 66 0a 20 20 20 7d 0a 23 65 6e 64 69 66  ndif.   }.#endif
c050: 20 20 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d    .  p->interp =
c060: 20 69 6e 74 65 72 70 3b 0a 20 20 72 65 74 75 72   interp;.  retur
c070: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
c080: 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d  ** Provide a dum
c090: 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  my Tcl_InitStubs
c0a0: 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
c0b0: 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74 69   this as a stati
c0c0: 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  c.** library..*/
c0d0: 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c  .#ifndef USE_TCL
c0e0: 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20  _STUBS.# undef  
c0f0: 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20  Tcl_InitStubs.# 
c100: 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53  define Tcl_InitS
c110: 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64  tubs(a,b,c).#end
c120: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
c130: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
c140: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c  ..**.** This Tcl
c150: 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73   module contains
c160: 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e   only a single n
c170: 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  ew Tcl command n
c180: 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a  amed "sqlite"..*
c190: 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69  * (Hence there i
c1a0: 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20  s no namespace. 
c1b0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
c1c0: 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61  nt in using a na
c1d0: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68  mespace.** if th
c1e0: 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  e extension only
c1f0: 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65   supplies one ne
c200: 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73  w name!)  The "s
c210: 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69  qlite" command i
c220: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65  s.** used to ope
c230: 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64  n a new SQLite d
c240: 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68  atabase.  See th
c250: 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69  e DbMain() routi
c260: 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20  ne above.** for 
c270: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
c280: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 53  mation..*/.int S
c290: 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
c2a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
c2b0: 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  .  Tcl_InitStubs
c2c0: 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20  (interp, "8.4", 
c2d0: 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
c2e0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
c2f0: 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54  p, "sqlite3", (T
c300: 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44  cl_ObjCmdProc*)D
c310: 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  bMain, 0, 0);.  
c320: 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
c330: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
c340: 2c 20 22 33 2e 30 22 29 3b 0a 20 20 54 63 6c 5f  , "3.0");.  Tcl_
c350: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
c360: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
c370: 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
c380: 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
c390: 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76  );.  Tcl_PkgProv
c3a0: 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ide(interp, "sql
c3b0: 69 74 65 22 2c 20 22 33 2e 30 22 29 3b 0a 20 20  ite", "3.0");.  
c3c0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
c3d0: 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f  .int Tclsqlite3_
c3e0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
c3f0: 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
c400: 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
c410: 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c  terp); }.int Sql
c420: 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63  ite3_SafeInit(Tc
c430: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c440: 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
c450: 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74  ; }.int Tclsqlit
c460: 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  e3_SafeInit(Tcl_
c470: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
c480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
c490: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
c4a0: 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a  E_3_SUFFIX_ONLY.
c4b0: 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28  int Sqlite_Init(
c4c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c4d0: 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
c4e0: 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
c4f0: 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74  ; }.int Tclsqlit
c500: 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
c510: 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
c520: 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
c530: 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53  interp); }.int S
c540: 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54  qlite_SafeInit(T
c550: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c560: 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
c570: 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69  K; }.int Tclsqli
c580: 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
c590: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
c5a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
c5b0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
c5c0: 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
c5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c610: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  *****.** The cod
c620: 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  e that follows i
c630: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
c640: 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69  standalone TCL i
c650: 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2f 0a 0a  nterpreters.*/..
c660: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63  /*.** If the mac
c670: 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c  ro TCLSH is one,
c680: 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64   then put in cod
c690: 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a  e this for the.*
c6a0: 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65  * "main" routine
c6b0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69   that will initi
c6c0: 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61  alize Tcl and ta
c6d0: 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a  ke input from.**
c6e0: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e   standard input.
c6f0: 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31  .*/.#if TCLSH==1
c700: 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
c710: 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65  inloop[] =.  "se
c720: 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22  t line {}\n".  "
c730: 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64  while {![eof std
c740: 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69  in]} {\n".    "i
c750: 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20  f {$line!=\"\"} 
c760: 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73  {\n".      "puts
c770: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20   -nonewline \"> 
c780: 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73  \"\n".    "} els
c790: 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75  e {\n".      "pu
c7a0: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
c7b0: 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e  % \"\n".    "}\n
c7c0: 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74 64  ".    "flush std
c7d0: 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65  out\n".    "appe
c7e0: 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74  nd line [gets st
c7f0: 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20  din]\n".    "if 
c800: 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20  {[info complete 
c810: 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20  $line]} {\n".   
c820: 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b     "if {[catch {
c830: 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65  uplevel #0 $line
c840: 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a  } result]} {\n".
c850: 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74          "puts st
c860: 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72  derr \"Error: $r
c870: 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20  esult\"\n".     
c880: 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73   "} elseif {$res
c890: 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ult!=\"\"} {\n".
c8a0: 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72          "puts $r
c8b0: 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22  esult\n".      "
c8c0: 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20  }\n".      "set 
c8d0: 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22  line {}\n".    "
c8e0: 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
c8f0: 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c    "append line \
c900: 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  \n\n".    "}\n".
c910: 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66    "}\n".;.#endif
c920: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ../*.** If the m
c930: 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 74 77  acro TCLSH is tw
c940: 6f 2c 20 74 68 65 6e 20 67 65 74 20 74 68 65 20  o, then get the 
c950: 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f  main loop code o
c960: 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70  ut of.** the sep
c970: 61 72 61 74 65 20 66 69 6c 65 20 22 73 70 61 63  arate file "spac
c980: 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f  eanal_tcl.h"..*/
c990: 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74  .#if TCLSH==2.st
c9a0: 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
c9b0: 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64  oop[] = .#includ
c9c0: 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c  e "spaceanal_tcl
c9d0: 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64  .h".;.#endif..#d
c9e0: 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e  efine TCLSH_MAIN
c9f0: 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65   main   /* Neede
ca00: 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b  d to fake out mk
ca10: 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43  tclapp */.int TC
ca20: 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67  LSH_MAIN(int arg
ca30: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
ca40: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
ca50: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e  nterp;.  Tcl_Fin
ca60: 64 45 78 65 63 75 74 61 62 6c 65 28 61 72 67 76  dExecutable(argv
ca70: 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d  [0]);.  interp =
ca80: 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72   Tcl_CreateInter
ca90: 70 28 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49  p();.  Sqlite3_I
caa0: 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66  nit(interp);.#if
cab0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
cac0: 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69    {.    extern i
cad0: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49  nt Sqlitetest1_I
cae0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
caf0: 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
cb00: 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
cb10: 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
cb20: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
cb30: 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
cb40: 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
cb50: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
cb60: 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63  itetest4_Init(Tc
cb70: 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
cb80: 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
cb90: 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f  etest5_Init(Tcl_
cba0: 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
cbb0: 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69  tern int Md5_Ini
cbc0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
cbd0: 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f      Sqlitetest1_
cbe0: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
cbf0: 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e    Sqlitetest2_In
cc00: 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
cc10: 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74  Sqlitetest3_Init
cc20: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
cc30: 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69  litetest4_Init(i
cc40: 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
cc50: 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74  tetest5_Init(int
cc60: 65 72 70 29 3b 0a 20 20 20 20 4d 64 35 5f 49 6e  erp);.    Md5_In
cc70: 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  it(interp);.  }.
cc80: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67  #endif.  if( arg
cc90: 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32  c>=2 || TCLSH==2
cca0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ccb0: 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
ccc0: 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67  terp,"argv0",arg
ccd0: 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f  v[1],TCL_GLOBAL_
cce0: 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
ccf0: 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
cd00: 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f  gv", "", TCL_GLO
cd10: 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66  BAL_ONLY);.    f
cd20: 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c  or(i=3-TCLSH; i<
cd30: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
cd40: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
cd50: 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67  erp, "argv", arg
cd60: 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[i],.          
cd70: 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20  TCL_GLOBAL_ONLY 
cd80: 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  | TCL_LIST_ELEME
cd90: 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f  NT | TCL_APPEND_
cda0: 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20  VALUE);.    }.  
cdb0: 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26    if( TCLSH==1 &
cdc0: 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69  & Tcl_EvalFile(i
cdd0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21  nterp, argv[1])!
cde0: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
cdf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
ce00: 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28  fo = Tcl_GetVar(
ce10: 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e  interp, "errorIn
ce20: 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  fo", TCL_GLOBAL_
ce30: 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28  ONLY);.      if(
ce40: 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66   zInfo==0 ) zInf
ce50: 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75  o = interp->resu
ce60: 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  lt;.      fprint
ce70: 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73  f(stderr,"%s: %s
ce80: 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66  \n", *argv, zInf
ce90: 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
cea0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
ceb0: 69 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54  if( argc<=1 || T
cec0: 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54  CLSH==2 ){.    T
ced0: 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e  cl_GlobalEval(in
cee0: 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29  terp, zMainloop)
cef0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
cf00: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43  ;.}.#endif /* TC
cf10: 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  LSH */..#endif /
cf20: 2a 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 43  * !defined(NO_TC
cf30: 4c 29 20 2a 2f 0a                                L) */.