/ Hex Artifact Content
Login

Artifact 245b242edfb587e305954698ed93c1bc3daed678:


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: 32 31 20 32 30 30 35 2f 30 34 2f 30 33 20 32 33  21 2005/04/03 23
01c0: 3a 35 34 3a 34 34 20 64 61 6e 69 65 6c 6b 31 39  :54:44 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 63 68 61 72  outine */.  char
0b80: 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20   *zNull;        
0b90: 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 73 75 62    /* Text to sub
0ba0: 73 74 69 74 75 74 65 20 66 6f 72 20 61 6e 20 53  stitute for an S
0bb0: 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f  QL NULL value */
0bc0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e  .  SqlFunc *pFun
0bd0: 63 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  c;       /* List
0be0: 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   of SQL function
0bf0: 73 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  s */.  SqlCollat
0c00: 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 2f 2a 20  e *pCollate; /* 
0c10: 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c  List of SQL coll
0c20: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20  ation functions 
0c30: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
0c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
0c50: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73  turn code of mos
0c60: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
0c70: 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c  _exec() */.  Tcl
0c80: 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65  _Obj *pCollateNe
0c90: 65 64 65 64 3b 20 20 2f 2a 20 43 6f 6c 6c 61 74  eded;  /* Collat
0ca0: 69 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70  ion needed scrip
0cb0: 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  t */.  SqlPrepar
0cc0: 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74  edStmt *stmtList
0cd0: 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65  ; /* List of pre
0ce0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
0cf0: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
0d00: 53 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20  Stmt *stmtLast; 
0d10: 2f 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e  /* Last statemen
0d20: 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  t in the list */
0d30: 0a 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20  .  int maxStmt; 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75   The next maximu
0d60: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74  m number of stmt
0d70: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  List */.  int nS
0d80: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
0d90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0da0: 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  f statements in 
0db0: 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  stmtList */.};..
0dc0: 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61  /*.** Finalize a
0dd0: 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20 6f  nd free a list o
0de0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
0df0: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
0e00: 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43 61  void flushStmtCa
0e10: 63 68 65 28 20 53 71 6c 69 74 65 44 62 20 2a 70  che( SqliteDb *p
0e20: 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65 70 61  Db ){.  SqlPrepa
0e30: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
0e40: 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20 70 44  t;..  while(  pD
0e50: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20  b->stmtList ){. 
0e60: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
0e70: 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69  ize( pDb->stmtLi
0e80: 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
0e90: 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d   pPreStmt = pDb-
0ea0: 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 70  >stmtList;.    p
0eb0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70  Db->stmtList = p
0ec0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 4e  Db->stmtList->pN
0ed0: 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  ext;.    Tcl_Fre
0ee0: 65 28 20 28 63 68 61 72 2a 29 70 50 72 65 53 74  e( (char*)pPreSt
0ef0: 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  mt );.  }.  pDb-
0f00: 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44  >nStmt = 0;.  pD
0f10: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b  b->stmtLast = 0;
0f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63 61  .}../*.** TCL ca
0f30: 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65 64 75  lls this procedu
0f40: 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c 69 74  re when an sqlit
0f50: 65 33 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d  e3 database comm
0f60: 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74 65  and is.** delete
0f70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
0f80: 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76 6f  d DbDeleteCmd(vo
0f90: 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74  id *db){.  Sqlit
0fa0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
0fb0: 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73  teDb*)db;.  flus
0fc0: 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b  hStmtCache(pDb);
0fd0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
0fe0: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69  (pDb->db);.  whi
0ff0: 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29  le( pDb->pFunc )
1000: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
1010: 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Func = pDb->pFun
1020: 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e  c;.    pDb->pFun
1030: 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74  c = pFunc->pNext
1040: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
1050: 63 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20  char*)pFunc);.  
1060: 7d 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e  }.  while( pDb->
1070: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
1080: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c  SqlCollate *pCol
1090: 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c  late = pDb->pCol
10a0: 6c 61 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70  late;.    pDb->p
10b0: 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61  Collate = pColla
10c0: 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54  te->pNext;.    T
10d0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
10e0: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20  Collate);.  }.  
10f0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
1100: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
1110: 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a  Db->zBusy);.  }.
1120: 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
1130: 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  e ){.    Tcl_Fre
1140: 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a  e(pDb->zTrace);.
1150: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
1160: 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Auth ){.    Tcl_
1170: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
1180: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
1190: 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63  >zNull ){.    Tc
11a0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
11b0: 6c 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72  l);.  }.  Tcl_Fr
11c0: 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a  ee((char*)pDb);.
11d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
11e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
11f0: 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
1200: 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77  file is locked w
1210: 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
1220: 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a  o execute SQL..*
1230: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42  /.static int DbB
1240: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
1250: 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29  *cd, int nTries)
1260: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
1270: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
1280: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  d;.  int rc;.  c
1290: 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 20 20  har zVal[30];.  
12a0: 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 54 63  char *zCmd;.  Tc
12b0: 6c 5f 44 53 74 72 69 6e 67 20 63 6d 64 3b 0a 0a  l_DString cmd;..
12c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
12d0: 74 28 26 63 6d 64 29 3b 0a 20 20 54 63 6c 5f 44  t(&cmd);.  Tcl_D
12e0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 63 6d  StringAppend(&cm
12f0: 64 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 2d  d, pDb->zBusy, -
1300: 31 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 56  1);.  sprintf(zV
1310: 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65 73  al, "%d", nTries
1320: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
1330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 63  AppendElement(&c
1340: 6d 64 2c 20 7a 56 61 6c 29 3b 0a 20 20 7a 43 6d  md, zVal);.  zCm
1350: 64 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  d = Tcl_DStringV
1360: 61 6c 75 65 28 26 63 6d 64 29 3b 0a 20 20 72 63  alue(&cmd);.  rc
1370: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
1380: 3e 69 6e 74 65 72 70 2c 20 7a 43 6d 64 29 3b 0a  >interp, zCmd);.
1390: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
13a0: 65 28 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72  e(&cmd);.  if( r
13b0: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
13c0: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
13d0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
13e0: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
13f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
1400: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 1;.}../*.** Th
1410: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
1420: 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70 72  voked as the 'pr
1430: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27  ogress callback'
1440: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1450: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1460: 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
1470: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
1480: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
1490: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
14a0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
14b0: 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rt( pDb->zProgre
14c0: 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c  ss );.  rc = Tcl
14d0: 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72  _Eval(pDb->inter
14e0: 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  p, pDb->zProgres
14f0: 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  s);.  if( rc!=TC
1500: 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c  L_OK || atoi(Tcl
1510: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
1520: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29  (pDb->interp)) )
1530: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1540: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1550: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1560: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1570: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 74 72  by the SQLite tr
1580: 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  ace handler when
1590: 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c  ever a new.** bl
15a0: 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78  ock of SQL is ex
15b0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c  ecuted.  The TCL
15c0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
15d0: 7a 54 72 61 63 65 20 69 73 20 65 78 65 63 75 74  zTrace is execut
15e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
15f0: 69 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  id DbTraceHandle
1600: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
1610: 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
1620: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
1630: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
1640: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
1650: 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r;..  Tcl_DStrin
1660: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
1670: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
1680: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61  (&str, pDb->zTra
1690: 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  ce, -1);.  Tcl_D
16a0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
16b0: 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b  ent(&str, zSql);
16c0: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
16d0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
16e0: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
16f0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
1700: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
1710: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
1720: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a  ->interp);.}../*
1730: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1740: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1750: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1760: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54 68 65   committed.  The
1770: 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74 20 69  .** TCL script i
1780: 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69  n pDb->zCommit i
1790: 73 20 65 78 65 63 75 74 65 64 2e 20 20 49 66 20  s executed.  If 
17a0: 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  it returns non-z
17b0: 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20  ero or.** if it 
17c0: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
17d0: 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ion, the transac
17e0: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
17f0: 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  ack instead.** o
1800: 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  f being committe
1810: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1820: 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72   DbCommitHandler
1830: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
1840: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
1850: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
1860: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54  nt rc;..  rc = T
1870: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
1880: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
1890: 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  t);.  if( rc!=TC
18a0: 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c  L_OK || atoi(Tcl
18b0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
18c0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29  (pDb->interp)) )
18d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
18e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18f0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  }..static void t
1900: 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28  clCollateNeeded(
1910: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
1920: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
1930: 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74  int enc,.  const
1940: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
1950: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
1960: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43  = (SqliteDb *)pC
1970: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
1980: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70  Script = Tcl_Dup
1990: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
19a0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
19b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
19c0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54  nt(pScript);.  T
19d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
19e0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69  Element(0, pScri
19f0: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
1a00: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
1a10: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
1a20: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
1a30: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63  Script, 0);.  Tc
1a40: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
1a50: 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Script);.}../*.*
1a60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1a70: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
1a80: 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c  uate an SQL coll
1a90: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
1aa0: 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73  mplemented.** us
1ab0: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a  ing TCL script..
1ac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
1ad0: 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76  lSqlCollate(.  v
1ae0: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
1af0: 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nA,.  const voi
1b00: 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
1b10: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1b20: 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  B.){.  SqlCollat
1b30: 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  e *p = (SqlColla
1b40: 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  te *)pCtx;.  Tcl
1b50: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70  _Obj *pCmd;..  p
1b60: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
1b70: 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70  ingObj(p->zScrip
1b80: 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  t, -1);.  Tcl_In
1b90: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
1ba0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
1bb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
1bc0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
1bd0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
1be0: 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c  A, nA));.  Tcl_L
1bf0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1c00: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
1c10: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
1c20: 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a  ngObj(zB, nB));.
1c30: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
1c40: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
1c50: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
1c60: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
1c70: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
1c80: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1c90: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
1ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1cb0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1cc0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
1cd0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
1ce0: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
1cf0: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
1d00: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
1d10: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
1d20: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1d30: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
1d40: 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b  e3_value**argv){
1d50: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20  .  SqlFunc *p = 
1d60: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
1d70: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63  a(context);.  Tc
1d80: 6c 5f 44 53 74 72 69 6e 67 20 63 6d 64 3b 0a 20  l_DString cmd;. 
1d90: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
1da0: 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ;..  Tcl_DString
1db0: 49 6e 69 74 28 26 63 6d 64 29 3b 0a 20 20 54 63  Init(&cmd);.  Tc
1dc0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
1dd0: 26 63 6d 64 2c 20 70 2d 3e 7a 53 63 72 69 70 74  &cmd, p->zScript
1de0: 2c 20 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30  , -1);.  for(i=0
1df0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
1e00: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
1e10: 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL==sqlite3_val
1e20: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29  ue_type(argv[i])
1e30: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53   ){.      Tcl_DS
1e40: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
1e50: 6e 74 28 26 63 6d 64 2c 20 22 22 29 3b 0a 20 20  nt(&cmd, "");.  
1e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
1e70: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
1e80: 45 6c 65 6d 65 6e 74 28 26 63 6d 64 2c 20 73 71  Element(&cmd, sq
1e90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1ea0: 28 61 72 67 76 5b 69 5d 29 29 3b 0a 20 20 20 20  (argv[i]));.    
1eb0: 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 54 63 6c  }.  }.  rc = Tcl
1ec0: 5f 45 76 61 6c 28 70 2d 3e 69 6e 74 65 72 70 2c  _Eval(p->interp,
1ed0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
1ee0: 65 28 26 63 6d 64 29 29 3b 0a 20 20 69 66 28 20  e(&cmd));.  if( 
1ef0: 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
1f00: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
1f10: 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53  ontext, Tcl_GetS
1f20: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
1f30: 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20  nterp), -1); .  
1f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1f50: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
1f60: 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53  ontext, Tcl_GetS
1f70: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
1f80: 6e 74 65 72 70 29 2c 20 2d 31 2c 20 0a 20 20 20  nterp), -1, .   
1f90: 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e       SQLITE_TRAN
1fa0: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  SIENT);.  }.}..#
1fb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fc0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1fd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
1fe0: 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  he authenticatio
1ff0: 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  n function.  It 
2000: 61 70 70 65 6e 64 73 20 74 68 65 20 61 75 74 68  appends the auth
2010: 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79  entication.** ty
2020: 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  pe code and the 
2030: 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  two arguments to
2040: 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76   zCmd[] then inv
2050: 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  okes the result.
2060: 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70  ** on the interp
2070: 72 65 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c  reter.  The repl
2080: 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f  y is examined to
2090: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
20a0: 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74  e.** authenticat
20b0: 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63  ion fails or suc
20c0: 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ceeds..*/.static
20d0: 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61   int auth_callba
20e0: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ck(.  void *pArg
20f0: 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20  ,.  int code,.  
2100: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
2110: 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1,.  const char 
2120: 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20  *zArg2,.  const 
2130: 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63  char *zArg3,.  c
2140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34  onst char *zArg4
2150: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64  .){.  char *zCod
2160: 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  e;.  Tcl_DString
2170: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   str;.  int rc;.
2180: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
2190: 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62  eply;.  SqliteDb
21a0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
21b0: 62 2a 29 70 41 72 67 3b 0a 0a 20 20 73 77 69 74  b*)pArg;..  swit
21c0: 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20 20 20  ch( code ){.    
21d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 50 59  case SQLITE_COPY
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
21f0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f  zCode="SQLITE_CO
2200: 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  PY"; break;.    
2210: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
2220: 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20 3a 20  TE_INDEX      : 
2230: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
2240: 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62 72 65  EATE_INDEX"; bre
2250: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2260: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
2270: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
2280: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
2290: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
22a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
22b0: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20  TE_TEMP_INDEX : 
22c0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
22d0: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22  EATE_TEMP_INDEX"
22e0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
22f0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
2300: 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f  TEMP_TABLE : zCo
2310: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
2320: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62  E_TEMP_TABLE"; b
2330: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2340: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
2350: 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f 64 65  P_TRIGGER: zCode
2360: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
2370: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62  TEMP_TRIGGER"; b
2380: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2390: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
23a0: 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d  P_VIEW  : zCode=
23b0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
23c0: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
23d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
23e0: 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52  E_CREATE_TRIGGER
23f0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
2400: 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47  ITE_CREATE_TRIGG
2410: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
2420: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
2430: 54 45 5f 56 49 45 57 20 20 20 20 20 20 20 3a 20  TE_VIEW       : 
2440: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
2450: 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72 65 61  EATE_VIEW"; brea
2460: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2470: 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 20  TE_DELETE       
2480: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
2490: 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20 62 72  LITE_DELETE"; br
24a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
24b0: 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20  LITE_DROP_INDEX 
24c0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
24d0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
24e0: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
24f0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
2500: 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a 20 7a  TABLE        : z
2510: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
2520: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
2530: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2540: 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
2550: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
2560: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
2570: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
2580: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
2590: 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20  _TEMP_TABLE   : 
25a0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
25b0: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20  OP_TEMP_TABLE"; 
25c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
25d0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
25e0: 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f 64 65  _TRIGGER : zCode
25f0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
2600: 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  MP_TRIGGER"; bre
2610: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2620: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
2630: 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  EW    : zCode="S
2640: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
2650: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
2660: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
2670: 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20 20 20  OP_TRIGGER      
2680: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
2690: 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b 20 62  DROP_TRIGGER"; b
26a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
26b0: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 20  QLITE_DROP_VIEW 
26c0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
26d0: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45  "SQLITE_DROP_VIE
26e0: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
26f0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  ase SQLITE_INSER
2700: 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  T            : z
2710: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53  Code="SQLITE_INS
2720: 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ERT"; break;.   
2730: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 41   case SQLITE_PRA
2740: 47 4d 41 20 20 20 20 20 20 20 20 20 20 20 20 3a  GMA            :
2750: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50   zCode="SQLITE_P
2760: 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20  RAGMA"; break;. 
2770: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
2780: 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
2790: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
27a0: 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20  _READ"; break;. 
27b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
27c0: 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20  ELECT           
27d0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
27e0: 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b  _SELECT"; break;
27f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2800: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20 20 20  _TRANSACTION    
2810: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
2820: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b  TE_TRANSACTION";
2830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2840: 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 20   SQLITE_UPDATE  
2850: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
2860: 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41 54 45  e="SQLITE_UPDATE
2870: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
2880: 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48  se SQLITE_ATTACH
2890: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
28a0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54 54 41  ode="SQLITE_ATTA
28b0: 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CH"; break;.    
28c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 54 41  case SQLITE_DETA
28d0: 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CH            : 
28e0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45  zCode="SQLITE_DE
28f0: 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TACH"; break;.  
2900: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4c    case SQLITE_AL
2910: 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20 20 20  TER_TABLE       
2920: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
2930: 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20 62 72  ALTER_TABLE"; br
2940: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2950: 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20 20 20  LITE_REINDEX    
2960: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
2970: 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 22 3b  SQLITE_REINDEX";
2980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
2990: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
29a0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
29b0: 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b  e="????"; break;
29c0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69  .  }.  Tcl_DStri
29d0: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
29e0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
29f0: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75  d(&str, pDb->zAu
2a00: 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  th, -1);.  Tcl_D
2a10: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
2a20: 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29  ent(&str, zCode)
2a30: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
2a40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
2a50: 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31  r, zArg1 ? zArg1
2a60: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
2a70: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
2a80: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f  nt(&str, zArg2 ?
2a90: 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20   zArg2 : "");.  
2aa0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
2ab0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
2ac0: 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22  Arg3 ? zArg3 : "
2ad0: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
2ae0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
2af0: 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72  str, zArg4 ? zAr
2b00: 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d  g4 : "");.  rc =
2b10: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
2b20: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
2b30: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
2b40: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
2b50: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
2b60: 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65   zReply = Tcl_Ge
2b70: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
2b80: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  b->interp);.  if
2b90: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
2ba0: 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20  "SQLITE_OK")==0 
2bb0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2bc0: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
2bd0: 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79  f( strcmp(zReply
2be0: 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d  ,"SQLITE_DENY")=
2bf0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
2c00: 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65  QLITE_DENY;.  }e
2c10: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
2c20: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47  Reply,"SQLITE_IG
2c30: 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20  NORE")==0 ){.   
2c40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e   rc = SQLITE_IGN
2c50: 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ORE;.  }else{.  
2c60: 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a    rc = 999;.  }.
2c70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2c80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2c90: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
2ca0: 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65  ON */../*.** zTe
2cb0: 78 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  xt is a pointer 
2cc0: 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
2cd0: 20 76 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f   via an sqlite3_
2ce0: 72 65 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a  result_text().**
2cf0: 20 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65   or similar inte
2d00: 72 66 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74  rface. This rout
2d10: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 54 63  ine returns a Tc
2d20: 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c  l string object,
2d30: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63   .** reference c
2d40: 6f 75 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63  ount set to 0, c
2d50: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
2d60: 78 74 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61  xt. If a transla
2d70: 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20  tion.** between 
2d80: 69 73 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d  iso8859 and UTF-
2d90: 38 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69  8 is required, i
2da0: 74 20 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a  t is preformed..
2db0: 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  */.static Tcl_Ob
2dc0: 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63  j *dbTextToObj(c
2dd0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
2de0: 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
2df0: 61 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54  al;.#ifdef UTF_T
2e00: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
2e10: 44 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  D.  Tcl_DString 
2e20: 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72  dCol;.  Tcl_DStr
2e30: 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a  ingInit(&dCol);.
2e40: 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f    Tcl_ExternalTo
2e50: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c  UtfDString(NULL,
2e60: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f   zText, -1, &dCo
2e70: 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c  l);.  pVal = Tcl
2e80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
2e90: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
2ea0: 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63  dCol), -1);.  Tc
2eb0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
2ec0: 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56  Col);.#else.  pV
2ed0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
2ee0: 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29  ngObj(zText, -1)
2ef0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
2f00: 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pVal;.}../*.**
2f10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2f20: 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65  ads a line of te
2f30: 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c  xt from FILE in,
2f40: 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74   stores.** the t
2f50: 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ext in memory ob
2f60: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
2f70: 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73  oc() and returns
2f80: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
2f90: 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c   the text.  NULL
2fa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20   is returned at 
2fb0: 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20  end of file, or 
2fc0: 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66  if malloc().** f
2fd0: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails..**.** The 
2fe0: 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b  interface is lik
2ff0: 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74  e "readline" but
3000: 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   no command-line
3010: 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64   editing.** is d
3020: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65  one..**.** copie
3030: 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66  d from shell.c f
3040: 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f  rom '.import' co
3050: 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20  mmand.*/.static 
3060: 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c  char *local_getl
3070: 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70  ine(char *zPromp
3080: 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  t, FILE *in){.  
3090: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69  char *zLine;.  i
30a0: 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  nt nLine;.  int 
30b0: 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20  n;.  int eol;.. 
30c0: 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20   nLine = 100;.  
30d0: 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  zLine = malloc( 
30e0: 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a  nLine );.  if( z
30f0: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
3100: 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65   0;.  n = 0;.  e
3110: 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ol = 0;.  while(
3120: 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28   !eol ){.    if(
3130: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
3140: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
3150: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
3160: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
3170: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
3180: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
3190: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
31a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
31b0: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
31c0: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
31d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
31e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
31f0: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
3200: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3210: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
3220: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
3230: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  eol = 1;.      b
3240: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3250: 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20  while( zLine[n] 
3260: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ n++; }.    if
3270: 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e  ( n>0 && zLine[n
3280: 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  -1]=='\n' ){.   
3290: 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c     n--;.      zL
32a0: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
32b0: 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d    eol = 1;.    }
32c0: 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72  .  }.  zLine = r
32d0: 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e  ealloc( zLine, n
32e0: 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  +1 );.  return z
32f0: 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Line;.}../*.** T
3300: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
3310: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
3320: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
3330: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
3340: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
3350: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
3360: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
3370: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
3380: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
3390: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
33a0: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
33b0: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
33c0: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
33d0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
33e0: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
33f0: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
3400: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
3410: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
3420: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
3430: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
3440: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
3450: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
3460: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
3470: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
3480: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
3490: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
34a0: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
34b0: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
34c0: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
34d0: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
34e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34f0: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
3500: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
3510: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
3520: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
3530: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
3540: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
3550: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
3560: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
3570: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
3580: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
3590: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
35a0: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
35b0: 20 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 20       "busy",    
35c0: 20 20 20 20 20 20 20 20 20 20 22 63 61 63 68 65            "cache
35d0: 22 2c 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22  ",.    "changes"
35e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6c  ,            "cl
35f0: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
3600: 20 20 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20    "collate",.   
3610: 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64   "collation_need
3620: 65 64 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68  ed",   "commit_h
3630: 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d  ook",       "com
3640: 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70  plete",.    "cop
3650: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
3660: 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20    "errorcode",  
3670: 20 20 20 20 20 20 20 22 65 76 61 6c 22 2c 0a 20         "eval",. 
3680: 20 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20     "function",  
3690: 20 20 20 20 20 20 20 20 20 22 6c 61 73 74 5f 69           "last_i
36a0: 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 22 6e  nsert_rowid", "n
36b0: 75 6c 6c 76 61 6c 75 65 22 2c 0a 20 20 20 20 22  ullvalue",.    "
36c0: 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20  onecolumn",     
36d0: 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c       "progress",
36e0: 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65 79            "rekey
36f0: 22 2c 0a 20 20 20 20 22 74 69 6d 65 6f 75 74 22  ",.    "timeout"
3700: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 74 6f  ,            "to
3710: 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20 20  tal_changes",   
3720: 20 20 22 74 72 61 63 65 22 2c 0a 20 20 20 20 22    "trace",.    "
3730: 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 30 20  version",.    0 
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20     .  };.  enum 
3760: 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42  DB_enum {.    DB
3770: 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20  _AUTHORIZER,    
3780: 20 20 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20      DB_BUSY,    
3790: 20 20 20 20 20 20 20 20 20 44 42 5f 43 41 43 48           DB_CACH
37a0: 45 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45  E,.    DB_CHANGE
37b0: 53 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  S,           DB_
37c0: 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
37d0: 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20    DB_COLLATE,.  
37e0: 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e    DB_COLLATION_N
37f0: 45 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49  EEDED,  DB_COMMI
3800: 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f  T_HOOK,      DB_
3810: 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42  COMPLETE,.    DB
3820: 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20  _COPY,          
3830: 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45      DB_ERRORCODE
3840: 2c 20 20 20 20 20 20 20 20 44 42 5f 45 56 41 4c  ,        DB_EVAL
3850: 2c 0a 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f  ,.    DB_FUNCTIO
3860: 4e 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 4c  N,          DB_L
3870: 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
3880: 2c 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 0a 20  ,DB_NULLVALUE,. 
3890: 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c     DB_ONECOLUMN,
38a0: 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f 47           DB_PROG
38b0: 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 44 42  RESS,         DB
38c0: 5f 52 45 4b 45 59 2c 0a 20 20 20 20 44 42 5f 54  _REKEY,.    DB_T
38d0: 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20  IMEOUT,         
38e0: 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47    DB_TOTAL_CHANG
38f0: 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c  ES,    DB_TRACE,
3900: 0a 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 0a  .    DB_VERSION.
3910: 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20    };.  /* don't 
3920: 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63  leave trailing c
3930: 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d  ommas on DB_enum
3940: 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68  , it confuses th
3950: 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c  e AIX xlc compil
3960: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  er */..  if( obj
3970: 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
3980: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
3990: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 1, objv, "SU
39a0: 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a  BCOMMAND ...");.
39b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
39c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
39d0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
39e0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
39f0: 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f  [1], DB_strs, "o
3a00: 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69  ption", 0, &choi
3a10: 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ce) ){.    retur
3a20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3a30: 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75  ..  switch( (enu
3a40: 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65  m DB_enum)choice
3a50: 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   ){..  /*    $db
3a60: 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c   authorizer ?CAL
3a70: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
3a80: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
3a90: 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  n callback to au
3aa0: 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c  thorize each SQL
3ab0: 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74   operation as it
3ac0: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   is.  ** compile
3ad0: 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20  d.  5 arguments 
3ae0: 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20  are appended to 
3af0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66  the callback bef
3b00: 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  ore it is.  ** i
3b10: 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  nvoked:.  **.  *
3b20: 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68  *   (1) The auth
3b30: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28  orization type (
3b40: 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ex: SQLITE_CREAT
3b50: 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f  E_TABLE, SQLITE_
3b60: 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a  INSERT, ...).  *
3b70: 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65  *   (2) First de
3b80: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28  scriptive name (
3b90: 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f  depends on autho
3ba0: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20  rization type). 
3bb0: 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64   **   (3) Second
3bc0: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
3bd0: 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d  e.  **   (4) Nam
3be0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
3bf0: 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22  e (ex: "main", "
3c00: 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35  temp").  **   (5
3c10: 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65  ) Name of trigge
3c20: 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20  r that is doing 
3c30: 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a  the access.  **.
3c40: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63    ** The callbac
3c50: 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  k should return 
3c60: 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  on of the follow
3c70: 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c  ing strings: SQL
3c80: 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c  ITE_OK,.  ** SQL
3c90: 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53  ITE_IGNORE, or S
3ca0: 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79  QLITE_DENY.  Any
3cb0: 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
3cc0: 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  lue is an error.
3cd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
3ce0: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76  is method is inv
3cf0: 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67  oked with no arg
3d00: 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72  uments, the curr
3d10: 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ent authorizatio
3d20: 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  n.  ** callback 
3d30: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
3d40: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
3d50: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b  DB_AUTHORIZER: {
3d60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
3d70: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
3d80: 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  N.    Tcl_Append
3d90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
3da0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f  authorization no
3db0: 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
3dc0: 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a  his build", 0);.
3dd0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3de0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
3df0: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
3e00: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
3e10: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
3e20: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
3e30: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
3e40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
3e50: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
3e60: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
3e70: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
3e80: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
3e90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
3ea0: 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20  Db->zAuth, 0);. 
3eb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
3ec0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41  {.      char *zA
3ed0: 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  uth;.      int l
3ee0: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
3ef0: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
3f00: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3f10: 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20  ->zAuth);.      
3f20: 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20  }.      zAuth = 
3f30: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3f40: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
3f50: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
3f60: 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Auth && len>0 ){
3f70: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
3f80: 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  uth = Tcl_Alloc(
3f90: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
3fa0: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
3fb0: 7a 41 75 74 68 2c 20 7a 41 75 74 68 29 3b 0a 20  zAuth, zAuth);. 
3fc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3fd0: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
3fe0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3ff0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
4000: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
4010: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
4020: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4030: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
4040: 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63  (pDb->db, auth_c
4050: 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20  allback, pDb);. 
4060: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4070: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
4080: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
4090: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
40a0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
40b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
40c0: 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79    /*    $db busy
40d0: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
40e0: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
40f0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
4100: 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  if an SQL statem
4110: 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ent attempts to 
4120: 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  open.  ** a lock
4130: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
4140: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
4150: 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28  _BUSY: {.    if(
4160: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
4170: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
4180: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
4190: 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a  v, "CALLBACK");.
41a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
41b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
41c0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
41d0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
41e0: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
41f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4200: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
4210: 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  Busy, 0);.      
4220: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4230: 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a     char *zBusy;.
4240: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
4250: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
4260: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
4270: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
4280: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
4290: 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47     zBusy = Tcl_G
42a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
42b0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
42c0: 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20        if( zBusy 
42d0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
42e0: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
42f0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
4300: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
4310: 74 72 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79  trcpy(pDb->zBusy
4320: 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20  , zBusy);.      
4330: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
4340: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20  Db->zBusy = 0;. 
4350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4360: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
4370: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
4380: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
4390: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
43a0: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
43b0: 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  b, DbBusyHandler
43c0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
43d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
43e0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
43f0: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
4400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4420: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63    /*     $db cac
4430: 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20  he flush.  **   
4440: 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a 65    $db cache size
4450: 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75   n.  **.  ** Flu
4460: 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64 20  sh the prepared 
4470: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c  statement cache,
4480: 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78 69   or set the maxi
4490: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  mum number of.  
44a0: 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  ** cached statem
44b0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ents..  */.  cas
44c0: 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20  e DB_CACHE: {.  
44d0: 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a    char *subCmd;.
44e0: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
44f0: 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20  if( objc<=2 ){. 
4500: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
4510: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
4520: 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70   objv, "cache op
4530: 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20  tion ?arg?");.  
4540: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4550: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
4560: 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74  subCmd = Tcl_Get
4570: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f  StringFromObj( o
4580: 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20  bjv[2], 0 );.   
4590: 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66   if( *subCmd=='f
45a0: 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43  ' && strcmp(subC
45b0: 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29  md,"flush")==0 )
45c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
45d0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
45e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
45f0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
4600: 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20   "flush");.     
4610: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4620: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
4630: 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53  {.        flushS
4640: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
4650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4660: 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d  se if( *subCmd==
4670: 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  's' && strcmp(su
4680: 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20  bCmd,"size")==0 
4690: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
46a0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=4 ){.        
46b0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
46c0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
46d0: 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20  , "size n");.   
46e0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
46f0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
4700: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
4710: 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47  TCL_ERROR==Tcl_G
4720: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
4730: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
4740: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
4750: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4760: 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74   interp, "cannot
4770: 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20   convert \"", . 
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
4790: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
47a0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22  bj(objv[3],0), "
47b0: 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20  \" to integer", 
47c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
47d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
47e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
47f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30           if( n<0
4800: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4810: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
4820: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  pDb );.         
4830: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
4840: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
4850: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
4860: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
4870: 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52    n = MAX_PREPAR
4880: 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20  ED_STMTS;.      
4890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
48a0: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e  pDb->maxStmt = n
48b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
48c0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
48d0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
48e0: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
48f0: 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20  bad option \"", 
4900: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
4910: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
4920: 6f 62 6a 76 5b 30 5d 2c 30 29 2c 20 22 5c 22 3a  objv[0],0), "\":
4930: 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f   must be flush o
4940: 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20  r size", 0);.   
4950: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4960: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
4970: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
4980: 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a      $db changes.
4990: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
49a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
49b0: 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
49c0: 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
49d0: 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a  , or deleted by.
49e0: 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65    ** the most re
49f0: 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44  cent INSERT, UPD
4a00: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
4a10: 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63  atement, not inc
4a20: 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79  luding .  ** any
4a30: 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
4a40: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
4a50: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
4a60: 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  B_CHANGES: {.   
4a70: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
4a80: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
4a90: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
4aa0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
4ab0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
4ac0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4ad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
4ae0: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
4af0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
4b00: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
4b10: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
4b20: 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  lt, sqlite3_chan
4b30: 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
4b40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
4b50: 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65   /*    $db close
4b60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64  .  **.  ** Shutd
4b70: 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  own the database
4b80: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
4b90: 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c  CLOSE: {.    Tcl
4ba0: 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69  _DeleteCommand(i
4bb0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
4bc0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
4bd0: 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72  [0], 0));.    br
4be0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
4bf0: 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f    $db commit_hoo
4c00: 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  k ?CALLBACK?.  *
4c10: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
4c20: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
4c30: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d   just before com
4c40: 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51  mitting every SQ
4c50: 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  L transaction.. 
4c60: 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62   ** If the callb
4c70: 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78  ack throws an ex
4c80: 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72  ception or retur
4c90: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
4ca0: 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  n the.  ** trans
4cb0: 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65  action is aborte
4cc0: 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20  d.  If CALLBACK 
4cd0: 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  is an empty stri
4ce0: 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ng, the callback
4cf0: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
4d00: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
4d10: 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b  B_COMMIT_HOOK: {
4d20: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
4d30: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
4d40: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
4d50: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
4d60: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
4d70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4d80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4d90: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
4da0: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
4db0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
4dc0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4dd0: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d  terp, pDb->zComm
4de0: 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  it, 0);.      }.
4df0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4e00: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a   char *zCommit;.
4e10: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
4e20: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
4e30: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
4e40: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
4e50: 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  Commit);.      }
4e60: 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d  .      zCommit =
4e70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
4e80: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
4e90: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
4ea0: 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30  zCommit && len>0
4eb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
4ec0: 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41  >zCommit = Tcl_A
4ed0: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
4ee0: 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
4ef0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43  pDb->zCommit, zC
4f00: 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 65  ommit);.      }e
4f10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
4f20: 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20  ->zCommit = 0;. 
4f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4f40: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b   pDb->zCommit ){
4f50: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
4f60: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
4f70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
4f80: 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e  ommit_hook(pDb->
4f90: 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  db, DbCommitHand
4fa0: 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
4fb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4fc0: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
4fd0: 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ook(pDb->db, 0, 
4fe0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
4ff0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
5000: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
5010: 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45  $db collate NAME
5020: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
5030: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
5040: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
5050: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
5060: 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a  E.  Whenever.  *
5070: 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
5080: 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  is called, invok
5090: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
50a0: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
50b0: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
50c0: 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  B_COLLATE: {.   
50d0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
50e0: 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20  llate;.    char 
50f0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
5100: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
5110: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
5120: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
5130: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
5140: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
5150: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
5160: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
5170: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5180: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
5190: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
51a0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
51b0: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
51c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
51d0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
51e0: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43  nScript);.    pC
51f0: 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c  ollate = (SqlCol
5200: 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  late*)Tcl_Alloc(
5210: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74   sizeof(*pCollat
5220: 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31  e) + nScript + 1
5230: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
5240: 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  late==0 ) return
5250: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5260: 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70  pCollate->interp
5270: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70   = interp;.    p
5280: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d  Collate->pNext =
5290: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
52a0: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53      pCollate->zS
52b0: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
52c0: 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20  pCollate[1];.   
52d0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
52e0: 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 73   pCollate;.    s
52f0: 74 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e  trcpy(pCollate->
5300: 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74  zScript, zScript
5310: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
5320: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
5330: 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
5340: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  me, SQLITE_UTF8,
5350: 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61   .        pColla
5360: 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74  te, tclSqlCollat
5370: 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  e) ){.      Tcl_
5380: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
5390: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
53a0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
53b0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
53c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
53d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
53e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
53f0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
5400: 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  b collation_need
5410: 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ed SCRIPT.  **. 
5420: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
5430: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
5440: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
5450: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
5460: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
5470: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
5480: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
5490: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
54a0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
54b0: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
54c0: 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20  EDED: {.    if( 
54d0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
54e0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
54f0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
5500: 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20  v, "SCRIPT");.  
5510: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5520: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
5530: 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  if( pDb->pCollat
5540: 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20  eNeeded ){.     
5550: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5560: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
5570: 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  eeded);.    }.  
5580: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e    pDb->pCollateN
5590: 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c  eeded = Tcl_Dupl
55a0: 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d  icateObj(objv[2]
55b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
55c0: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
55d0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
55e0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74    sqlite3_collat
55f0: 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e  ion_needed(pDb->
5600: 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c  db, pDb, tclColl
5610: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
5620: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
5630: 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
5640: 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
5650: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
5660: 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
5670: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
5680: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
5690: 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
56a0: 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
56b0: 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
56c0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
56d0: 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
56e0: 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
56f0: 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
5700: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
5710: 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e  COMPLETE: {.#ifn
5720: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5730: 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c  COMPLETE.    Tcl
5740: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
5750: 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74     int isComplet
5760: 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
5770: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
5780: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
5790: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
57a0: 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  QL");.      retu
57b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
57c0: 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65    }.    isComple
57d0: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  te = sqlite3_com
57e0: 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74  plete( Tcl_GetSt
57f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
5800: 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  [2], 0) );.    p
5810: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
5820: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
5830: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f  );.    Tcl_SetBo
5840: 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74  oleanObj(pResult
5850: 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23  , isComplete);.#
5860: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
5870: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
5880: 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65     $db errorcode
5890: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
58a0: 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72  n the numeric er
58b0: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61  ror code that wa
58c0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
58d0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20  e most recent.  
58e0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
58f0: 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a  e3_exec()..  */.
5900: 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43    case DB_ERRORC
5910: 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ODE: {.    Tcl_S
5920: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
5930: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
5940: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  j(sqlite3_errcod
5950: 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  e(pDb->db)));.  
5960: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20    break;.  }.   
5970: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
5980: 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72  b eval $sql ?arr
5990: 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e  ay? ?{  ...code.
59a0: 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24 64  .. }?.  **    $d
59b0: 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c  b onecolumn $sql
59c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53  .  **.  ** The S
59d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
59e0: 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65  $sql is evaluate
59f0: 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77  d.  For each row
5a00: 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  , the values are
5a10: 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20  .  ** placed in 
5a20: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
5a30: 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72  array named "arr
5a40: 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e  ay" and ...code.
5a50: 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  .. is executed..
5a60: 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20    ** If "array" 
5a70: 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f  and "code" are o
5a80: 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20  mitted, then no 
5a90: 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72  callback is ever
5aa0: 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20  y invoked..  ** 
5ab0: 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e  If "array" is an
5ac0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
5ad0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61  hen the values a
5ae0: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72  re placed in var
5af0: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74  iables.  ** that
5b00: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
5b10: 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64  ame as the field
5b20: 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74  s extracted by t
5b30: 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  he query..  **. 
5b40: 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d   ** The onecolum
5b50: 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20  n method is the 
5b60: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20  equivalent of:. 
5b70: 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b   **     lindex [
5b80: 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30  $db eval $sql] 0
5b90: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
5ba0: 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61 73  ONECOLUMN:.  cas
5bb0: 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20 20 20  e DB_EVAL: {.   
5bc0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71   char const *zSq
5bd0: 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  l;      /* Next 
5be0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
5bf0: 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 20 20   execute */.    
5c00: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4c 65 66  char const *zLef
5c10: 74 3b 20 20 20 20 20 2f 2a 20 57 68 61 74 20 69  t;     /* What i
5c20: 73 20 6c 65 66 74 20 61 66 74 65 72 20 66 69 72  s left after fir
5c30: 73 74 20 73 74 6d 74 20 69 6e 20 7a 53 71 6c 20  st stmt in zSql 
5c40: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
5c50: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a  tmt *pStmt;   /*
5c60: 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74   Compiled SQL st
5c70: 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 54 63  atment */.    Tc
5c80: 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20  l_Obj *pArray;  
5c90: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
5ca0: 61 72 72 61 79 20 69 6e 74 6f 20 77 68 69 63 68  array into which
5cb0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69   results are wri
5cc0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  tten */.    Tcl_
5cd0: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20  Obj *pScript;   
5ce0: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 74 6f 20     /* Script to 
5cf0: 72 75 6e 20 66 6f 72 20 65 61 63 68 20 72 65 73  run for each res
5d00: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 54  ult set */.    T
5d10: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b  cl_Obj **apParm;
5d20: 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74        /* Paramet
5d30: 65 72 73 20 74 68 61 74 20 6e 65 65 64 20 61 20  ers that need a 
5d40: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5d50: 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  () */.    int nP
5d60: 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  arm;            
5d70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
5d80: 74 72 69 65 73 20 75 73 65 64 20 69 6e 20 61 70  tries used in ap
5d90: 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54 63  Parm[] */.    Tc
5da0: 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b 31 30 5d  l_Obj *aParm[10]
5db0: 3b 20 20 20 20 2f 2a 20 53 74 61 74 69 63 20 73  ;    /* Static s
5dc0: 70 61 63 65 20 66 6f 72 20 61 70 50 61 72 6d 5b  pace for apParm[
5dd0: 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ] in the common 
5de0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  case */.    Tcl_
5df0: 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20 20 20 20  Obj *pRet;      
5e00: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62     /* Value to b
5e10: 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 20 20  e returned */.  
5e20: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
5e30: 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 2f 2a  t *pPreStmt;  /*
5e40: 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72   Pointer to a pr
5e50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
5e60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   */.    int rc2;
5e70: 0a 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ..    if( choice
5e80: 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
5e90: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
5ea0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
5eb0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
5ec0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
5ed0: 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 20   "SQL");.       
5ee0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5ef0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
5f00: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d   pRet = 0;.    }
5f10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
5f20: 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35  objc<3 || objc>5
5f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5f40: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
5f50: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
5f60: 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20  QL ?ARRAY-NAME? 
5f70: 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
5f80: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5f90: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
5fa0: 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e      pRet = Tcl_N
5fb0: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
5fc0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5fd0: 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pRet);.    }.   
5fe0: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
5ff0: 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 70        pArray = p
6000: 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20  Script = 0;.    
6010: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
6020: 34 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61  4 ){.      pArra
6030: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63  y = 0;.      pSc
6040: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  ript = objv[3];.
6050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6060: 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33   pArray = objv[3
6070: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  ];.      if( Tcl
6080: 5f 47 65 74 53 74 72 69 6e 67 28 70 41 72 72 61  _GetString(pArra
6090: 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72 61  y)[0]==0 ) pArra
60a0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63  y = 0;.      pSc
60b0: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a  ript = objv[4];.
60c0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49      }..    Tcl_I
60d0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ncrRefCount(objv
60e0: 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  [2]);.    zSql =
60f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
6100: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
6110: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  );.    while( rc
6120: 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c  ==TCL_OK && zSql
6130: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
6140: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
6150: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6160: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
6170: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
6180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6190: 75 6d 62 65 72 20 6f 66 20 62 69 6e 64 20 70 61  umber of bind pa
61a0: 72 61 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20  rameters in the 
61b0: 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69  pStmt */.      i
61c0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
61d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
61e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
61f0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
6200: 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62   */.      Tcl_Ob
6210: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
6220: 30 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  0;   /* Array of
6230: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
6240: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20  .      int len; 
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67    /* String leng
6270: 74 68 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20  th of zSql */.  
6280: 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  .      /* Try to
6290: 20 66 69 6e 64 20 61 20 53 51 4c 20 73 74 61 74   find a SQL stat
62a0: 65 6d 65 6e 74 20 74 68 61 74 20 68 61 73 20 61  ement that has a
62b0: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70  lready been comp
62c0: 69 6c 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a  iled and.      *
62d0: 2a 20 77 68 69 63 68 20 6d 61 74 63 68 65 73 20  * which matches 
62e0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 63  the next sequenc
62f0: 65 20 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20 20  e of SQL..      
6300: 2a 2f 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d  */.      pStmt =
6310: 20 30 3b 0a 20 20 20 20 20 20 70 50 72 65 53 74   0;.      pPreSt
6320: 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
6330: 73 74 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20  st;.      len = 
6340: 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20  strlen(zSql);.  
6350: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
6360: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 78 70 69   && sqlite3_expi
6370: 72 65 64 28 70 50 72 65 53 74 6d 74 2d 3e 70 53  red(pPreStmt->pS
6380: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tmt) ){.        
6390: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 70  flushStmtCache(p
63a0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  Db);.        pPr
63b0: 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  eStmt = 0;.     
63c0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 70   }.      for(; p
63d0: 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d  PreStmt; pPreStm
63e0: 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  t=pPreStmt->pNex
63f0: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
6400: 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  n = pPreStmt->nS
6410: 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ql;.        if( 
6420: 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20  len>=n .        
6430: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50      && memcmp(pP
6440: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53  reStmt->zSql, zS
6450: 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20  ql, n)==0.      
6460: 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e        && (zSql[n
6470: 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31  ]==0 || zSql[n-1
6480: 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20  ]==';').        
6490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 74  ){.          pSt
64a0: 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  mt = pPreStmt->p
64b0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
64c0: 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50  zLeft = &zSql[pP
64d0: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a  reStmt->nSql];..
64e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
64f0: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
6500: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
6510: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
6520: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
6530: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74   cache list.  It
6540: 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61   will later be a
6550: 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  dded back to the
6560: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
6570: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63       ** of the c
6580: 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64  ache list in ord
6590: 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
65a0: 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e  LRU replacement.
65b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
65c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
65d0: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
65e0: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53             pPreS
65f0: 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  tmt->pPrev->pNex
6600: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
6610: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
6620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6630: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
6640: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
6650: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
6660: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
6670: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a  eStmt->pNext ){.
6680: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65              pPre
6690: 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Stmt->pNext->pPr
66a0: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  ev = pPreStmt->p
66b0: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
66c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
66d0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
66e0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
66f0: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ev;.          }.
6700: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
6710: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
6720: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6730: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20   }.      }.  .  
6740: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65      /* If no pre
6750: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
6760: 77 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70  was found.  Comp
6770: 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78 74  ile the SQL text
6780: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6790: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
67a0: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
67b0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70  TE_OK!=sqlite3_p
67c0: 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20  repare(pDb->db, 
67d0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
67e0: 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20  , &zLeft) ){.   
67f0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
6800: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
6810: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
6820: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
6830: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  db)));.         
6840: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
6850: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6860: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6870: 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30      if( pStmt==0
6880: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
6890: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
68a0: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
68b0: 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20  ->db) ){.       
68c0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c       /* A compil
68d0: 65 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20  e-time error in 
68e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  the statement.  
68f0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
6900: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74           Tcl_Set
6910: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
6920: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
6930: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
6940: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20  ->db)));.       
6950: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
6960: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
6970: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6990: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
69a0: 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f  ement was a no-o
69b0: 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  p.  Continue to 
69c0: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
69d0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  nt.            *
69e0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72  * in the SQL str
69f0: 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ing..           
6a00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6a10: 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  zSql = zLeft;.  
6a20: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
6a30: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
6a40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6a50: 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74    assert( pPreSt
6a60: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  mt==0 );.      }
6a70: 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20  ..      /* Bind 
6a80: 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65  values to parame
6a90: 74 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20  ters that begin 
6aa0: 77 69 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20  with $ or :.    
6ab0: 20 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61    */  .      nVa
6ac0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
6ad0: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
6ae0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e  (pStmt);.      n
6af0: 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Parm = 0;.      
6b00: 69 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28  if( nVar>sizeof(
6b10: 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50  aParm)/sizeof(aP
6b20: 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  arm[0]) ){.     
6b30: 20 20 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c     apParm = (Tcl
6b40: 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63  _Obj**)Tcl_Alloc
6b50: 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50  (nVar*sizeof(apP
6b60: 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  arm[0]));.      
6b70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
6b80: 70 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20  pParm = aParm;. 
6b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
6ba0: 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69  (i=1; i<=nVar; i
6bb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
6bc0: 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20  st char *zVar = 
6bd0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
6be0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d  ameter_name(pStm
6bf0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
6c00: 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a  f( zVar!=0 && (z
6c10: 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a  Var[0]=='$' || z
6c20: 56 61 72 5b 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a  Var[0]==':') ){.
6c30: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
6c40: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
6c50: 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20  tVar2Ex(interp, 
6c60: 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b  &zVar[1], 0, 0);
6c70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6c80: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Var ){.         
6c90: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
6ca0: 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a        u8 *data;.
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
6cc0: 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e   *zType = pVar->
6cd0: 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e  typePtr ? pVar->
6ce0: 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20  typePtr->name : 
6cf0: 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "";.            
6d00: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
6d10: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
6d20: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
6d30: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
6d40: 72 72 61 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rray")==0 ){.   
6d50: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
6d60: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
6d70: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
6d80: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
6d90: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
6da0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
6db0: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
6dc0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
6dd0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
6de0: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
6e00: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
6e10: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
6e20: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62  }else if( (c=='b
6e30: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
6e40: 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29  e,"boolean")==0)
6e50: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
6e60: 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26        (c=='i' &&
6e70: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69   strcmp(zType,"i
6e80: 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nt")==0) ){.    
6e90: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
6ea0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
6eb0: 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  rp, pVar, &n);. 
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6ed0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
6ee0: 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20  tmt, i, n);.    
6ef0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6f00: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
6f10: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
6f20: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
6f30: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b         double r;
6f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
6f50: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
6f60: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
6f70: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20  , &r);.         
6f80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
6f90: 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  d_double(pStmt, 
6fa0: 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20  i, r);.         
6fb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6fc0: 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54          data = T
6fd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
6fe0: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7000: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
7010: 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e  Stmt, i, data, n
7020: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7030: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7040: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
7050: 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20  (pVar);.        
7060: 20 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61        apParm[nPa
7070: 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20  rm++] = pVar;.  
7080: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7090: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
70a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
70b0: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d  _bind_null( pStm
70c0: 74 2c 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20  t, i );.        
70d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
70e0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
70f0: 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e  Compute column n
7100: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43  ames */.      nC
7110: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
7120: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
7130: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72  ;.      if( pScr
7140: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ipt ){.        a
7150: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f  pColName = (Tcl_
7160: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
7170: 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a   sizeof(Tcl_Obj*
7180: 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  )*nCol );.      
7190: 20 20 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d    if( apColName=
71a0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
71b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
71c0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
71d0: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
71e0: 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  ] = dbTextToObj(
71f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
7200: 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
7210: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
7220: 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e  rRefCount(apColN
7230: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ame[i]);.       
7240: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
7250: 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20    /* If results 
7260: 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  are being stored
7270: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72   in an array var
7280: 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61  iable, then crea
7290: 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
72a0: 61 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66  array(*) entry f
72b0: 6f 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20  or that array.  
72c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
72d0: 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20   pArray ){.     
72e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c     Tcl_Obj *pCol
72f0: 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  List = Tcl_NewOb
7300: 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  j();.        Tcl
7310: 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63  _Obj *pStar = Tc
7320: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
7330: 2a 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  *", -1);.       
7340: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
7350: 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20  t(pColList);.   
7360: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7370: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7380: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
7390: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
73a0: 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c  nterp, pColList,
73b0: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a   apColName[i]);.
73c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
73d0: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
73e0: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
73f0: 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74   pStar, pColList
7400: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  ,0);.        Tcl
7410: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
7420: 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  olList);.       
7430: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
7440: 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20  t(pStar);.      
7450: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63  }..      /* Exec
7460: 75 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20  ute the SQL.    
7470: 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
7480: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20  ( rc==TCL_OK && 
7490: 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f  pStmt && SQLITE_
74a0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
74b0: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
74c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
74d0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
74e0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
74f0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20  al;.          . 
7500: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
7510: 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pVal to contain 
7520: 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20  the i'th column 
7530: 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a  of this row. */.
7540: 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
7550: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
7560: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20  _type(pStmt, i) 
7570: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
7580: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
7590: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
75a0: 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c   int bytes = sql
75b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
75c0: 73 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  s(pStmt, i);.   
75d0: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
75e0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
75f0: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ayObj(sqlite3_co
7600: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
7610: 20 69 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20   i), bytes);.   
7620: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
7630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7640: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
7650: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
7660: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7670: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20   sqlite_int64 v 
7680: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
7690: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29  _int64(pStmt, i)
76a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
76b0: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
76c0: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
76d0: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
76e0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
76f0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a  l_NewIntObj(v);.
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
7710: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7720: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
7730: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
7740: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7750: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
7760: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7770: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7780: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
7790: 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  AT: {.          
77a0: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
77b0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
77c0: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  uble(pStmt, i);.
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
77e0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
77f0: 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20  leObj(r);.      
7800: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
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 20 20 63 61 73 65 20 53 51           case SQ
7830: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
7840: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
7850: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44  = dbTextToObj(pD
7860: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
7870: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7880: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7890: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
78a0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t: {.           
78b0: 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74     pVal = dbText
78c0: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ToObj(sqlite3_co
78d0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
78e0: 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   i));.          
78f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7910: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
7920: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
7930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7940: 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20   pArray==0 ){.  
7950: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
7960: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
7970: 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  p, apColName[i],
7980: 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20   0, pVal, 0);.  
7990: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
79a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
79b0: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
79c0: 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70  terp, pArray, ap
79d0: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c  ColName[i], pVal
79e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
79f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
7a00: 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d  lse if( choice==
7a10: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a  DB_ONECOLUMN ){.
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7a30: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pRet==0 ){.     
7a40: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
7a50: 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pVal;.          
7a60: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
7a70: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
7a80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7a90: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42        rc = TCL_B
7aa0: 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  REAK;.          
7ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7ac0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
7ad0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
7ae0: 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c 29 3b  rp, pRet, pVal);
7af0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7b00: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
7b10: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
7b20: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
7b30: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
7b40: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
7b50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
7b60: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
7b70: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
7b80: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
7b90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7ba0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7bb0: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
7bc0: 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  EAK ){.        r
7bd0: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
7be0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72    }..      /* Fr
7bf0: 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ee the column na
7c00: 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  me objects */.  
7c10: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
7c20: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
7c30: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
7c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
7c50: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43  DecrRefCount(apC
7c60: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
7c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63      }.        Tc
7c80: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70  l_Free((char*)ap
7c90: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
7ca0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  }..      /* Free
7cb0: 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e   the bound strin
7cc0: 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d  g and blob param
7cd0: 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 66  eters */.      f
7ce0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b  or(i=0; i<nParm;
7cf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54   i++){.        T
7d00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
7d10: 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20  apParm[i]);.    
7d20: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70    }.      if( ap
7d30: 50 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20  Parm!=aParm ){. 
7d40: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
7d50: 28 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a  (char*)apParm);.
7d60: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
7d70: 2a 20 52 65 73 65 74 20 74 68 65 20 73 74 61 74  * Reset the stat
7d80: 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72  ement.  If the r
7d90: 65 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53 51  esult code is SQ
7da0: 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68 65  LITE_SCHEMA, the
7db0: 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68  n.      ** flush
7dc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
7dd0: 61 63 68 65 20 61 6e 64 20 74 72 79 20 74 68 65  ache and try the
7de0: 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e   statement again
7df0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
7e00: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
7e10: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
7e20: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 53 43     if( SQLITE_SC
7e30: 48 45 4d 41 3d 3d 72 63 32 20 29 7b 0a 20 20 20  HEMA==rc2 ){.   
7e40: 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 61 20       /* After a 
7e50: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 66  schema change, f
7e60: 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 20 61  lush the cache a
7e70: 6e 64 20 74 72 79 20 74 6f 20 72 75 6e 20 74 68  nd try to run th
7e80: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61  e.        ** sta
7e90: 74 65 6d 65 6e 74 20 61 67 61 69 6e 0a 20 20 20  tement again.   
7ea0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7eb0: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
7ec0: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 73  pDb );.        s
7ed0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
7ee0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
7ef0: 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54  if( pPreStmt ) T
7f00: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
7f10: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
7f20: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7f30: 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49    }else if( SQLI
7f40: 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20  TE_OK!=rc2 ){.  
7f50: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75        /* If a ru
7f60: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63  n-time error occ
7f70: 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20  urs, report the 
7f80: 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72  error and stop r
7f90: 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  eading.        *
7fa0: 2a 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20  * the SQL.      
7fb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c    */.        Tcl
7fc0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
7fd0: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
7fe0: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
7ff0: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
8000: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
8010: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
8020: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
8030: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
8040: 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c  ( pPreStmt ) Tcl
8050: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72  _Free((char*)pPr
8060: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  eStmt);.        
8070: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
8080: 73 65 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53  se if( pDb->maxS
8090: 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt<=0 ){.      
80a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
80b0: 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c  e is turned off,
80c0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65   deallocated the
80d0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
80e0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
80f0: 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63  mt ) Tcl_Free((c
8100: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  har*)pPreStmt);.
8110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8120: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
8130: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8140: 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68        /* Everyth
8150: 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74  ing worked and t
8160: 68 65 20 63 61 63 68 65 20 69 73 20 6f 70 65 72  he cache is oper
8170: 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20  ational..       
8180: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
8190: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
81a0: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 77 65   structure if we
81b0: 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20   need one..     
81c0: 20 20 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72     ** (If we alr
81d0: 65 61 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65  eady have one we
81e0: 20 63 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20   can just reuse 
81f0: 69 74 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a  it.).        */.
8200: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
8210: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
8220: 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74       len = zLeft
8230: 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20   - zSql;.       
8240: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
8250: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
8260: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
8270: 66 28 2a 70 50 72 65 53 74 6d 74 29 20 2b 20 6c  f(*pPreStmt) + l
8280: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  en );.          
8290: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
82a0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
82b0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OR;.          pP
82c0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20  reStmt->pStmt = 
82d0: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20  pStmt;.         
82e0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20   pPreStmt->nSql 
82f0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  = len;.         
8300: 20 6d 65 6d 63 70 79 28 70 50 72 65 53 74 6d 74   memcpy(pPreStmt
8310: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65  ->zSql, zSql, le
8320: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  n);.          pP
8330: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65 6e  reStmt->zSql[len
8340: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 0;.        }
8350: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ..        /* Add
8360: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
8370: 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62  atement to the b
8380: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
8390: 63 61 63 68 65 20 6c 69 73 74 0a 20 20 20 20 20  cache list.     
83a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50     */.        pP
83b0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20  reStmt->pNext = 
83c0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
83d0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
83e0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
83f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
8400: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tList ){.       
8410: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d    pDb->stmtList-
8420: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
8430: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
8440: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
8450: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
8460: 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e         if( pDb->
8470: 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  stmtLast==0 ){. 
8480: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8490: 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29   pDb->nStmt==0 )
84a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
84b0: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
84c0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Stmt;.        }e
84d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
84e0: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
84f0: 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  t>0 );.        }
8500: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53  .        pDb->nS
8510: 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20  tmt++;.   .     
8520: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
8530: 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d   too many statem
8540: 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65  ent in cache, re
8550: 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73  move the surplus
8560: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
8570: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
8580: 63 61 63 68 65 20 6c 69 73 74 2e 0a 20 20 20 20  cache list..    
8590: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77      */.        w
85a0: 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74  hile( pDb->nStmt
85b0: 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b  >pDb->maxStmt ){
85c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
85d0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d  e3_finalize(pDb-
85e0: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74  >stmtLast->pStmt
85f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
8600: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62  ->stmtLast = pDb
8610: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65  ->stmtLast->pPre
8620: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
8630: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62  _Free((char*)pDb
8640: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78  ->stmtLast->pNex
8650: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  t);.          pD
8660: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65  b->stmtLast->pNe
8670: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
8680: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
8690: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
86a0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63  }..      /* Proc
86b0: 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  eed to the next 
86c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
86d0: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
86e0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
86f0: 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ecrRefCount(objv
8700: 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  [2]);..    if( p
8710: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Ret ){.      if(
8720: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
8730: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
8740: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
8750: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pRet);.      }. 
8760: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
8770: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
8780: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8790: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
87a0: 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41   $db function NA
87b0: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
87c0: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
87d0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61   SQL function ca
87e0: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
87f0: 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69  ever that functi
8800: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65  on is.  ** calle
8810: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
8820: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
8830: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
8840: 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49    case DB_FUNCTI
8850: 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e  ON: {.    SqlFun
8860: 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 63 68  c *pFunc;.    ch
8870: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  ar *zName;.    c
8880: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20  har *zScript;.  
8890: 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20    int nScript;. 
88a0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
88b0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
88c0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
88d0: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
88e0: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
88f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
8910: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
8920: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
8930: 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70  , 0);.    zScrip
8940: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
8950: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
8960: 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20  , &nScript);.   
8970: 20 70 46 75 6e 63 20 3d 20 28 53 71 6c 46 75 6e   pFunc = (SqlFun
8980: 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  c*)Tcl_Alloc( si
8990: 7a 65 6f 66 28 2a 70 46 75 6e 63 29 20 2b 20 6e  zeof(*pFunc) + n
89a0: 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20  Script + 1 );.  
89b0: 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29    if( pFunc==0 )
89c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
89d0: 52 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 69 6e  R;.    pFunc->in
89e0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
89f0: 20 20 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 20     pFunc->pNext 
8a00: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
8a10: 20 20 70 46 75 6e 63 2d 3e 7a 53 63 72 69 70 74    pFunc->zScript
8a20: 20 3d 20 28 63 68 61 72 2a 29 26 70 46 75 6e 63   = (char*)&pFunc
8a30: 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46  [1];.    pDb->pF
8a40: 75 6e 63 20 3d 20 70 46 75 6e 63 3b 0a 20 20 20  unc = pFunc;.   
8a50: 20 73 74 72 63 70 79 28 70 46 75 6e 63 2d 3e 7a   strcpy(pFunc->z
8a60: 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 29  Script, zScript)
8a70: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
8a80: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8a90: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
8aa0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
8ab0: 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e  F8,.        pFun
8ac0: 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30  c, tclSqlFunc, 0
8ad0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
8ae0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8af0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
8b00: 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ROR;.      Tcl_S
8b10: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
8b20: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
8b30: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
8b40: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
8b50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8b60: 20 20 2f 2a 20 4d 75 73 74 20 66 6c 75 73 68 20    /* Must flush 
8b70: 61 6e 79 20 63 61 63 68 65 64 20 73 74 61 74 65  any cached state
8b80: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 66  ments */.      f
8b90: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
8ba0: 44 62 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Db );.    }.    
8bb0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
8bc0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61  .  **     $db la
8bd0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20  st_insert_rowid 
8be0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
8bf0: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
8c00: 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  ch is the ROWID 
8c10: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
8c20: 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f  ent insert..  */
8c30: 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f  .  case DB_LAST_
8c40: 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a  INSERT_ROWID: {.
8c50: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
8c60: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72 6f  sult;.    int ro
8c70: 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  wid;.    if( obj
8c80: 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
8c90: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8ca0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
8cb0: 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
8cc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8cd0: 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73   }.    rowid = s
8ce0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
8cf0: 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62  rt_rowid(pDb->db
8d00: 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
8d10: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
8d20: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
8d30: 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
8d40: 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20  sult, rowid);.  
8d50: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
8d60: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f  /*.  ** The DB_O
8d70: 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20  NECOLUMN method 
8d80: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74  is implemented t
8d90: 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f  ogether with DB_
8da0: 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  EVAL..  */..  /*
8db0: 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73 73      $db progress
8dc0: 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20   ?N CALLBACK?.  
8dd0: 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  ** .  ** Invoke 
8de0: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
8df0: 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74 75  ck every N virtu
8e00: 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64  al machine opcod
8e10: 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74 69  es while executi
8e20: 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ng.  ** queries.
8e30: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
8e40: 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20  PROGRESS: {.    
8e50: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
8e60: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
8e70: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
8e80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8e90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
8ea0: 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a  >zProgress, 0);.
8eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8ec0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
8ed0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
8ee0: 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e  ogress;.      in
8ef0: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74  t len;.      int
8f00: 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43   N;.      if( TC
8f10: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
8f20: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
8f30: 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a  objv[2], &N) ){.
8f40: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8f50: 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  R;.      };.    
8f60: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
8f70: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
8f80: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
8f90: 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20  rogress);.      
8fa0: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73  }.      zProgres
8fb0: 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
8fc0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
8fd0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
8fe0: 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20  f( zProgress && 
8ff0: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
9000: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
9010: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
9020: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
9030: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  strcpy(pDb->zPro
9040: 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73  gress, zProgress
9050: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9060: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
9070: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
9080: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9090: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
90a0: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20  _CALLBACK.      
90b0: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
90c0: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ss ){.        pD
90d0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
90e0: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
90f0: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
9100: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c  dler(pDb->db, N,
9110: 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
9120: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
9130: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9140: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
9150: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
9160: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
9170: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
9180: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
9190: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
91a0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20  rp, 2, objv, "N 
91b0: 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
91c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
91d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
91e0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
91f0: 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65   **     $db reke
9200: 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y KEY.  **.  ** 
9210: 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79  Change the encry
9220: 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65  ption key on the
9230: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
9240: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
9250: 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20   case DB_REKEY: 
9260: 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  {.    int nKey;.
9270: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
9280: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
9290: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
92a0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
92b0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22  , 2, objv, "KEY"
92c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
92d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
92e0: 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f  .    pKey = Tcl_
92f0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
9300: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b  Obj(objv[2], &nK
9310: 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ey);.#ifdef SQLI
9320: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
9330: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
9340: 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65  key(pDb->db, pKe
9350: 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66  y, nKey);.    if
9360: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
9370: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9380: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
9390: 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20  rStr(rc), 0);.  
93a0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
93b0: 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OR;.    }.#endif
93c0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
93d0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
93e0: 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45  db timeout MILLE
93f0: 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a  SECONDS.  **.  *
9400: 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20  * Delay for the 
9410: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
9420: 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64  econds specified
9430: 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20   when a file is 
9440: 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  locked..  */.  c
9450: 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20  ase DB_TIMEOUT: 
9460: 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20  {.    int ms;.  
9470: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
9480: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
9490: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
94a0: 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53  2, objv, "MILLIS
94b0: 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20  ECONDS");.      
94c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
94d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
94e0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
94f0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
9500: 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
9510: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9520: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
9530: 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73  eout(pDb->db, ms
9540: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
9550: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
9560: 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f   $db nullvalue ?
9570: 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a  STRING?.  **.  *
9580: 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20 75 73  * Change text us
9590: 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  ed when a NULL c
95a0: 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74  omes back from t
95b0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
95c0: 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73  ?STRING?.  ** is
95d0: 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
95e0: 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  en the current s
95f0: 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e  tring used for N
9600: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
9610: 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20  .  ** If STRING 
9620: 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
9630: 20 53 54 52 49 4e 47 20 69 73 20 72 65 74 75 72   STRING is retur
9640: 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20  ned..  **.  */. 
9650: 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c   case DB_NULLVAL
9660: 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  UE: {.    if( ob
9670: 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
9680: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
9690: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
96a0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c  p, 2, objv, "NUL
96b0: 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20  LVALUE");.      
96c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
96d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
96e0: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
96f0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
9700: 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63  char *zNull = Tc
9710: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9720: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
9730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
9740: 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  ->zNull ){.     
9750: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
9760: 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  >zNull);.      }
9770: 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c  .      if( zNull
9780: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
9790: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20       pDb->zNull 
97a0: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
97b0: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
97c0: 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75  strncpy(pDb->zNu
97d0: 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b  ll, zNull, len);
97e0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
97f0: 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ull[len] = '\0';
9800: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9810: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
9820: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
9830: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
9840: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
9850: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62   dbTextToObj(pDb
9860: 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62  ->zNull));.    b
9870: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  reak;.  }.  .  /
9880: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74  *.  **     $db t
9890: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a  otal_changes.  *
98a0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
98b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
98c0: 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66   that were modif
98d0: 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f  ied, inserted, o
98e0: 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20  r deleted .  ** 
98f0: 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61  since the databa
9900: 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72  se handle was cr
9910: 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  eated..  */.  ca
9920: 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e  se DB_TOTAL_CHAN
9930: 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
9940: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
9950: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
9960: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9970: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9980: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
9990: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
99a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
99b0: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
99c0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
99d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
99e0: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
99f0: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
9a00: 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
9a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
9a20: 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65   /*    $db trace
9a30: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
9a40: 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
9a50: 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
9a60: 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
9a70: 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20  outine for each 
9a80: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
9a90: 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75  ** that is execu
9aa0: 74 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f  ted.  The text o
9ab0: 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70  f the SQL is app
9ac0: 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
9ad0: 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74  K before.  ** it
9ae0: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
9af0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41  */.  case DB_TRA
9b00: 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  CE: {.    if( ob
9b10: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
9b20: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
9b30: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
9b40: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
9b50: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9b60: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
9b70: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
9b80: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
9b90: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
9ba0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9bb0: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
9bc0: 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20  Trace, 0);.     
9bd0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
9be0: 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65      char *zTrace
9bf0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
9c00: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
9c10: 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  zTrace ){.      
9c20: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
9c30: 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d  zTrace);.      }
9c40: 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20  .      zTrace = 
9c50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
9c60: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
9c70: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
9c80: 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29  Trace && len>0 )
9c90: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
9ca0: 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f  Trace = Tcl_Allo
9cb0: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
9cc0: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
9cd0: 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65  ->zTrace, zTrace
9ce0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9cf0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72          pDb->zTr
9d00: 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ace = 0;.      }
9d10: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
9d20: 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  zTrace ){.      
9d30: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
9d40: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
9d50: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
9d60: 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61  b->db, DbTraceHa
9d70: 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
9d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9d90: 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
9da0: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
9db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9dc0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
9dd0: 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20 63  /*    $db copy c
9de0: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
9df0: 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65  m table filename
9e00: 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55   ?SEPARATOR? ?NU
9e10: 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a  LLINDICATOR?.  *
9e20: 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61  *.  ** Copy data
9e30: 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d   into table from
9e40: 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f   filename, optio
9e50: 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41  nally using SEPA
9e60: 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f  RATOR.  ** as co
9e70: 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e  lumn separators.
9e80: 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f    If a column co
9e90: 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74  ntains a null st
9ea0: 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a  ring, or the.  *
9eb0: 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49  * value of NULLI
9ec0: 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c  NDICATOR, a NULL
9ed0: 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72   is inserted for
9ee0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a   the column..  *
9ef0: 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  * conflict-algor
9f00: 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74  ithm is one of t
9f10: 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69  he sqlite confli
9f20: 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20  ct algorithms:. 
9f30: 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c   **    rollback,
9f40: 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67   abort, fail, ig
9f50: 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20  nore, replace.  
9f60: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
9f70: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
9f80: 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
9f90: 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61  sed, not necessa
9fa0: 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61  rily same.  ** a
9fb0: 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20 64  s 'db changes' d
9fc0: 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61  ue to conflict-a
9fd0: 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65  lgorithm selecte
9fe0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
9ff0: 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63 61  s code is basica
a000: 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  lly an implement
a010: 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e  ation/enhancemen
a020: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
a030: 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e  lite3 shell.c ".
a040: 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e  import" command.
a050: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
a060: 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73  command usage is
a070: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
a080: 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50  he sqlite2.x COP
a090: 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a  Y statement,.  *
a0a0: 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20  * which imports 
a0b0: 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61  file data into a
a0c0: 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65   table using the
a0d0: 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59   PostgreSQL COPY
a0e0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20   file format:.  
a0f0: 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24 63  **   $db copy $c
a100: 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62  onflit_algo $tab
a110: 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d  le_name $filenam
a120: 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20  e \t \\N.  */.  
a130: 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a  case DB_COPY: {.
a140: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65      char *zTable
a150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a160: 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
a170: 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a  nto this table *
a180: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c  /.    char *zFil
a190: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a1a0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
a1b0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72  om which to extr
a1c0: 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  act data */.    
a1d0: 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b  char *zConflict;
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a1f0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  he conflict algo
a200: 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  rithm to use */.
a210: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
a220: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
a230: 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a  /* A statement *
a240: 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  /.    int rc;   
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a260: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
a270: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
a280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a290: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a2a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
a2b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
a2c0: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
a2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a2e0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
a2f0: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
a300: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
a330: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
a340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a350: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a360: 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d   bytes in zSep[]
a370: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c   */.    int nNul
a380: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a390: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a3a0: 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b   bytes in zNull[
a3b0: 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
a3c0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
a3d0: 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
a3e0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
a3f0: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20  char *zLine;    
a400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a410: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
a420: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66  input from the f
a430: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
a440: 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20  **azCol;        
a450: 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b         /* zLine[
a460: 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f  ] broken up into
a470: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
a480: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
a4a0: 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61  ow to commit cha
a4b0: 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45  nges */.    FILE
a4c0: 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
a4d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
a4e0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
a4f0: 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b   int lineno = 0;
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a510: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69  Line number of i
a520: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
a530: 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38   char zLineNum[8
a540: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
a550: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e  Line number prin
a560: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
a570: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
a580: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
a590: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a  nterp result */.
a5a0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b  .    char *zSep;
a5b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  .    char *zNull
a5c0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
a5d0: 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
a5e0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
a5f0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
a600: 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
a610: 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
a620: 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
a630: 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
a640: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
a650: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a660: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a670: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
a680: 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
a690: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a6a0: 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
a6b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a6c0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
a6d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
a6e0: 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
a6f0: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
a700: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
a710: 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
a720: 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
a730: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
a740: 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
a750: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a760: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
a770: 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
a780: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a790: 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
a7a0: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
a7b0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
a7c0: 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
a7d0: 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65  Sep = strlen(zSe
a7e0: 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20  p);.    nNull = 
a7f0: 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20  strlen(zNull);. 
a800: 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29     if( nSep==0 )
a810: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
a820: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a830: 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c   "Error: non-nul
a840: 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  l separator requ
a850: 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 20  ired for copy", 
a860: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
a870: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a880: 7d 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65 33  }.    if(sqlite3
a890: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
a8a0: 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21  t, "rollback") !
a8b0: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
a8c0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
a8d0: 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20  nflict, "abort" 
a8e0: 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
a8f0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d     sqlite3StrICm
a900: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61  p(zConflict, "fa
a910: 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26  il"    ) != 0 &&
a920: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  .       sqlite3S
a930: 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  trICmp(zConflict
a940: 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d  , "ignore"  ) !=
a950: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c   0 &&.       sql
a960: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e  ite3StrICmp(zCon
a970: 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22  flict, "replace"
a980: 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20   ) != 0 ) {.    
a990: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a9a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
a9b0: 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63  r: \"", zConflic
a9c0: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
a9d0: 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  "\", conflict-al
a9e0: 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20  gorithm must be 
a9f0: 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b  one of: rollback
aa00: 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
aa10: 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67  "abort, fail, ig
aa20: 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65  nore, or replace
aa30: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
aa40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aa50: 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
aa60: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
aa70: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
aa80: 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
aa90: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
aaa0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
aab0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
aac0: 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
aad0: 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
aae0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  e, 0);.      ret
aaf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ab00: 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
ab10: 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20   strlen(zSql);. 
ab20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ab30: 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
ab40: 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74   zSql, 0, &pStmt
ab50: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
ab60: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
ab70: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ab80: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ab90: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
aba0: 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
abb0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
abc0: 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  );.      nCol = 
abd0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
abe0: 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
abf0: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
ac00: 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
ac10: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
ac20: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
ac30: 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20  f( nCol==0 ) {. 
ac40: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ac50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ac60: 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20   zSql = malloc( 
ac70: 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f  nByte + 50 + nCo
ac80: 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  l*2 );.    if( z
ac90: 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Sql==0 ) {.     
aca0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
acb0: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
acc0: 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
acd0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
ace0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
acf0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ad00: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b  _snprintf(nByte+
ad10: 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52  50, zSql, "INSER
ad20: 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71  T OR %q INTO '%q
ad30: 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20  ' VALUES(?",.   
ad40: 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c        zConflict,
ad50: 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20   zTable);.    j 
ad60: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
ad70: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
ad80: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ad90: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
ada0: 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
adb0: 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
adc0: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
add0: 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
ade0: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
adf0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
ae00: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  b->db, zSql, 0, 
ae10: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
ae20: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
ae30: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ae40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ae50: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
ae60: 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
ae70: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
ae80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
ae90: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
aea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
aeb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
aec0: 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69    in = fopen(zFi
aed0: 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69  le, "rb");.    i
aee0: 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
aef0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
af00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
af10: 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66  r: cannot open f
af20: 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e  ile: ", zFile, N
af30: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
af40: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
af50: 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
af60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
af70: 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d   }.    azCol = m
af80: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a  alloc( sizeof(az
af90: 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29  Col[0])*(nCol+1)
afa0: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f   );.    if( azCo
afb0: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54  l==0 ) {.      T
afc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
afd0: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
afe0: 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c  can't malloc()",
aff0: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
b000: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b010: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
b020: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45  xec(pDb->db, "BE
b030: 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
b040: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43      zCommit = "C
b050: 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c  OMMIT";.    whil
b060: 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61  e( (zLine = loca
b070: 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
b080: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
b090: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d  ar *z;.      i =
b0a0: 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f   0;.      lineno
b0b0: 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b  ++;.      azCol[
b0c0: 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20  0] = zLine;.    
b0d0: 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69    for(i=0, z=zLi
b0e0: 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  ne; *z; z++){.  
b0f0: 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53        if( *z==zS
b100: 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70  ep[0] && strncmp
b110: 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d  (z, zSep, nSep)=
b120: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
b130: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
b140: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
b150: 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20   if( i<nCol ){. 
b160: 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c             azCol
b170: 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a  [i] = &z[nSep];.
b180: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d              z +=
b190: 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20   nSep-1;.       
b1a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
b1b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b1c0: 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20   i+1!=nCol ){.  
b1d0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
b1e0: 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  ;.        zErr =
b1f0: 20 6d 61 6c 6c 6f 63 28 32 30 30 20 2b 20 73 74   malloc(200 + st
b200: 72 6c 65 6e 28 7a 46 69 6c 65 29 29 3b 0a 20 20  rlen(zFile));.  
b210: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45        sprintf(zE
b220: 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 20 6c 69  rr,"Error: %s li
b230: 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20  ne %d: expected 
b240: 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  %d columns of da
b250: 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22  ta but found %d"
b260: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
b270: 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c  le, lineno, nCol
b280: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
b290: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b2a0: 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30  (interp, zErr, 0
b2b0: 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  );.        free(
b2c0: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7a  zErr);.        z
b2d0: 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41  Commit = "ROLLBA
b2e0: 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  CK";.        bre
b2f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
b310: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
b320: 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75   /* check for nu
b330: 6c 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20  ll data, if so, 
b340: 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a  bind as null */.
b350: 20 20 20 20 20 20 20 20 69 66 20 28 28 6e 4e 75          if ((nNu
b360: 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61  ll>0 && strcmp(a
b370: 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d  zCol[i], zNull)=
b380: 3d 30 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a  =0) || strlen(az
b390: 43 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20  Col[i])==0) {.  
b3a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b3b0: 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
b3c0: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d   i+1);.        }
b3d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b3e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
b3f0: 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a  t(pStmt, i+1, az
b400: 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49  Col[i], -1, SQLI
b410: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
b420: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b430: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
b440: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
b450: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
b460: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
b470: 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
b480: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b490: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b4a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b4b0: 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20  (interp,"Error: 
b4c0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
b4d0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
b4e0: 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
b4f0: 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
b500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b510: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
b520: 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ree(azCol);.    
b530: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
b540: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
b550: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
b560: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
b570: 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  b, zCommit, 0, 0
b580: 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a  , 0);..    if( z
b590: 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27  Commit[0] == 'C'
b5a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63   ){.      /* suc
b5b0: 63 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74  cess, set result
b5c0: 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69   as number of li
b5d0: 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  nes processed */
b5e0: 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d  .      pResult =
b5f0: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
b600: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
b610: 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70   Tcl_SetIntObj(p
b620: 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b  Result, lineno);
b630: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
b640: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
b650: 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c       /* failure,
b660: 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77   append lineno w
b670: 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  here failed */. 
b680: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69       sprintf(zLi
b690: 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e  neNum,"%d",linen
b6a0: 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  o);.      Tcl_Ap
b6b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b6c0: 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c  p,", failed whil
b6d0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e  e processing lin
b6e0: 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29  e: ",zLineNum,0)
b6f0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
b700: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
b710: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
b720: 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73 69 6f  /*    $db versio
b730: 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  n.  **.  ** Retu
b740: 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73  rn the version s
b750: 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64  tring for this d
b760: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
b770: 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a  case DB_VERSION:
b780: 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65   {.    Tcl_SetRe
b790: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
b7a0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62  ar *)sqlite3_lib
b7b0: 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53  version(), TCL_S
b7c0: 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61  TATIC);.    brea
b7d0: 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20  k;.  }...  } /* 
b7e0: 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43  End of the SWITC
b7f0: 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  H statement */. 
b800: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b810: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44  *.**   sqlite3 D
b820: 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f  BNAME FILENAME ?
b830: 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f  MODE? ?-key KEY?
b840: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
b850: 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d  he main Tcl comm
b860: 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22  and.  When the "
b870: 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d  sqlite" Tcl comm
b880: 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  and is.** invoke
b890: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
b8a0: 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20  runs to process 
b8b0: 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  that command..**
b8c0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
b8d0: 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20  gument, DBNAME, 
b8e0: 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20  is an arbitrary 
b8f0: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a  name for a new.*
b900: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
b910: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d  ction.  This com
b920: 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e  mand creates a n
b930: 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  ew command named
b940: 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20  .** DBNAME that 
b950: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  is used to contr
b960: 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69  ol that connecti
b970: 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  on.  The databas
b980: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
b990: 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  is deleted when 
b9a0: 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61  the DBNAME comma
b9b0: 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  nd is deleted..*
b9c0: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
b9d0: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
b9e0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
b9f0: 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
ba00: 69 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ins.** the sqlit
ba10: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
ba20: 69 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  is to be accesse
ba30: 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73  d..**.** For tes
ba40: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77  ting purposes, w
ba50: 65 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74  e also support t
ba60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
ba70: 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 65 6e  .**  sqlite3 -en
ba80: 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20  coding.**.**    
ba90: 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e     Return the en
baa0: 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c  coding used by L
bab0: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65  IKE and GLOB ope
bac0: 72 61 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73  rators.  Choices
bad0: 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 55 54  .**       are UT
bae0: 46 2d 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e  F-8 and iso8859.
baf0: 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20  .**.**  sqlite3 
bb00: 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  -version.**.**  
bb10: 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20       Return the 
bb20: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f  version number o
bb30: 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  f the SQLite lib
bb40: 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c  rary..**.**  sql
bb50: 69 74 65 33 20 2d 74 63 6c 2d 75 73 65 73 2d 75  ite3 -tcl-uses-u
bb60: 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52  tf.**.**       R
bb70: 65 74 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d  eturn "1" if com
bb80: 70 69 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c  piled with a Tcl
bb90: 20 75 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65   uses UTF-8.  Re
bba0: 74 75 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20  turn "0" if.**  
bbb0: 20 20 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20       not.  Used 
bbc0: 62 79 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65  by tests to make
bbd0: 20 73 75 72 65 20 74 68 65 20 6c 69 62 72 61 72   sure the librar
bbe0: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a  y was compiled .
bbf0: 2a 2a 20 20 20 20 20 20 20 63 6f 72 72 65 63 74  **       correct
bc00: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
bc10: 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63  t DbMain(void *c
bc20: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
bc30: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
bc40: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
bc50: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
bc60: 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65   *p;.  void *pKe
bc70: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65  y = 0;.  int nKe
bc80: 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  y = 0;.  const c
bc90: 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61  har *zArg;.  cha
bca0: 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f  r *zErrMsg;.  co
bcb0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
bcc0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 38 30 5d  .  char zBuf[80]
bcd0: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ;.  if( objc==2 
bce0: 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63  ){.    zArg = Tc
bcf0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
bd00: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
bd10: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
bd20: 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d  Arg,"-version")=
bd30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
bd40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bd50: 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73  erp,sqlite3_vers
bd60: 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65  ion,0);.      re
bd70: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
bd80: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
bd90: 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64  p(zArg,"-has-cod
bda0: 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  ec")==0 ){.#ifde
bdb0: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
bdc0: 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  EC.      Tcl_App
bdd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
bde0: 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20  ,"1",0);.#else. 
bdf0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
be00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22  esult(interp,"0"
be10: 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ,0);.#endif.    
be20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
be30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
be40: 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c  trcmp(zArg,"-tcl
be50: 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d 30 20 29  -uses-utf")==0 )
be60: 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f 55 54 46  {.#ifdef TCL_UTF
be70: 5f 4d 41 58 0a 20 20 20 20 20 20 54 63 6c 5f 41  _MAX.      Tcl_A
be80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
be90: 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65  rp,"1",0);.#else
bea0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
beb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
bec0: 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0",0);.#endif.  
bed0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
bee0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
bef0: 66 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62  f( objc==5 || ob
bf00: 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72  jc==6 ){.    zAr
bf10: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
bf20: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62  gFromObj(objv[ob
bf30: 6a 63 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69  jc-2], 0);.    i
bf40: 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
bf50: 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -key")==0 ){.   
bf60: 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65     pKey = Tcl_Ge
bf70: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
bf80: 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20  j(objv[objc-1], 
bf90: 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f 62  &nKey);.      ob
bfa0: 6a 63 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  jc -= 2;.    }. 
bfb0: 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33   }.  if( objc!=3
bfc0: 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
bfd0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
bfe0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
bff0: 62 6a 76 2c 20 0a 23 69 66 64 65 66 20 53 51 4c  bjv, .#ifdef SQL
c000: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
c010: 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45      "HANDLE FILE
c020: 4e 41 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43  NAME ?-key CODEC
c030: 2d 4b 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20  -KEY?".#else.   
c040: 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e     "HANDLE FILEN
c050: 41 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64  AME ?MODE?".#end
c060: 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  if.    );.    re
c070: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c080: 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20    }.  zErrMsg = 
c090: 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65  0;.  p = (Sqlite
c0a0: 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  Db*)Tcl_Alloc( s
c0b0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
c0c0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54  f( p==0 ){.    T
c0d0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
c0e0: 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69  erp, "malloc fai
c0f0: 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  led", TCL_STATIC
c100: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c110: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d  L_ERROR;.  }.  m
c120: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
c130: 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65  of(*p));.  zFile
c140: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
c150: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
c160: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f   0);.  sqlite3_o
c170: 70 65 6e 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64  pen(zFile, &p->d
c180: 62 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  b);.  if( SQLITE
c190: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72  _OK!=sqlite3_err
c1a0: 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20  code(p->db) ){. 
c1b0: 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 74 72     zErrMsg = str
c1c0: 64 75 70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  dup(sqlite3_errm
c1d0: 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
c1e0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
c1f0: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  >db);.    p->db 
c200: 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  = 0;.  }.#ifdef 
c210: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
c220: 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70  .  sqlite3_key(p
c230: 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  ->db, pKey, nKey
c240: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
c250: 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
c260: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
c270: 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54  terp, zErrMsg, T
c280: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
c290: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
c2a0: 2a 29 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  *)p);.    free(z
c2b0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
c2c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c2d0: 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20   }.  p->maxStmt 
c2e0: 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53  = NUM_PREPARED_S
c2f0: 54 4d 54 53 3b 0a 20 20 7a 41 72 67 20 3d 20 54  TMTS;.  zArg = T
c300: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
c310: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
c320: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
c330: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
c340: 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20  zArg, DbObjCmd, 
c350: 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65  (char*)p, DbDele
c360: 74 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 54 68  teCmd);..  /* Th
c370: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
c380: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
c390: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
c3a0: 65 72 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e 74  er.  */.  sprint
c3b0: 66 28 7a 42 75 66 2c 20 22 25 70 22 2c 20 70 2d  f(zBuf, "%p", p-
c3c0: 3e 64 62 29 3b 0a 20 20 69 66 28 20 73 74 72 6e  >db);.  if( strn
c3d0: 63 6d 70 28 7a 42 75 66 2c 22 30 78 22 2c 32 29  cmp(zBuf,"0x",2)
c3e0: 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
c3f0: 7a 42 75 66 2c 20 22 30 78 25 70 22 2c 20 70 2d  zBuf, "0x%p", p-
c400: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  >db);.  }.  Tcl_
c410: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
c420: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 0a  erp, zBuf, 0);..
c430: 20 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64    /* If compiled
c440: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
c450: 54 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65  T turned on, the
c460: 6e 20 72 65 67 69 73 74 65 72 20 74 68 65 20 22  n register the "
c470: 6d 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c  md5sum".  ** SQL
c480: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
c490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
c4a0: 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
c4b0: 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73  n void Md5_Regis
c4c0: 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23  ter(sqlite3*);.#
c4d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
c4e0: 44 45 42 55 47 0a 20 20 20 20 69 6e 74 20 6d 61  DEBUG.    int ma
c4f0: 6c 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c 69 74  llocfail = sqlit
c500: 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 0a  e3_iMallocFail;.
c510: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
c520: 6c 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e  locFail = 0;.#en
c530: 64 69 66 0a 20 20 20 20 4d 64 35 5f 52 65 67 69  dif.    Md5_Regi
c540: 73 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23 69 66  ster(p->db);.#if
c550: 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  def SQLITE_MEMDE
c560: 42 55 47 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  BUG.    sqlite3_
c570: 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6d 61  iMallocFail = ma
c580: 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64 69 66  llocfail;.#endif
c590: 0a 20 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a 20  .   }.#endif  . 
c5a0: 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74   p->interp = int
c5b0: 65 72 70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  erp;.  return TC
c5c0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  L_OK;.}../*.** P
c5d0: 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54  rovide a dummy T
c5e0: 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20  cl_InitStubs if 
c5f0: 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  we are using thi
c600: 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a  s as a static.**
c610: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
c620: 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  ndef USE_TCL_STU
c630: 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f  BS.# undef  Tcl_
c640: 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69  InitStubs.# defi
c650: 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  ne Tcl_InitStubs
c660: 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
c670: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
c680: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a   this module..**
c690: 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64  .** This Tcl mod
c6a0: 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  ule contains onl
c6b0: 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54  y a single new T
c6c0: 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  cl command named
c6d0: 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48   "sqlite"..** (H
c6e0: 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ence there is no
c6f0: 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65   namespace.  The
c700: 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
c710: 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70  n using a namesp
c720: 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ace.** if the ex
c730: 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70  tension only sup
c740: 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61  plies one new na
c750: 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69 74  me!)  The "sqlit
c760: 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  e" command is.**
c770: 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20   used to open a 
c780: 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61 62  new SQLite datab
c790: 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44 62  ase.  See the Db
c7a0: 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61  Main() routine a
c7b0: 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69  bove.** for addi
c7c0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
c7d0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74  on..*/.int Sqlit
c7e0: 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  e3_Init(Tcl_Inte
c7f0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54  rp *interp){.  T
c800: 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
c810: 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a  erp, "8.4", 0);.
c820: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
c830: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
c840: 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f  sqlite3", (Tcl_O
c850: 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
c860: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  n, 0, 0);.  Tcl_
c870: 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
c880: 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 22 33  p, "sqlite3", "3
c890: 2e 30 22 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  .0");.  Tcl_Crea
c8a0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
c8b0: 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28  erp, "sqlite", (
c8c0: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
c8d0: 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20  DbMain, 0, 0);. 
c8e0: 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28   Tcl_PkgProvide(
c8f0: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22  interp, "sqlite"
c900: 2c 20 22 33 2e 30 22 29 3b 0a 20 20 72 65 74 75  , "3.0");.  retu
c910: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74  rn TCL_OK;.}.int
c920: 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74   Tclsqlite3_Init
c930: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
c940: 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
c950: 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
c960: 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65 33  ); }.int Sqlite3
c970: 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
c980: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
c990: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
c9a0: 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53  int Tclsqlite3_S
c9b0: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
c9c0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
c9d0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23  urn TCL_OK; }..#
c9e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f  ifndef SQLITE_3_
c9f0: 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74 20  SUFFIX_ONLY.int 
ca00: 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  Sqlite_Init(Tcl_
ca10: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
ca20: 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
ca30: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
ca40: 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e  int Tclsqlite_In
ca50: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
ca60: 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
ca70: 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
ca80: 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74  rp); }.int Sqlit
ca90: 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
caa0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
cab0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
cac0: 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53  .int Tclsqlite_S
cad0: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
cae0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
caf0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65  urn TCL_OK; }.#e
cb00: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c  ndif..#ifdef TCL
cb10: 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  SH./************
cb20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb60: 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
cb70: 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73  at follows is us
cb80: 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e  ed to build stan
cb90: 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72  dalone TCL inter
cba0: 70 72 65 74 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a  preters.*/../*.*
cbb0: 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
cbc0: 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65  CLSH is one, the
cbd0: 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68  n put in code th
cbe0: 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d  is for the.** "m
cbf0: 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61  ain" routine tha
cc00: 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a  t will initializ
cc10: 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69  e Tcl and take i
cc20: 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61  nput from.** sta
cc30: 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a  ndard input..*/.
cc40: 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61  #if TCLSH==1.sta
cc50: 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  tic char zMainlo
cc60: 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69  op[] =.  "set li
cc70: 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c  ne {}\n".  "whil
cc80: 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d  e {![eof stdin]}
cc90: 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24   {\n".    "if {$
cca0: 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  line!=\"\"} {\n"
ccb0: 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
ccc0: 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e  newline \"> \"\n
ccd0: 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c  ".    "} else {\
cce0: 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d  n".      "puts -
ccf0: 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22  nonewline \"% \"
cd00: 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20  \n".    "}\n".  
cd10: 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c    "flush stdout\
cd20: 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c  n".    "append l
cd30: 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d  ine [gets stdin]
cd40: 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e  \n".    "if {[in
cd50: 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e  fo complete $lin
cd60: 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  e]} {\n".      "
cd70: 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
cd80: 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65  vel #0 $line} re
cd90: 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  sult]} {\n".    
cda0: 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72      "puts stderr
cdb0: 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c   \"Error: $resul
cdc0: 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20  t\"\n".      "} 
cdd0: 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21  elseif {$result!
cde0: 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20  =\"\"} {\n".    
cdf0: 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c      "puts $resul
ce00: 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22  t\n".      "}\n"
ce10: 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65  .      "set line
ce20: 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c   {}\n".    "} el
ce30: 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61  se {\n".      "a
ce40: 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e  ppend line \\n\n
ce50: 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d  ".    "}\n".  "}
ce60: 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  \n".;.#endif../*
ce70: 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f  .** If the macro
ce80: 20 54 43 4c 53 48 20 69 73 20 74 77 6f 2c 20 74   TCLSH is two, t
ce90: 68 65 6e 20 67 65 74 20 74 68 65 20 6d 61 69 6e  hen get the main
cea0: 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f   loop code out o
ceb0: 66 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74  f.** the separat
cec0: 65 20 66 69 6c 65 20 22 73 70 61 63 65 61 6e 61  e file "spaceana
ced0: 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66  l_tcl.h"..*/.#if
cee0: 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63   TCLSH==2.static
cef0: 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b   char zMainloop[
cf00: 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73  ] = .#include "s
cf10: 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a  paceanal_tcl.h".
cf20: 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ;.#endif..#defin
cf30: 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69  e TCLSH_MAIN mai
cf40: 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f  n   /* Needed to
cf50: 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61   fake out mktcla
cf60: 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f  pp */.int TCLSH_
cf70: 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63  MAIN(int argc, c
cf80: 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54  har **argv){.  T
cf90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
cfa0: 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65  p;.  Tcl_FindExe
cfb0: 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29  cutable(argv[0])
cfc0: 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c  ;.  interp = Tcl
cfd0: 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b  _CreateInterp();
cfe0: 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  .  Sqlite3_Init(
cff0: 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20  interp);.#ifdef 
d000: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a  SQLITE_TEST.  {.
d010: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
d020: 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
d030: 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
d040: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
d050: 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63  itetest2_Init(Tc
d060: 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
d070: 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
d080: 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f  etest3_Init(Tcl_
d090: 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
d0a0: 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
d0b0: 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est4_Init(Tcl_In
d0c0: 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
d0d0: 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
d0e0: 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t5_Init(Tcl_Inte
d0f0: 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
d100: 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63   int Md5_Init(Tc
d110: 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
d120: 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
d130: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
d140: 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69  litetest2_Init(i
d150: 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
d160: 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74  tetest3_Init(int
d170: 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
d180: 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72  test4_Init(inter
d190: 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
d1a0: 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st5_Init(interp)
d1b0: 3b 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74 28 69  ;.    Md5_Init(i
d1c0: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  nterp);.  }.#end
d1d0: 69 66 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32  if.  if( argc>=2
d1e0: 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a   || TCLSH==2 ){.
d1f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54      int i;.    T
d200: 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
d210: 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d  ,"argv0",argv[1]
d220: 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59  ,TCL_GLOBAL_ONLY
d230: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
d240: 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c  r(interp,"argv",
d250: 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f   "", TCL_GLOBAL_
d260: 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69  ONLY);.    for(i
d270: 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63  =3-TCLSH; i<argc
d280: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
d290: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
d2a0: 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d   "argv", argv[i]
d2b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f  ,.          TCL_
d2c0: 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43  GLOBAL_ONLY | TC
d2d0: 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c  L_LIST_ELEMENT |
d2e0: 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55   TCL_APPEND_VALU
d2f0: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
d300: 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63  ( TCLSH==1 && Tc
d310: 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72  l_EvalFile(inter
d320: 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c  p, argv[1])!=TCL
d330: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  _OK ){.      con
d340: 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d  st char *zInfo =
d350: 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65   Tcl_GetVar(inte
d360: 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c  rp, "errorInfo",
d370: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
d380: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  );.      if( zIn
d390: 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20  fo==0 ) zInfo = 
d3a0: 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a  interp->result;.
d3b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
d3c0: 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c  derr,"%s: %s\n",
d3d0: 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a   *argv, zInfo);.
d3e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
d3f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
d400: 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c 53 48  argc<=1 || TCLSH
d410: 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47  ==2 ){.    Tcl_G
d420: 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70  lobalEval(interp
d430: 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20  , zMainloop);.  
d440: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
d450: 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20  #endif /* TCLSH 
d460: 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  */..#endif /* !d
d470: 65 66 69 6e 65 64 28 4e 4f 5f 54 43 4c 29 20 2a  efined(NO_TCL) *
d480: 2f 0a                                            /.