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

Artifact c03bf44bd9f629d4c8d6545788c647b2e846b523:


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: 35 39 20 32 30 30 36 2f 30 36 2f 31 35 20 31 35  59 2006/06/15 15
01c0: 3a 35 39 3a 32 30 20 64 61 6e 69 65 6c 6b 31 39  :59:20 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 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
02a0: 3c 63 74 79 70 65 2e 68 3e 0a 0a 0a 23 64 65 66  <ctype.h>...#def
02b0: 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  ine NUM_PREPARED
02c0: 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e  _STMTS 10.#defin
02d0: 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  e MAX_PREPARED_S
02e0: 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20  TMTS 100../*.** 
02f0: 49 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d  If TCL uses UTF-
0300: 38 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20  8 and SQLite is 
0310: 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
0320: 65 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20  e iso8859, then 
0330: 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f  we.** have to do
0340: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77   a translation w
0350: 68 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65  hen going betwee
0360: 6e 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20  n the two.  Set 
0370: 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e  the .** UTF_TRAN
0380: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d  SLATION_NEEDED m
0390: 61 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65  acro to indicate
03a0: 20 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f   that we need to
03b0: 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e   do.** this tran
03c0: 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69  slation.  .*/.#i
03d0: 66 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54  f defined(TCL_UT
03e0: 46 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e  F_MAX) && !defin
03f0: 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a  ed(SQLITE_UTF8).
0400: 23 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41  # define UTF_TRA
0410: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20  NSLATION_NEEDED 
0420: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
0430: 4e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  New SQL function
0440: 73 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  s can be created
0450: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0460: 20 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63    Each such func
0470: 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72  tion.** is descr
0480: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0490: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
04a0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
04b0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
04c0: 74 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e  t SqlFunc SqlFun
04d0: 63 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e  c;.struct SqlFun
04e0: 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  c {.  Tcl_Interp
04f0: 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54   *interp;   /* T
0500: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
0510: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
0520: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
0530: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20  l_Obj *pScript; 
0540: 20 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f      /* The Tcl_O
0550: 62 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  bj representatio
0560: 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20  n of the script 
0570: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c  */.  int useEval
0580: 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72  Objv;      /* Tr
0590: 75 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65  ue if it is safe
05a0: 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c   to use Tcl_Eval
05b0: 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Objv */.  char *
05c0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
05d0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20  /* Name of this 
05e0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71  function */.  Sq
05f0: 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20  lFunc *pNext;   
0600: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63      /* Next func
0610: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74  tion on the list
0620: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
0630: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f  };../*.** New co
0640: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0650: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62  s function can b
0660: 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c  e created as TCL
0670: 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20   scripts.  Each 
0680: 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  such.** function
0690: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
06a0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
06b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
06c0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
06d0: 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f  def struct SqlCo
06e0: 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65  llate SqlCollate
06f0: 3b 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c  ;.struct SqlColl
0700: 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  ate {.  Tcl_Inte
0710: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a  rp *interp;   /*
0720: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
0730: 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  et to execute th
0740: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
0750: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20  char *zScript;  
0760: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72        /* The scr
0770: 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f  ipt to be run */
0780: 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70  .  SqlCollate *p
0790: 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74  Next;    /* Next
07a0: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65   function on the
07b0: 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c   list of them al
07c0: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50  l */.};../*.** P
07d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
07e0: 74 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f  ts are cached fo
07f0: 72 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69  r faster executi
0800: 6f 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72  on.  Each prepar
0810: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ed.** statement 
0820: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0830: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0850: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0860: 65 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65  ef struct SqlPre
0870: 70 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65  paredStmt SqlPre
0880: 70 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63  paredStmt;.struc
0890: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
08a0: 74 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65  t {.  SqlPrepare
08b0: 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f  dStmt *pNext;  /
08c0: 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64  * Next in linked
08d0: 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72   list */.  SqlPr
08e0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
08f0: 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  v;  /* Previous 
0900: 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  on the list */. 
0910: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0920: 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  Stmt;     /* The
0930: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
0940: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71  ent */.  int nSq
0950: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0960: 20 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53    /* chars in zS
0970: 71 6c 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 7a  ql[] */.  char z
0980: 53 71 6c 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Sql[1];         
0990: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
09a0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
09b0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
09c0: 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
09d0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
09e0: 74 75 72 65 20 66 6f 72 20 65 61 63 68 20 53 51  ture for each SQ
09f0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  Lite database.**
0a00: 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
0a10: 70 65 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  pened by the SQL
0a20: 69 74 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  ite TCL interfac
0a30: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0a40: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71  ruct SqliteDb Sq
0a50: 6c 69 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53  liteDb;.struct S
0a60: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
0a70: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
0a80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72         /* The "r
0a90: 65 61 6c 22 20 64 61 74 61 62 61 73 65 20 73 74  eal" database st
0aa0: 72 75 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45  ructure. MUST BE
0ab0: 20 46 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f   FIRST */.  Tcl_
0ac0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
0ad0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
0ae0: 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20 66  terpreter used f
0af0: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
0b00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73   */.  char *zBus
0b10: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
0b20: 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c   /* The busy cal
0b30: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0b40: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74  .  char *zCommit
0b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0b60: 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   The commit hook
0b70: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0b80: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72  e */.  char *zTr
0b90: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
0ba0: 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63    /* The trace c
0bb0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0bc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66  */.  char *zProf
0bd0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
0be0: 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63  /* The profile c
0bf0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0c00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67  */.  char *zProg
0c10: 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  ress;           
0c20: 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  /* The progress 
0c30: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0c40: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74   */.  char *zAut
0c50: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0c60: 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a   /* The authoriz
0c70: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72  ation callback r
0c80: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
0c90: 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20   *zNull;        
0ca0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
0cb0: 6f 20 73 75 62 73 74 69 74 75 74 65 20 66 6f 72  o substitute for
0cc0: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c   an SQL NULL val
0cd0: 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20  ue */.  SqlFunc 
0ce0: 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20  *pFunc;         
0cf0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0d00: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  L functions */. 
0d10: 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70 64 61 74   Tcl_Obj *pUpdat
0d20: 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 55  eHook;      /* U
0d30: 70 64 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70  pdate hook scrip
0d40: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
0d50: 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62 61  Tcl_Obj *pRollba
0d60: 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52 6f  ckHook;    /* Ro
0d70: 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72 69  llback hook scri
0d80: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
0d90: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
0da0: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
0db0: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
0dc0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
0dd0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0df0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
0e00: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
0e10: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
0e20: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
0e30: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
0e40: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
0e50: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
0e60: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
0e70: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
0e80: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
0e90: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
0ea0: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
0eb0: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
0ec0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
0ed0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
0ee0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
0ef0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
0f00: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
0f10: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
0f20: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
0f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0f40: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
0f50: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
0f60: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  .};../*.** Look 
0f70: 61 74 20 74 68 65 20 73 63 72 69 70 74 20 70 72  at the script pr
0f80: 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57  efix in pCmd.  W
0f90: 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74  e will be execut
0fa0: 69 6e 67 20 74 68 69 73 20 73 63 72 69 70 74 0a  ing this script.
0fb0: 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74 20 61  ** after first a
0fc0: 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20  ppending one or 
0fd0: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20  more arguments. 
0fe0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
0ff0: 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63  alyzes.** the sc
1000: 72 69 70 74 20 74 6f 20 73 65 65 20 69 66 20 69  ript to see if i
1010: 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
1020: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
1030: 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a  on the script.**
1040: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
1050: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63   more general Tc
1060: 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c  l_EvalEx().  Tcl
1070: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d  _EvalObjv() is m
1080: 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a  uch.** faster..*
1090: 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61  *.** Scripts tha
10a0: 74 20 61 72 65 20 73 61 66 65 20 74 6f 20 75 73  t are safe to us
10b0: 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f  e with Tcl_EvalO
10c0: 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f  bjv() consists o
10d0: 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e  f a.** command n
10e0: 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ame followed by 
10f0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67  zero or more arg
1100: 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b  uments with no [
1110: 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20  ...] or $.** or 
1120: 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65  {...} or ; to be
1130: 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20   seen anywhere. 
1140: 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73   Most callback s
1150: 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a  cripts consist.*
1160: 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67  * of just a sing
1170: 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d  le procedure nam
1180: 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20  e and they meet 
1190: 74 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74  this requirement
11a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11b0: 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
11c0: 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  v(Tcl_Interp *in
11d0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70  terp, Tcl_Obj *p
11e0: 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f  Cmd){.  /* We co
11f0: 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f  uld try to do so
1200: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c  mething with Tcl
1210: 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74 20 77  _Parse().  But w
1220: 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20  e will instead. 
1230: 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65   ** just do a se
1240: 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64  arch for forbidd
1250: 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  en characters.  
1260: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
1270: 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61  rbidden.  ** cha
1280: 72 61 63 74 65 72 73 20 61 70 70 65 61 72 20 69  racters appear i
1290: 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20  n pCmd, we will 
12a0: 72 65 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e  report the strin
12b0: 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a  g as unsafe..  *
12c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
12d0: 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20  z;.  int n;.  z 
12e0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
12f0: 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29  romObj(pCmd, &n)
1300: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
1310: 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20   0 ){.    int c 
1320: 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(z++);.    if
1330: 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27  ( c=='$' || c=='
1340: 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72  [' || c==';' ) r
1350: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1360: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1370: 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e  * Find an SqlFun
1380: 63 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  c structure with
1390: 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e   the given name.
13a0: 20 20 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65    Or create a ne
13b0: 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65  w.** one if an e
13c0: 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e  xisting one cann
13d0: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65  ot be found.  Re
13e0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
13f0: 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75  o the.** structu
1400: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71  re..*/.static Sq
1410: 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75  lFunc *findSqlFu
1420: 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62  nc(SqliteDb *pDb
1430: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1440: 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  ame){.  SqlFunc 
1450: 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  *p, *pNew;.  int
1460: 20 69 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71   i;.  pNew = (Sq
1470: 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63  lFunc*)Tcl_Alloc
1480: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
1490: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
14a0: 2b 20 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a  + 1 );.  pNew->z
14b0: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
14c0: 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  New[1];.  for(i=
14d0: 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b  0; zName[i]; i++
14e0: 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69  ){ pNew->zName[i
14f0: 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d  ] = tolower(zNam
1500: 65 5b 69 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d  e[i]); }.  pNew-
1510: 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20  >zName[i] = 0;. 
1520: 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e   for(p=pDb->pFun
1530: 63 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  c; p; p=p->pNext
1540: 29 7b 20 0a 20 20 20 20 69 66 28 20 73 74 72 63  ){ .    if( strc
1550: 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65  mp(p->zName, pNe
1560: 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  w->zName)==0 ){.
1570: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
1580: 63 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20  char*)pNew);.   
1590: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
15a0: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69   }.  }.  pNew->i
15b0: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
15c0: 65 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 63  erp;.  pNew->pSc
15d0: 72 69 70 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ript = 0;.  pNew
15e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
15f0: 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e 70 46 75  Func;.  pDb->pFu
1600: 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74  nc = pNew;.  ret
1610: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
1620: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20  ** Finalize and 
1630: 66 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70  free a list of p
1640: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1650: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
1660: 64 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65  d flushStmtCache
1670: 28 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20  ( SqliteDb *pDb 
1680: 29 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  ){.  SqlPrepared
1690: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a  Stmt *pPreStmt;.
16a0: 0a 20 20 77 68 69 6c 65 28 20 20 70 44 62 2d 3e  .  while(  pDb->
16b0: 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20  stmtList ){.    
16c0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
16d0: 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d  ( pDb->stmtList-
16e0: 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 70 50  >pStmt );.    pP
16f0: 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74  reStmt = pDb->st
1700: 6d 74 4c 69 73 74 3b 0a 20 20 20 20 70 44 62 2d  mtList;.    pDb-
1710: 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 44 62 2d  >stmtList = pDb-
1720: 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 4e 65 78 74  >stmtList->pNext
1730: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 20  ;.    Tcl_Free( 
1740: 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 20  (char*)pPreStmt 
1750: 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53  );.  }.  pDb->nS
1760: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e  tmt = 0;.  pDb->
1770: 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 7d 0a  stmtLast = 0;.}.
1780: 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73  ./*.** TCL calls
1790: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
17a0: 77 68 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 20  when an sqlite3 
17b0: 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64  database command
17c0: 20 69 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a   is.** deleted..
17d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
17e0: 62 44 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20  bDeleteCmd(void 
17f0: 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *db){.  SqliteDb
1800: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
1810: 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73 68 53 74  b*)db;.  flushSt
1820: 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20  mtCache(pDb);.  
1830: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
1840: 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65 28  b->db);.  while(
1850: 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a 20   pDb->pFunc ){. 
1860: 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
1870: 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  c = pDb->pFunc;.
1880: 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d      pDb->pFunc =
1890: 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20   pFunc->pNext;. 
18a0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
18b0: 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69  unt(pFunc->pScri
18c0: 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  pt);.    Tcl_Fre
18d0: 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b  e((char*)pFunc);
18e0: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44  .  }.  while( pD
18f0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  b->pCollate ){. 
1900: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
1910: 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70  Collate = pDb->p
1920: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62  Collate;.    pDb
1930: 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f  ->pCollate = pCo
1940: 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  llate->pNext;.  
1950: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
1960: 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d  *)pCollate);.  }
1970: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73  .  if( pDb->zBus
1980: 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  y ){.    Tcl_Fre
1990: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
19a0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54   }.  if( pDb->zT
19b0: 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f  race ){.    Tcl_
19c0: 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
19d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
19e0: 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
19f0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
1a00: 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d 0a 20  zProfile);.  }. 
1a10: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
1a20: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
1a30: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d  pDb->zAuth);.  }
1a40: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c  .  if( pDb->zNul
1a50: 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  l ){.    Tcl_Fre
1a60: 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20  e(pDb->zNull);. 
1a70: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 55   }.  if( pDb->pU
1a80: 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20  pdateHook ){.   
1a90: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1aa0: 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  t(pDb->pUpdateHo
1ab0: 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ok);.  }.  if( p
1ac0: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
1ad0: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
1ae0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
1af0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20  RollbackHook);. 
1b00: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 43   }.  if( pDb->pC
1b10: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a  ollateNeeded ){.
1b20: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1b30: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
1b40: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d 0a 20  teNeeded);.  }. 
1b50: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1b60: 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  )pDb);.}../*.** 
1b70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1b80: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64 61  called when a da
1b90: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6c  tabase file is l
1ba0: 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79 69  ocked while tryi
1bb0: 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74 65  ng.** to execute
1bc0: 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   SQL..*/.static 
1bd0: 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c 65  int DbBusyHandle
1be0: 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74 20  r(void *cd, int 
1bf0: 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69 74  nTries){.  Sqlit
1c00: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
1c10: 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20  teDb*)cd;.  int 
1c20: 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b  rc;.  char zVal[
1c30: 33 30 5d 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28  30];..  sprintf(
1c40: 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69  zVal, "%d", nTri
1c50: 65 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f  es);.  rc = Tcl_
1c60: 56 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  VarEval(pDb->int
1c70: 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c  erp, pDb->zBusy,
1c80: 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61   " ", zVal, (cha
1c90: 72 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r*)0);.  if( rc!
1ca0: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
1cb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
1cc0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
1cd0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1ce0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1cf0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  1;.}../*.** This
1d00: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
1d10: 6b 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67  ked as the 'prog
1d20: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66  ress callback' f
1d30: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  or the database.
1d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
1d50: 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72  bProgressHandler
1d60: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
1d70: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
1d80: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
1d90: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1da0: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
1db0: 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45   );.  rc = Tcl_E
1dc0: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
1dd0: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29   pDb->zProgress)
1de0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
1df0: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
1e00: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
1e10: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
1e20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e30: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e50: 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
1e60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1e70: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53   called by the S
1e80: 51 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64  QLite trace hand
1e90: 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e  ler whenever a n
1ea0: 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53  ew.** block of S
1eb0: 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  QL is executed. 
1ec0: 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   The TCL script 
1ed0: 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69  in pDb->zTrace i
1ee0: 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73  s executed..*/.s
1ef0: 74 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61  tatic void DbTra
1f00: 63 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ceHandler(void *
1f10: 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  cd, const char *
1f20: 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44  zSql){.  SqliteD
1f30: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
1f40: 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53  Db*)cd;.  Tcl_DS
1f50: 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63  tring str;..  Tc
1f60: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
1f70: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
1f80: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
1f90: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b  Db->zTrace, -1);
1fa0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
1fb0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
1fc0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45  , zSql);.  Tcl_E
1fd0: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
1fe0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
1ff0: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
2000: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
2010: 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
2020: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
2030: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
2040: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2050: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  _TRACE./*.** Thi
2060: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2070: 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  led by the SQLit
2080: 65 20 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65  e profile handle
2090: 72 20 61 66 74 65 72 20 61 20 73 74 61 74 65 6d  r after a statem
20a0: 65 6e 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65  ent.** SQL has e
20b0: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43  xecuted.  The TC
20c0: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
20d0: 3e 7a 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61  >zProfile is eva
20e0: 6c 75 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  luated..*/.stati
20f0: 63 20 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65  c void DbProfile
2100: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
2110: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
2120: 71 6c 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ql, sqlite_uint6
2130: 34 20 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44  4 tm){.  SqliteD
2140: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
2150: 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53  Db*)cd;.  Tcl_DS
2160: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61  tring str;.  cha
2170: 72 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73  r zTm[100];..  s
2180: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2190: 73 69 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a  sizeof(zTm)-1, z
21a0: 54 6d 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b  Tm, "%lld", tm);
21b0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
21c0: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
21d0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
21e0: 74 72 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  tr, pDb->zProfil
21f0: 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  e, -1);.  Tcl_DS
2200: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
2210: 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a  nt(&str, zSql);.
2220: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
2230: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
2240: 20 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61   zTm);.  Tcl_Eva
2250: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
2260: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
2270: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
2280: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
2290: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
22a0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
22b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
22d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
22e0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
22f0: 6d 6d 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a  mmitted.  The.**
2300: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
2310: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65  Db->zCommit is e
2320: 78 65 63 75 74 65 64 2e 20 20 49 66 20 69 74 20  xecuted.  If it 
2330: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
2340: 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72   or.** if it thr
2350: 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
2360: 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
2370: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
2380: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62   instead.** of b
2390: 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  eing committed..
23a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
23b0: 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f  CommitHandler(vo
23c0: 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74  id *cd){.  Sqlit
23d0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
23e0: 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20  teDb*)cd;.  int 
23f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f  rc;..  rc = Tcl_
2400: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
2410: 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b  , pDb->zCommit);
2420: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
2430: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
2440: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
2450: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
2460: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2470: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2480: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 52 6f  static void DbRo
2490: 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f  llbackHandler(vo
24a0: 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b  id *clientData){
24b0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
24c0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c   = (SqliteDb*)cl
24d0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 61 73 73 65  ientData;.  asse
24e0: 72 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  rt(pDb->pRollbac
24f0: 6b 48 6f 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43  kHook);.  if( TC
2500: 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62  L_OK!=Tcl_EvalOb
2510: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
2520: 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48   pDb->pRollbackH
2530: 6f 6f 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 54  ook, 0) ){.    T
2540: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
2550: 6f 72 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  or(pDb->interp);
2560: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
2570: 6f 69 64 20 44 62 55 70 64 61 74 65 48 61 6e 64  oid DbUpdateHand
2580: 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20  ler(.  void *p, 
2590: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
25a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20  st char *zDb, . 
25b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
25c0: 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  l, .  sqlite_int
25d0: 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71  64 rowid.){.  Sq
25e0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
25f0: 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54  qliteDb *)p;.  T
2600: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
2610: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55   assert( pDb->pU
2620: 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61  pdateHook );.  a
2630: 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54  ssert( op==SQLIT
2640: 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d  E_INSERT || op==
2650: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c  SQLITE_UPDATE ||
2660: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
2670: 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  TE );..  pCmd = 
2680: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
2690: 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
26a0: 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  k);.  Tcl_IncrRe
26b0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
26c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
26d0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
26e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
26f0: 62 6a 28 0a 20 20 20 20 28 20 28 6f 70 3d 3d 53  bj(.    ( (op==S
2700: 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3f 22 49  QLITE_INSERT)?"I
2710: 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53 51 4c 49  NSERT":(op==SQLI
2720: 54 45 5f 55 50 44 41 54 45 29 3f 22 55 50 44 41  TE_UPDATE)?"UPDA
2730: 54 45 22 3a 22 44 45 4c 45 54 45 22 29 2c 20 2d  TE":"DELETE"), -
2740: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
2750: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2760: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
2770: 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d  StringObj(zDb, -
2780: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
2790: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
27a0: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
27b0: 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20  StringObj(zTbl, 
27c0: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
27d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
27e0: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
27f0: 77 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69  wWideIntObj(rowi
2800: 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  d));.  Tcl_EvalO
2810: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
2820: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
2830: 5f 44 49 52 45 43 54 29 3b 0a 7d 0a 0a 73 74 61  _DIRECT);.}..sta
2840: 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c  tic void tclColl
2850: 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69  ateNeeded(.  voi
2860: 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74  d *pCtx,.  sqlit
2870: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e  e3 *db,.  int en
2880: 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c,.  const char 
2890: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69  *zName.){.  Sqli
28a0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
28b0: 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20  iteDb *)pCtx;.  
28c0: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
28d0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
28e0: 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  Obj(pDb->pCollat
28f0: 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f  eNeeded);.  Tcl_
2900: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
2910: 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ript);.  Tcl_Lis
2920: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2930: 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63  t(0, pScript, Tc
2940: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
2950: 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63  Name, -1));.  Tc
2960: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
2970: 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  >interp, pScript
2980: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
2990: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
29a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
29b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
29c0: 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  ed to evaluate a
29d0: 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  n SQL collation 
29e0: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
29f0: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43  nted.** using TC
2a00: 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61  L script..*/.sta
2a10: 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f  tic int tclSqlCo
2a20: 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70  llate(.  void *p
2a30: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20  Ctx,.  int nA,. 
2a40: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c   const void *zA,
2a50: 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e  .  int nB,.  con
2a60: 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20  st void *zB.){. 
2a70: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d   SqlCollate *p =
2a80: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70   (SqlCollate *)p
2a90: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
2aa0: 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  pCmd;..  pCmd = 
2ab0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2ac0: 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29  (p->zScript, -1)
2ad0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
2ae0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63  ount(pCmd);.  Tc
2af0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2b00: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
2b10: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
2b20: 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29  tringObj(zA, nA)
2b30: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
2b40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
2b50: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
2b60: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2b70: 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f  zB, nB));.  Tcl_
2b80: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
2b90: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
2ba0: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
2bb0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2bc0: 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCmd);.  return 
2bd0: 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72  (atoi(Tcl_GetStr
2be0: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
2bf0: 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erp)));.}../*.**
2c00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2c10: 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75   called to evalu
2c20: 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  ate an SQL funct
2c30: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  ion implemented.
2c40: 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72  ** using TCL scr
2c50: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ipt..*/.static v
2c60: 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73  oid tclSqlFunc(s
2c70: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2c80: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
2c90: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
2ca0: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75  **argv){.  SqlFu
2cb0: 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  nc *p = sqlite3_
2cc0: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
2cd0: 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  t);.  Tcl_Obj *p
2ce0: 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Cmd;.  int i;.  
2cf0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61  int rc;..  if( a
2d00: 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rgc==0 ){.    /*
2d10: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
2d20: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
2d30: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c  e function, call
2d40: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f   Tcl_EvalObjEx o
2d50: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72  n the.    ** scr
2d60: 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63  ipt object direc
2d70: 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  tly.  This allow
2d80: 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c  s the TCL compil
2d90: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20  er to generate. 
2da0: 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66     ** bytecode f
2db0: 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f  or the command o
2dc0: 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f  n the first invo
2dd0: 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20  cation and thus 
2de0: 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73  make.    ** subs
2df0: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
2e00: 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  ns much faster. 
2e10: 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d  */.    pCmd = p-
2e20: 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63  >pScript;.    Tc
2e30: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
2e40: 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  Cmd);.    rc = T
2e50: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
2e60: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29  interp, pCmd, 0)
2e70: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
2e80: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
2e90: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2ea0: 20 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d   there are argum
2eb0: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
2ec0: 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61  tion, make a sha
2ed0: 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65  llow copy of the
2ee0: 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f  .    ** script o
2ef0: 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74  bject, lappend t
2f00: 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68  he arguments, th
2f10: 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
2f20: 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  copy..    **.   
2f30: 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22   ** By "shallow"
2f40: 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 61   copy, we mean a
2f50: 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20   only the outer 
2f60: 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20  list Tcl_Obj is 
2f70: 64 75 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20  duplicated..    
2f80: 2a 2a 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f  ** The new Tcl_O
2f90: 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  bj contains poin
2fa0: 74 65 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67  ters to the orig
2fb0: 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e  inal list elemen
2fc0: 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68 61 74  ts. .    ** That
2fd0: 20 77 61 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45   way, when Tcl_E
2fe0: 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 72 75 6e  valObjv() is run
2ff0: 20 61 6e 64 20 73 68 69 6d 6d 65 72 73 20 74 68   and shimmers th
3000: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a  e first element.
3010: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69      ** of the li
3020: 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65  st to tclCmdName
3030: 54 79 70 65 2c 20 74 68 61 74 20 61 6c 74 65 72  Type, that alter
3040: 6e 61 74 65 20 72 65 70 72 65 73 65 6e 74 61 74  nate representat
3050: 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
3060: 62 65 20 70 72 65 73 65 72 76 65 64 20 61 6e 64  be preserved and
3070: 20 72 65 75 73 65 64 20 6f 6e 20 74 68 65 20 6e   reused on the n
3080: 65 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ext invocation..
3090: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f      */.    Tcl_O
30a0: 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69  bj **aArg;.    i
30b0: 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 66 28  nt nArg;.    if(
30c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45   Tcl_ListObjGetE
30d0: 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72  lements(p->inter
30e0: 70 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c 20 26  p, p->pScript, &
30f0: 6e 41 72 67 2c 20 26 61 41 72 67 29 20 29 7b 0a  nArg, &aArg) ){.
3100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3110: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
3120: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
3130: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
3140: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20  p), -1); .      
3150: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20  return;.    }   
3160: 20 20 0a 20 20 20 20 70 43 6d 64 20 3d 20 54 63    .    pCmd = Tc
3170: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72  l_NewListObj(nAr
3180: 67 2c 20 61 41 72 67 29 3b 0a 20 20 20 20 54 63  g, aArg);.    Tc
3190: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
31a0: 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Cmd);.    for(i=
31b0: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
31c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
31d0: 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72 67 76  alue *pIn = argv
31e0: 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  [i];.      Tcl_O
31f0: 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20  bj *pVal;.      
3200: 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
3210: 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74  Set pVal to cont
3220: 61 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f 6c  ain the i'th col
3230: 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77 2e  umn of this row.
3240: 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68   */.      switch
3250: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
3260: 74 79 70 65 28 70 49 6e 29 20 29 7b 0a 20 20 20  type(pIn) ){.   
3270: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
3280: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20  _BLOB: {.       
3290: 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73     int bytes = s
32a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
32b0: 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  es(pIn);.       
32c0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
32d0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71  wByteArrayObj(sq
32e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
32f0: 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20  (pIn), bytes);. 
3300: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
3310: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3320: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
3330: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20  TEGER: {.       
3340: 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20     sqlite_int64 
3350: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
3360: 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20  e_int64(pIn);.  
3370: 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d          if( v>=-
3380: 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c  2147483647 && v<
3390: 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20  =2147483647 ){. 
33a0: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
33b0: 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  = Tcl_NewIntObj(
33c0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  v);.          }e
33d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
33e0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57   pVal = Tcl_NewW
33f0: 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  ideIntObj(v);.  
3400: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3420: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
3430: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
3440: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  {.          doub
3450: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  le r = sqlite3_v
3460: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29  alue_double(pIn)
3470: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
3480: 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65   = Tcl_NewDouble
3490: 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20  Obj(r);.        
34a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
34b0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
34c0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
34d0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
34e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
34f0: 28 22 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ("", 0);.       
3500: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3510: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61    }.        defa
3520: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ult: {.         
3530: 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c   int bytes = sql
3540: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
3550: 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  (pIn);.         
3560: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
3570: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
3580: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
3590: 65 78 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29  ext(pIn), bytes)
35a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
35b0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
35c0: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
35d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
35e0: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
35f0: 72 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b  rp, pCmd, pVal);
3600: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
3610: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
3620: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
3630: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3640: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
3650: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
3660: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
3670: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20  terp), -1); .   
3680: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
3690: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
36a0: 66 28 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62  f( !p->useEvalOb
36b0: 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  jv ){.      /* T
36c0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77  cl_EvalObjEx() w
36d0: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
36e0: 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  y call Tcl_EvalO
36f0: 62 6a 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20  bjv() if pCmd.  
3700: 20 20 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74      ** is a list
3710: 20 77 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e   without a strin
3720: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
3730: 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68  .  To prevent th
3740: 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  is from.      **
3750: 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65   happening, make
3760: 20 73 75 72 65 20 70 43 6d 64 20 68 61 73 20 61   sure pCmd has a
3770: 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65   valid string re
3780: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  presentation */.
3790: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
37a0: 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d  ing(pCmd);.    }
37b0: 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  .    rc = Tcl_Ev
37c0: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
37d0: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
37e0: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54  L_DIRECT);.    T
37f0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3800: 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCmd);.  }..  if
3810: 28 20 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f  ( rc && rc!=TCL_
3820: 52 45 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71  RETURN ){.    sq
3830: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
3840: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
3850: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
3860: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
3870: 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54   .  }else{.    T
3880: 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54  cl_Obj *pVar = T
3890: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
38a0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  p->interp);.    
38b0: 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64  int n;.    u8 *d
38c0: 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ata;.    char *z
38d0: 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70  Type = pVar->typ
38e0: 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70  ePtr ? pVar->typ
38f0: 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b  ePtr->name : "";
3900: 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54  .    char c = zT
3910: 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ype[0];.    if( 
3920: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
3930: 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61  (zType,"bytearra
3940: 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e  y")==0 && pVar->
3950: 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  bytes==0 ){.    
3960: 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e    /* Only return
3970: 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20   a BLOB type if 
3980: 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65  the Tcl variable
3990: 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20   is a bytearray 
39a0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  and.      ** has
39b0: 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65   no string repre
39c0: 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  sentation. */.  
39d0: 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47      data = Tcl_G
39e0: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
39f0: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
3a00: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3a10: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
3a20: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
3a30: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
3a40: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
3a50: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
3a60: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
3a70: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ) ||.          (
3a80: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
3a90: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
3aa0: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47  ) ){.      Tcl_G
3ab0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  etIntFromObj(0, 
3ac0: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
3ad0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3ae0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b  int(context, n);
3af0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
3b00: 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28  =='d' && strcmp(
3b10: 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d  zType,"double")=
3b20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62  =0 ){.      doub
3b30: 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f  le r;.      Tcl_
3b40: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
3b50: 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  (0, pVar, &r);. 
3b60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3b70: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
3b80: 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, r);.    }els
3b90: 65 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20  e if( c=='w' && 
3ba0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
3bb0: 64 65 49 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20  deInt")==0 ){.  
3bc0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
3bd0: 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  v;.      Tcl_Get
3be0: 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30  WideIntFromObj(0
3bf0: 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20  , pVar, &v);.   
3c00: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3c10: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
3c20: 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   v);.    }else{.
3c30: 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e        data = (un
3c40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63  signed char *)Tc
3c50: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3c60: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
3c70: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3c80: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
3c90: 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e   (char *)data, n
3ca0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
3cb0: 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  NT);.    }.  }.}
3cc0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3cd0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
3ce0: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ION./*.** This i
3cf0: 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61  s the authentica
3d00: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20  tion function.  
3d10: 49 74 20 61 70 70 65 6e 64 73 20 74 68 65 20 61  It appends the a
3d20: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a  uthentication.**
3d30: 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20 74   type code and t
3d40: 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  he two arguments
3d50: 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20   to zCmd[] then 
3d60: 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73 75  invokes the resu
3d70: 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74  lt.** on the int
3d80: 65 72 70 72 65 74 65 72 2e 20 20 54 68 65 20 72  erpreter.  The r
3d90: 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65 64  eply is examined
3da0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
3db0: 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69   the.** authenti
3dc0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20  cation fails or 
3dd0: 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61  succeeds..*/.sta
3de0: 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61 6c  tic int auth_cal
3df0: 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70  lback(.  void *p
3e00: 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c  Arg,.  int code,
3e10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3e20: 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg1,.  const ch
3e30: 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e  ar *zArg2,.  con
3e40: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a  st char *zArg3,.
3e50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
3e60: 72 67 34 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  rg4.){.  char *z
3e70: 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Code;.  Tcl_DStr
3e80: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
3e90: 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
3ea0: 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74  *zReply;.  Sqlit
3eb0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
3ec0: 74 65 44 62 2a 29 70 41 72 67 3b 0a 0a 20 20 73  teDb*)pArg;..  s
3ed0: 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20  witch( code ){. 
3ee0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ef0: 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20  OPY             
3f00: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3f10: 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20  _COPY"; break;. 
3f20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3f30: 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20  REATE_INDEX     
3f40: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3f50: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20  _CREATE_INDEX"; 
3f60: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3f70: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
3f80: 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  BLE      : zCode
3f90: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
3fa0: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
3fb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3fc0: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
3fd0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3fe0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
3ff0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
4000: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
4010: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20  TE_TEMP_TABLE : 
4020: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
4030: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
4040: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4050: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
4060: 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43  TEMP_TRIGGER: zC
4070: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
4080: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  TE_TEMP_TRIGGER"
4090: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
40a0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
40b0: 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f  TEMP_VIEW  : zCo
40c0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
40d0: 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  E_TEMP_VIEW"; br
40e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
40f0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
4100: 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  GER    : zCode="
4110: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
4120: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
4130: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4140: 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20  REATE_VIEW      
4150: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4160: 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62  _CREATE_VIEW"; b
4170: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
4180: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20  QLITE_DELETE    
4190: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
41a0: 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b  "SQLITE_DELETE";
41b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
41c0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
41d0: 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  EX        : zCod
41e0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  e="SQLITE_DROP_I
41f0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
4200: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
4210: 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20  OP_TABLE        
4220: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4230: 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  DROP_TABLE"; bre
4240: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4250: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
4260: 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  DEX   : zCode="S
4270: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
4280: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
4290: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
42a0: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20  ROP_TEMP_TABLE  
42b0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
42c0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
42d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
42e0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
42f0: 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43  EMP_TRIGGER : zC
4300: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
4310: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
4320: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4330: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
4340: 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65  _VIEW    : zCode
4350: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
4360: 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  MP_VIEW"; break;
4370: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4380: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20  _DROP_TRIGGER   
4390: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
43a0: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22  TE_DROP_TRIGGER"
43b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
43c0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  e SQLITE_DROP_VI
43d0: 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  EW         : zCo
43e0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
43f0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
4400: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
4410: 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SERT            
4420: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4430: 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a  INSERT"; break;.
4440: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4450: 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20  PRAGMA          
4460: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
4470: 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b  E_PRAGMA"; break
4480: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
4490: 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  E_READ          
44a0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
44b0: 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b  ITE_READ"; break
44c0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
44d0: 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  E_SELECT        
44e0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
44f0: 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65  ITE_SELECT"; bre
4500: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4510: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20  ITE_TRANSACTION 
4520: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
4530: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
4540: 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  N"; break;.    c
4550: 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
4560: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
4570: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44  Code="SQLITE_UPD
4580: 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATE"; break;.   
4590: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54   case SQLITE_ATT
45a0: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
45b0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
45c0: 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  TTACH"; break;. 
45d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
45e0: 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  ETACH           
45f0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4600: 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _DETACH"; break;
4610: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4620: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20  _ALTER_TABLE    
4630: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4640: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b  TE_ALTER_TABLE";
4650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4660: 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20   SQLITE_REINDEX 
4670: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4680: 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e="SQLITE_REINDE
4690: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
46a0: 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59  ase SQLITE_ANALY
46b0: 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ZE           : z
46c0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41  Code="SQLITE_ANA
46d0: 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LYZE"; break;.  
46e0: 20 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20    default       
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20  : zCode="????"; 
4710: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c  break;.  }.  Tcl
4720: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
4730: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
4740: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
4750: 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20  b->zAuth, -1);. 
4760: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4770: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
4780: 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53  zCode);.  Tcl_DS
4790: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
47a0: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f  nt(&str, zArg1 ?
47b0: 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20   zArg1 : "");.  
47c0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
47d0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
47e0: 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22  Arg2 ? zArg2 : "
47f0: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
4800: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
4810: 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72  str, zArg3 ? zAr
4820: 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g3 : "");.  Tcl_
4830: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
4840: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34  ment(&str, zArg4
4850: 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a   ? zArg4 : "");.
4860: 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61    rc = Tcl_Globa
4870: 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72  lEval(pDb->inter
4880: 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  p, Tcl_DStringVa
4890: 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63  lue(&str));.  Tc
48a0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
48b0: 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20  tr);.  zReply = 
48c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
48d0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
48e0: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
48f0: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b  Reply,"SQLITE_OK
4900: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
4910: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
4920: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
4930: 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44  zReply,"SQLITE_D
4940: 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ENY")==0 ){.    
4950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59  rc = SQLITE_DENY
4960: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
4970: 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c  rcmp(zReply,"SQL
4980: 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20  ITE_IGNORE")==0 
4990: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
49a0: 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c  TE_IGNORE;.  }el
49b0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39  se{.    rc = 999
49c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
49d0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
49e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
49f0: 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a  RIZATION */../*.
4a00: 2a 2a 20 7a 54 65 78 74 20 69 73 20 61 20 70 6f  ** zText is a po
4a10: 69 6e 74 65 72 20 74 6f 20 74 65 78 74 20 6f 62  inter to text ob
4a20: 74 61 69 6e 65 64 20 76 69 61 20 61 6e 20 73 71  tained via an sq
4a30: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4a40: 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61  t().** or simila
4a50: 72 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69  r interface. Thi
4a60: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
4a70: 73 20 61 20 54 63 6c 20 73 74 72 69 6e 67 20 6f  s a Tcl string o
4a80: 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72  bject, .** refer
4a90: 65 6e 63 65 20 63 6f 75 6e 74 20 73 65 74 20 74  ence count set t
4aa0: 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20  o 0, containing 
4ab0: 74 68 65 20 74 65 78 74 2e 20 49 66 20 61 20 74  the text. If a t
4ac0: 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65  ranslation.** be
4ad0: 74 77 65 65 6e 20 69 73 6f 38 38 35 39 20 61 6e  tween iso8859 an
4ae0: 64 20 55 54 46 2d 38 20 69 73 20 72 65 71 75 69  d UTF-8 is requi
4af0: 72 65 64 2c 20 69 74 20 69 73 20 70 72 65 66 6f  red, it is prefo
4b00: 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rmed..*/.static 
4b10: 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54  Tcl_Obj *dbTextT
4b20: 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73 74 20  oObj(char const 
4b30: 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f  *zText){.  Tcl_O
4b40: 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66  bj *pVal;.#ifdef
4b50: 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e   UTF_TRANSLATION
4b60: 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f 44 53  _NEEDED.  Tcl_DS
4b70: 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63  tring dCol;.  Tc
4b80: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
4b90: 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65  Col);.  Tcl_Exte
4ba0: 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67  rnalToUtfDString
4bb0: 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31  (NULL, zText, -1
4bc0: 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c  , &dCol);.  pVal
4bd0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4be0: 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56  Obj(Tcl_DStringV
4bf0: 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29  alue(&dCol), -1)
4c00: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
4c10: 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73  ree(&dCol);.#els
4c20: 65 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e  e.  pVal = Tcl_N
4c30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78  ewStringObj(zTex
4c40: 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  t, -1);.#endif. 
4c50: 20 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a   return pVal;.}.
4c60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4c70: 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65  ine reads a line
4c80: 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49   of text from FI
4c90: 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a  LE in, stores.**
4ca0: 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d   the text in mem
4cb0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
4cc0: 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72  m malloc() and r
4cd0: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
4ce0: 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e  .** to the text.
4cf0: 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e    NULL is return
4d00: 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c  ed at end of fil
4d10: 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28  e, or if malloc(
4d20: 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  ).** fails..**.*
4d30: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
4d40: 69 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e  is like "readlin
4d50: 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e  e" but no comman
4d60: 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a  d-line editing.*
4d70: 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  * is done..**.**
4d80: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68 65   copied from she
4d90: 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f  ll.c from '.impo
4da0: 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73  rt' command.*/.s
4db0: 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61  tatic char *loca
4dc0: 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a  l_getline(char *
4dd0: 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69  zPrompt, FILE *i
4de0: 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e  n){.  char *zLin
4df0: 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a  e;.  int nLine;.
4e00: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 65    int n;.  int e
4e10: 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31  ol;..  nLine = 1
4e20: 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61  00;.  zLine = ma
4e30: 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20  lloc( nLine );. 
4e40: 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20   if( zLine==0 ) 
4e50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20  return 0;.  n = 
4e60: 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20  0;.  eol = 0;.  
4e70: 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a 20  while( !eol ){. 
4e80: 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69     if( n+100>nLi
4e90: 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e  ne ){.      nLin
4ea0: 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30  e = nLine*2 + 10
4eb0: 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d  0;.      zLine =
4ec0: 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20   realloc(zLine, 
4ed0: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  nLine);.      if
4ee0: 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74  ( zLine==0 ) ret
4ef0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
4f00: 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e   if( fgets(&zLin
4f10: 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c  e[n], nLine - n,
4f20: 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   in)==0 ){.     
4f30: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
4f40: 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29       free(zLine)
4f50: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
4f60: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4f70: 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a    zLine[n] = 0;.
4f80: 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20        eol = 1;. 
4f90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4fa0: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69  }.    while( zLi
4fb0: 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  ne[n] ){ n++; }.
4fc0: 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a      if( n>0 && z
4fd0: 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20  Line[n-1]=='\n' 
4fe0: 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  ){.      n--;.  
4ff0: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
5000: 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b  ;.      eol = 1;
5010: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69  .    }.  }.  zLi
5020: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c  ne = realloc( zL
5030: 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65  ine, n+1 );.  re
5040: 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f  turn zLine;.}../
5050: 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65  *.** The "sqlite
5060: 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20  " command below 
5070: 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 54 63  creates a new Tc
5080: 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61  l command for ea
5090: 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  ch.** connection
50a0: 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20   it opens to an 
50b0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
50c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
50d0: 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65  s invoked.** whe
50e0: 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f  never one of tho
50f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70  se connection-sp
5100: 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20  ecific commands 
5110: 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69  is executed.** i
5120: 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d  n Tcl.  For exam
5130: 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20  ple, if you run 
5140: 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68  Tcl code like th
5150: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
5160: 73 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d 79  sqlite3 db1  "my
5170: 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20  _database".**   
5180: 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a      db1 close.**
5190: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f  .** The first co
51a0: 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f  mmand opens a co
51b0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
51c0: 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64 61  "my_database" da
51d0: 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61  tabase.** and ca
51e0: 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  lls that connect
51f0: 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20  ion "db1".  The 
5200: 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63  second command c
5210: 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75  auses this.** su
5220: 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69  broutine to be i
5230: 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  nvoked..*/.stati
5240: 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28 76  c int DbObjCmd(v
5250: 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  oid *cd, Tcl_Int
5260: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
5270: 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63   objc,Tcl_Obj *c
5280: 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71  onst*objv){.  Sq
5290: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
52a0: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
52b0: 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74  nt choice;.  int
52c0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
52d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
52e0: 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b  r *DB_strs[] = {
52f0: 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72  .    "authorizer
5300: 22 2c 20 20 20 20 20 20 20 20 20 22 62 75 73 79  ",         "busy
5310: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5320: 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22 63 68  "cache",.    "ch
5330: 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20  anges",         
5340: 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20     "close",     
5350: 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 65          "collate
5360: 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f  ",.    "collatio
5370: 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22 63 6f  n_needed",   "co
5380: 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  mmit_hook",     
5390: 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a 20 20    "complete",.  
53a0: 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20    "copy",       
53b0: 20 20 20 20 20 20 20 20 22 65 72 72 6f 72 63 6f          "errorco
53c0: 64 65 22 2c 20 20 20 20 20 20 20 20 20 22 65 76  de",         "ev
53d0: 61 6c 22 2c 0a 20 20 20 20 22 65 78 69 73 74 73  al",.    "exists
53e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
53f0: 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
5400: 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74      "last_insert
5410: 5f 72 6f 77 69 64 22 2c 0a 20 20 20 20 22 6e 75  _rowid",.    "nu
5420: 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20  llvalue",       
5430: 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20     "onecolumn", 
5440: 20 20 20 20 20 20 20 20 22 70 72 6f 66 69 6c 65          "profile
5450: 22 2c 0a 20 20 20 20 22 70 72 6f 67 72 65 73 73  ",.    "progress
5460: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 72 65  ",           "re
5470: 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  key",           
5480: 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b    "rollback_hook
5490: 22 2c 0a 20 20 20 20 22 74 69 6d 65 6f 75 74 22  ",.    "timeout"
54a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 74 6f  ,            "to
54b0: 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20 20  tal_changes",   
54c0: 20 20 22 74 72 61 63 65 22 2c 0a 20 20 20 20 22    "trace",.    "
54d0: 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20  transaction",   
54e0: 20 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f       "update_hoo
54f0: 6b 22 2c 20 20 20 20 20 20 20 22 76 65 72 73 69  k",       "versi
5500: 6f 6e 22 2c 0a 20 20 20 20 30 20 20 20 20 20 20  on",.    0      
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
5520: 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e   };.  enum DB_en
5530: 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54 48  um {.    DB_AUTH
5540: 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20 44  ORIZER,        D
5550: 42 5f 42 55 53 59 2c 20 20 20 20 20 20 20 20 20  B_BUSY,         
5560: 20 20 20 20 44 42 5f 43 41 43 48 45 2c 0a 20 20      DB_CACHE,.  
5570: 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20 20 20    DB_CHANGES,   
5580: 20 20 20 20 20 20 20 20 44 42 5f 43 4c 4f 53 45          DB_CLOSE
5590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  ,            DB_
55a0: 43 4f 4c 4c 41 54 45 2c 0a 20 20 20 20 44 42 5f  COLLATE,.    DB_
55b0: 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  COLLATION_NEEDED
55c0: 2c 20 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f  ,  DB_COMMIT_HOO
55d0: 4b 2c 20 20 20 20 20 20 44 42 5f 43 4f 4d 50 4c  K,      DB_COMPL
55e0: 45 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 50 59  ETE,.    DB_COPY
55f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44  ,              D
5600: 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20 20 20 20  B_ERRORCODE,    
5610: 20 20 20 20 44 42 5f 45 56 41 4c 2c 0a 20 20 20      DB_EVAL,.   
5620: 20 44 42 5f 45 58 49 53 54 53 2c 20 20 20 20 20   DB_EXISTS,     
5630: 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43 54 49         DB_FUNCTI
5640: 4f 4e 2c 20 20 20 20 20 20 20 20 20 44 42 5f 4c  ON,         DB_L
5650: 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
5660: 2c 0a 20 20 20 20 44 42 5f 4e 55 4c 4c 56 41 4c  ,.    DB_NULLVAL
5670: 55 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 4f  UE,         DB_O
5680: 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20  NECOLUMN,       
5690: 20 44 42 5f 50 52 4f 46 49 4c 45 2c 0a 20 20 20   DB_PROFILE,.   
56a0: 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20   DB_PROGRESS,   
56b0: 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c         DB_REKEY,
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52              DB_R
56d0: 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a 20 20  OLLBACK_HOOK,.  
56e0: 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20    DB_TIMEOUT,   
56f0: 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c          DB_TOTAL
5700: 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 44 42 5f  _CHANGES,    DB_
5710: 54 52 41 43 45 2c 0a 20 20 20 20 44 42 5f 54 52  TRACE,.    DB_TR
5720: 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20 20  ANSACTION,      
5730: 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c   DB_UPDATE_HOOK,
5740: 20 20 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e        DB_VERSION
5750: 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74  .  };.  /* don't
5760: 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20   leave trailing 
5770: 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75  commas on DB_enu
5780: 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74  m, it confuses t
5790: 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69  he AIX xlc compi
57a0: 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ler */..  if( ob
57b0: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
57c0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
57d0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
57e0: 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b  UBCOMMAND ...");
57f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5800: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
5810: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
5820: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
5830: 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22  v[1], DB_strs, "
5840: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f  option", 0, &cho
5850: 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ice) ){.    retu
5860: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5870: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e  }..  switch( (en
5880: 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63  um DB_enum)choic
5890: 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64  e ){..  /*    $d
58a0: 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41  b authorizer ?CA
58b0: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
58c0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
58d0: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  en callback to a
58e0: 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51  uthorize each SQ
58f0: 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69  L operation as i
5900: 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c  t is.  ** compil
5910: 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73  ed.  5 arguments
5920: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
5930: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65   the callback be
5940: 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  fore it is.  ** 
5950: 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20  invoked:.  **.  
5960: 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74  **   (1) The aut
5970: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20  horization type 
5980: 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41  (ex: SQLITE_CREA
5990: 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45  TE_TABLE, SQLITE
59a0: 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20  _INSERT, ...).  
59b0: 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64  **   (2) First d
59c0: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20  escriptive name 
59d0: 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68  (depends on auth
59e0: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a  orization type).
59f0: 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e    **   (3) Secon
5a00: 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  d descriptive na
5a10: 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61  me.  **   (4) Na
5a20: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
5a30: 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20  se (ex: "main", 
5a40: 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28  "temp").  **   (
5a50: 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  5) Name of trigg
5a60: 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67  er that is doing
5a70: 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a   the access.  **
5a80: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  .  ** The callba
5a90: 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ck should return
5aa0: 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f   on of the follo
5ab0: 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51  wing strings: SQ
5ac0: 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51  LITE_OK,.  ** SQ
5ad0: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20  LITE_IGNORE, or 
5ae0: 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e  SQLITE_DENY.  An
5af0: 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
5b00: 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72  alue is an error
5b10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
5b20: 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e  his method is in
5b30: 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72  voked with no ar
5b40: 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72  guments, the cur
5b50: 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69  rent authorizati
5b60: 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  on.  ** callback
5b70: 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
5b80: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
5b90: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20   DB_AUTHORIZER: 
5ba0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
5bb0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5bc0: 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ON.    Tcl_Appen
5bd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5be0: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e  "authorization n
5bf0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
5c00: 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b  this build", 0);
5c10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5c20: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
5c30: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
5c40: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
5c50: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
5c60: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
5c70: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
5c80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5c90: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
5ca0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
5cb0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
5cc0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
5cd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5ce0: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a  pDb->zAuth, 0);.
5cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5d00: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
5d10: 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20  Auth;.      int 
5d20: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
5d30: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
5d40: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
5d50: 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20  b->zAuth);.     
5d60: 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d   }.      zAuth =
5d70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
5d80: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
5d90: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
5da0: 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29  zAuth && len>0 )
5db0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
5dc0: 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Auth = Tcl_Alloc
5dd0: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
5de0: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
5df0: 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 29 3b 0a  >zAuth, zAuth);.
5e00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5e10: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
5e20: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
5e30: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
5e40: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  h ){.        pDb
5e50: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
5e60: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
5e70: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
5e80: 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f  r(pDb->db, auth_
5e90: 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a  callback, pDb);.
5ea0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
5ec0: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
5ed0: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
5ee0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
5ef0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
5f00: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73  .  /*    $db bus
5f10: 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  y ?CALLBACK?.  *
5f20: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
5f30: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
5f40: 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   if an SQL state
5f50: 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f  ment attempts to
5f60: 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63   open.  ** a loc
5f70: 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ked database fil
5f80: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
5f90: 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66  B_BUSY: {.    if
5fa0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
5fb0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
5fc0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
5fd0: 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b  jv, "CALLBACK");
5fe0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
5ff0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
6000: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
6010: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
6020: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
6030: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6040: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
6050: 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20  zBusy, 0);.     
6060: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6070: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b      char *zBusy;
6080: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
6090: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
60a0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
60b0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
60c0: 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  usy);.      }.  
60d0: 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f      zBusy = Tcl_
60e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
60f0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
6100: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79  .      if( zBusy
6110: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
6120: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
6130: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
6140: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
6150: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 42 75 73  strcpy(pDb->zBus
6160: 79 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  y, zBusy);.     
6170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6180: 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a  pDb->zBusy = 0;.
6190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
61a0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
61b0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
61c0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
61d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
61e0: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
61f0: 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65  db, DbBusyHandle
6200: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
6210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6220: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
6230: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
6240: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6250: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6260: 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61  .  /*     $db ca
6270: 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20  che flush.  **  
6280: 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a     $db cache siz
6290: 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c  e n.  **.  ** Fl
62a0: 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64  ush the prepared
62b0: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65   statement cache
62c0: 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78  , or set the max
62d0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
62e0: 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65   ** cached state
62f0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  ments..  */.  ca
6300: 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20  se DB_CACHE: {. 
6310: 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b     char *subCmd;
6320: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20  .    int n;..   
6330: 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a   if( objc<=2 ){.
6340: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6350: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
6360: 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f  , objv, "cache o
6370: 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20  ption ?arg?");. 
6380: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6390: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
63a0: 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65   subCmd = Tcl_Ge
63b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20  tStringFromObj( 
63c0: 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20  objv[2], 0 );.  
63d0: 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27    if( *subCmd=='
63e0: 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62  f' && strcmp(sub
63f0: 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20  Cmd,"flush")==0 
6400: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
6410: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
6420: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6430: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
6440: 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20  , "flush");.    
6450: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6460: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
6470: 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  e{.        flush
6480: 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
6490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
64a0: 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d  lse if( *subCmd=
64b0: 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73  ='s' && strcmp(s
64c0: 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30  ubCmd,"size")==0
64d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
64e0: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  jc!=4 ){.       
64f0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
6500: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
6510: 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20  v, "size n");.  
6520: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6530: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
6540: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
6550: 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f   TCL_ERROR==Tcl_
6560: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
6570: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
6580: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
6590: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
65a0: 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  ( interp, "canno
65b0: 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a  t convert \"", .
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
65d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
65e0: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20  Obj(objv[3],0), 
65f0: 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c  "\" to integer",
6600: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   0);.          r
6610: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6620: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6630: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c            if( n<
6640: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6650: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
6660: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20   pDb );.        
6670: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
6680: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
6690: 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54  >MAX_PREPARED_ST
66a0: 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MTS ){.         
66b0: 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41     n = MAX_PREPA
66c0: 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20  RED_STMTS;.     
66d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
66e0: 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20   pDb->maxStmt = 
66f0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
6700: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
6710: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
6720: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
6730: 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c  "bad option \"",
6740: 20 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f   .          Tcl_
6750: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
6760: 28 6f 62 6a 76 5b 30 5d 2c 30 29 2c 20 22 5c 22  (objv[0],0), "\"
6770: 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20  : must be flush 
6780: 6f 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20  or size", 0);.  
6790: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
67a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
67b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
67c0: 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73       $db changes
67d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
67e0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
67f0: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
6800: 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
6810: 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79  d, or deleted by
6820: 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72  .  ** the most r
6830: 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50  ecent INSERT, UP
6840: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
6850: 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e  tatement, not in
6860: 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e  cluding .  ** an
6870: 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  y changes made b
6880: 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
6890: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ms..  */.  case 
68a0: 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  DB_CHANGES: {.  
68b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
68c0: 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
68d0: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
68e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
68f0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
6900: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6910: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6920: 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
6930: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
6940: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
6950: 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
6960: 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ult, sqlite3_cha
6970: 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
6980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6990: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73    /*    $db clos
69a0: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74  e.  **.  ** Shut
69b0: 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73  down the databas
69c0: 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  e.  */.  case DB
69d0: 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63  _CLOSE: {.    Tc
69e0: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28  l_DeleteCommand(
69f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
6a00: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
6a10: 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62  v[0], 0));.    b
6a20: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
6a30: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
6a40: 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54  late NAME SCRIPT
6a50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
6a60: 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c  e a new SQL coll
6a70: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63  ation function c
6a80: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
6a90: 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  never.  ** that 
6aa0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6ab0: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
6ac0: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
6ad0: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
6ae0: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41  .  case DB_COLLA
6af0: 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c  TE: {.    SqlCol
6b00: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a  late *pCollate;.
6b10: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
6b20: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69  .    char *zScri
6b30: 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72  pt;.    int nScr
6b40: 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ipt;.    if( obj
6b50: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
6b60: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6b70: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
6b80: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
6b90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6ba0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6bb0: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
6bc0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
6bd0: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
6be0: 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65  zScript = Tcl_Ge
6bf0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
6c00: 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74  bjv[3], &nScript
6c10: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20  );.    pCollate 
6c20: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54  = (SqlCollate*)T
6c30: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
6c40: 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53  (*pCollate) + nS
6c50: 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20  cript + 1 );.   
6c60: 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30   if( pCollate==0
6c70: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
6c80: 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ROR;.    pCollat
6c90: 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  e->interp = inte
6ca0: 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  rp;.    pCollate
6cb0: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
6cc0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f  Collate;.    pCo
6cd0: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d  llate->zScript =
6ce0: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74   (char*)&pCollat
6cf0: 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70  e[1];.    pDb->p
6d00: 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61  Collate = pColla
6d10: 74 65 3b 0a 20 20 20 20 73 74 72 63 70 79 28 70  te;.    strcpy(p
6d20: 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74  Collate->zScript
6d30: 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20  , zScript);.    
6d40: 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61  if( sqlite3_crea
6d50: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62  te_collation(pDb
6d60: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  ->db, zName, SQL
6d70: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
6d80: 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c     pCollate, tcl
6d90: 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  SqlCollate) ){. 
6da0: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
6db0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
6dc0: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
6dd0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
6de0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20  VOLATILE);.     
6df0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6e00: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
6e10: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
6e20: 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61  **     $db colla
6e30: 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49  tion_needed SCRI
6e40: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
6e50: 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f  ate a new SQL co
6e60: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
6e70: 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57   called NAME.  W
6e80: 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61  henever.  ** tha
6e90: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  t function is ca
6ea0: 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52  lled, invoke SCR
6eb0: 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20  IPT to evaluate 
6ec0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  the function..  
6ed0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c  */.  case DB_COL
6ee0: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b  LATION_NEEDED: {
6ef0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
6f00: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
6f10: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
6f20: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52  p, 2, objv, "SCR
6f30: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
6f40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6f50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62     }.    if( pDb
6f60: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
6f70: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65   ){.      Tcl_De
6f80: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
6f90: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
6fa0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e  .    }.    pDb->
6fb0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d  pCollateNeeded =
6fc0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
6fd0: 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  j(objv[2]);.    
6fe0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
6ff0: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
7000: 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  eded);.    sqlit
7010: 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
7020: 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62  ded(pDb->db, pDb
7030: 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64  , tclCollateNeed
7040: 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ed);.    break;.
7050: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
7060: 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41   commit_hook ?CA
7070: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
7080: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
7090: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74  en callback just
70a0: 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
70b0: 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61  ng every SQL tra
70c0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
70d0: 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74  f the callback t
70e0: 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
70f0: 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f  on or returns no
7100: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
7110: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
7120: 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49  n is aborted.  I
7130: 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e  f CALLBACK is an
7140: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
7150: 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a  he callback.  **
7160: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20   is disabled..  
7170: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d  */.  case DB_COM
7180: 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20  MIT_HOOK: {.    
7190: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
71a0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
71b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
71c0: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
71d0: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
71e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
71f0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
7200: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
7210: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
7220: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
7230: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7240: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30   pDb->zCommit, 0
7250: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
7270: 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20   *zCommit;.     
7280: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
7290: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
72a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
72b0: 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  Free(pDb->zCommi
72c0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
72d0: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f    zCommit = Tcl_
72e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
72f0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
7300: 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  .      if( zComm
7310: 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  it && len>0 ){. 
7320: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
7330: 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  mit = Tcl_Alloc(
7340: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
7350: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
7360: 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74  zCommit, zCommit
7370: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7380: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
7390: 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
73a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
73b0: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
73c0: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
73d0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
73e0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74    sqlite3_commit
73f0: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44  _hook(pDb->db, D
7400: 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20  bCommitHandler, 
7410: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
7420: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7430: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
7440: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
7450: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7460: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
7470: 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74  *    $db complet
7480: 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e SQL.  **.  ** 
7490: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53  Return TRUE if S
74a0: 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  QL is a complete
74b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
74c0: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
74d0: 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  .  ** additional
74e0: 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20   lines of input 
74f0: 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69  are needed.  Thi
7500: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
7510: 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69  the.  ** built-i
7520: 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65  n "info complete
7530: 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c  " command of Tcl
7540: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
7550: 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66  _COMPLETE: {.#if
7560: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7570: 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63  _COMPLETE.    Tc
7580: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
7590: 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65      int isComple
75a0: 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  te;.    if( objc
75b0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
75c0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
75d0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
75e0: 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74  SQL");.      ret
75f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7600: 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c     }.    isCompl
7610: 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ete = sqlite3_co
7620: 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53  mplete( Tcl_GetS
7630: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
7640: 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20  v[2], 0) );.    
7650: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
7660: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
7670: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42  p);.    Tcl_SetB
7680: 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c  ooleanObj(pResul
7690: 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a  t, isComplete);.
76a0: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
76b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
76c0: 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74  db copy conflict
76d0: 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65  -algorithm table
76e0: 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52   filename ?SEPAR
76f0: 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43  ATOR? ?NULLINDIC
7700: 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ATOR?.  **.  ** 
7710: 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74  Copy data into t
7720: 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61  able from filena
7730: 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75  me, optionally u
7740: 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20  sing SEPARATOR. 
7750: 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65   ** as column se
7760: 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20  parators.  If a 
7770: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
7780: 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f  a null string, o
7790: 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65  r the.  ** value
77a0: 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f   of NULLINDICATO
77b0: 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73  R, a NULL is ins
77c0: 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f  erted for the co
77d0: 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c  lumn..  ** confl
77e0: 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73  ict-algorithm is
77f0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69   one of the sqli
7800: 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  te conflict algo
7810: 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20  rithms:.  **    
7820: 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c  rollback, abort,
7830: 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72   fail, ignore, r
7840: 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73  eplace.  ** On s
7850: 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74  uccess, return t
7860: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  he number of lin
7870: 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f  es processed, no
7880: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61  t necessarily sa
7890: 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63  me.  ** as 'db c
78a0: 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63  hanges' due to c
78b0: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
78c0: 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a  m selected..  **
78d0: 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  .  ** This code 
78e0: 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20  is basically an 
78f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65  implementation/e
7900: 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20  nhancement of.  
7910: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73  ** the sqlite3 s
7920: 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22  hell.c ".import"
7930: 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20   command..  **. 
7940: 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64   ** This command
7950: 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61   usage is equiva
7960: 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69  lent to the sqli
7970: 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65  te2.x COPY state
7980: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68  ment,.  ** which
7990: 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61   imports file da
79a0: 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ta into a table 
79b0: 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72  using the Postgr
79c0: 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66  eSQL COPY file f
79d0: 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64  ormat:.  **   $d
79e0: 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f  b copy $conflit_
79f0: 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65  algo $table_name
7a00: 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c   $filename \t \\
7a10: 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  N.  */.  case DB
7a20: 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61  _COPY: {.    cha
7a30: 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20  r *zTable;      
7a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
7a50: 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  rt data into thi
7a60: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  s table */.    c
7a70: 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20  har *zFile;     
7a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7a90: 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63  e file from whic
7aa0: 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74  h to extract dat
7ab0: 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  a */.    char *z
7ac0: 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20  Conflict;       
7ad0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
7ae0: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74  lict algorithm t
7af0: 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c  o use */.    sql
7b00: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
7b10: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74  ;        /* A st
7b20: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
7b30: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7b50: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20  sult code */.   
7b60: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b80: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
7b90: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
7ba0: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  /.    int nByte;
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7bd0: 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73  ytes in an SQL s
7be0: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  tring */.    int
7bf0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
7c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7c10: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20   counters */.   
7c20: 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20   int nSep;      
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c40: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7c50: 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20  in zSep[] */.   
7c60: 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20   int nNull;     
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c80: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7c90: 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20  in zNull[] */.  
7ca0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7cc0: 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
7cd0: 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  t */.    char *z
7ce0: 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Line;           
7cf0: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
7d00: 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66   line of input f
7d10: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  rom the file */.
7d20: 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
7d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d40: 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65  /* zLine[] broke
7d50: 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e  n up into column
7d60: 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  s */.    char *z
7d70: 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20  Commit;         
7d80: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63       /* How to c
7d90: 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f  ommit changes */
7da0: 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  .    FILE *in;  
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69   /* The input fi
7dd0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69  le */.    int li
7de0: 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  neno = 0;       
7df0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
7e00: 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69  mber of input fi
7e10: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a  le */.    char z
7e20: 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20  LineNum[80];    
7e30: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
7e40: 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65  mber print buffe
7e50: 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  r */.    Tcl_Obj
7e60: 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20   *pResult;      
7e70: 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72       /* interp r
7e80: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68  esult */..    ch
7e90: 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68  ar *zSep;.    ch
7ea0: 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69  ar *zNull;.    i
7eb0: 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a  f( objc<5 || obj
7ec0: 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>7 ){.      Tcl
7ed0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
7ee0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a  terp, 2, objv, .
7ef0: 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49           "CONFLI
7f00: 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42  CT-ALGORITHM TAB
7f10: 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50  LE FILENAME ?SEP
7f20: 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44  ARATOR? ?NULLIND
7f30: 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20  ICATOR?");.     
7f40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7f50: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
7f60: 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20   objc>=6 ){.    
7f70: 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74    zSep = Tcl_Get
7f80: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
7f90: 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[5], 0);.    }
7fa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70  else{.      zSep
7fb0: 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20   = "\t";.    }. 
7fc0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29     if( objc>=7 )
7fd0: 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20  {.      zNull = 
7fe0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7ff0: 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29  mObj(objv[6], 0)
8000: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8010: 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20     zNull = "";. 
8020: 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69     }.    zConfli
8030: 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ct = Tcl_GetStri
8040: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
8050: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c  ], 0);.    zTabl
8060: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
8070: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
8080: 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  , 0);.    zFile 
8090: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
80a0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20  romObj(objv[4], 
80b0: 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73  0);.    nSep = s
80c0: 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20 20  trlen(zSep);.   
80d0: 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 28   nNull = strlen(
80e0: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  zNull);.    if( 
80f0: 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
8100: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8110: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8120: 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72  : non-null separ
8130: 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f  ator required fo
8140: 72 20 63 6f 70 79 22 2c 20 30 29 3b 0a 20 20 20  r copy", 0);.   
8150: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8160: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
8170: 66 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  f(sqlite3StrICmp
8180: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c  (zConflict, "rol
8190: 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a  lback") != 0 &&.
81a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
81b0: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
81c0: 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20   "abort"   ) != 
81d0: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
81e0: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
81f0: 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20  lict, "fail"    
8200: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
8210: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8220: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f  zConflict, "igno
8230: 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20  re"  ) != 0 &&. 
8240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
8250: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
8260: 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30  "replace" ) != 0
8270: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
8280: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8290: 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c  rp, "Error: \"",
82a0: 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20   zConflict, .   
82b0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
82c0: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
82d0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
82e0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
82f0: 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
8300: 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
8310: 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a  r replace", 0);.
8320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8330: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8340: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
8350: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
8360: 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
8370: 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
8380: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
8390: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
83a0: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
83b0: 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  : no such table:
83c0: 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a   ", zTable, 0);.
83d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
83e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
83f0: 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e    nByte = strlen
8400: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
8410: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
8420: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
8430: 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  0, &pStmt, 0);. 
8440: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8450: 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
8460: 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
8470: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8480: 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
8490: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
84a0: 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
84b0: 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
84c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f  }else{.      nCo
84d0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
84e0: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
84f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8500: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
8510: 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c  t);.    if( nCol
8520: 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65  ==0 ) {.      re
8530: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8540: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
8550: 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b   malloc( nByte +
8560: 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a   50 + nCol*2 );.
8570: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
8580: 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  ) {.      Tcl_Ap
8590: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
85a0: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74  p, "Error: can't
85b0: 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a   malloc()", 0);.
85c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
85d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
85e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
85f0: 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71  tf(nByte+50, zSq
8600: 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71  l, "INSERT OR %q
8610: 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45   INTO '%q' VALUE
8620: 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  S(?",.         z
8630: 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65  Conflict, zTable
8640: 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65  );.    j = strle
8650: 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72  n(zSql);.    for
8660: 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=1; i<nCol; i+
8670: 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  +){.      zSql[j
8680: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
8690: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27   zSql[j++] = '?'
86a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
86b0: 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [j++] = ')';.   
86c0: 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zSql[j] = 0;.  
86d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
86e0: 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20  repare(pDb->db, 
86f0: 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c  zSql, 0, &pStmt,
8700: 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53   0);.    free(zS
8710: 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
8720: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
8730: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8740: 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  , "Error: ", sql
8750: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
8760: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
8770: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
8780: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
8790: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
87a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20  .    }.    in = 
87b0: 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62  fopen(zFile, "rb
87c0: 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d  ");.    if( in==
87d0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
87e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
87f0: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rp, "Error: cann
8800: 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c  ot open file: ",
8810: 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20   zFile, NULL);. 
8820: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
8830: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
8840: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8850: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8860: 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20  azCol = malloc( 
8870: 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29  sizeof(azCol[0])
8880: 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20  *(nCol+1) );.   
8890: 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
88a0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
88b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
88c0: 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d   "Error: can't m
88d0: 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20  alloc()", 0);.  
88e0: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
88f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8900: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8910: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
8920: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42  exec(pDb->db, "B
8930: 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  EGIN", 0, 0, 0);
8940: 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22  .    zCommit = "
8950: 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69  COMMIT";.    whi
8960: 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63  le( (zLine = loc
8970: 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e  al_getline(0, in
8980: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ))!=0 ){.      c
8990: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20  har *z;.      i 
89a0: 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e  = 0;.      linen
89b0: 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c  o++;.      azCol
89c0: 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20  [0] = zLine;.   
89d0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c     for(i=0, z=zL
89e0: 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ine; *z; z++){. 
89f0: 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a         if( *z==z
8a00: 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d  Sep[0] && strncm
8a10: 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29  p(z, zSep, nSep)
8a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8a30: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   *z = 0;.       
8a40: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
8a50: 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a    if( i<nCol ){.
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f              azCo
8a70: 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b  l[i] = &z[nSep];
8a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
8a90: 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20  = nSep-1;.      
8aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8ac0: 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20  ( i+1!=nCol ){. 
8ad0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
8ae0: 72 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  r;.        zErr 
8af0: 3d 20 6d 61 6c 6c 6f 63 28 32 30 30 20 2b 20 73  = malloc(200 + s
8b00: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 29 3b 0a 20  trlen(zFile));. 
8b10: 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20         if( zErr 
8b20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 72  ){.          spr
8b30: 69 6e 74 66 28 7a 45 72 72 2c 0a 20 20 20 20 20  intf(zErr,.     
8b40: 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20          "Error: 
8b50: 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70 65  %s line %d: expe
8b60: 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
8b70: 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75 6e  of data but foun
8b80: 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
8b90: 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e      zFile, linen
8ba0: 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  o, nCol, i+1);. 
8bb0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
8bc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8bd0: 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20  , zErr, 0);.    
8be0: 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29        free(zErr)
8bf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8c00: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52      zCommit = "R
8c10: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
8c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8c30: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8c40: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
8c50: 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66        /* check f
8c60: 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66  or null data, if
8c70: 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c   so, bind as nul
8c80: 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20  l */.        if 
8c90: 28 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72  ((nNull>0 && str
8ca0: 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e  cmp(azCol[i], zN
8cb0: 75 6c 6c 29 3d 3d 30 29 20 7c 7c 20 73 74 72 6c  ull)==0) || strl
8cc0: 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 29  en(azCol[i])==0)
8cd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
8ce0: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
8cf0: 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20  Stmt, i+1);.    
8d00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
8d20: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b  d_text(pStmt, i+
8d30: 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c  1, azCol[i], -1,
8d40: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
8d50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8d70: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
8d80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8d90: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
8da0: 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29       free(zLine)
8db0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
8dc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8dd0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
8de0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
8df0: 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
8e00: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
8e10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f   0);.        zCo
8e20: 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
8e30: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
8e40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8e50: 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b      free(azCol);
8e60: 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
8e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
8e80: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
8e90: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
8ea0: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43  exec(pDb->db, zC
8eb0: 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ommit, 0, 0, 0);
8ec0: 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69  ..    if( zCommi
8ed0: 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20  t[0] == 'C' ){. 
8ee0: 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c       /* success,
8ef0: 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e   set result as n
8f00: 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70  umber of lines p
8f10: 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
8f20: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
8f30: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
8f40: 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  erp);.      Tcl_
8f50: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
8f60: 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  t, lineno);.    
8f70: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
8f80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8f90: 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65  /* failure, appe
8fa0: 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20  nd lineno where 
8fb0: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
8fc0: 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 4e 75 6d  sprintf(zLineNum
8fd0: 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20  ,"%d",lineno);. 
8fe0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
8ff0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20  esult(interp,", 
9000: 66 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f  failed while pro
9010: 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c  cessing line: ",
9020: 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20  zLineNum,0);.   
9030: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
9040: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
9050: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
9060: 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63  **    $db errorc
9070: 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ode.  **.  ** Re
9080: 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63  turn the numeric
9090: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
90a0: 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79   was returned by
90b0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
90c0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
90d0: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20  lite3_exec()..  
90e0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52  */.  case DB_ERR
90f0: 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63  ORCODE: {.    Tc
9100: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
9110: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
9120: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  tObj(sqlite3_err
9130: 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b  code(pDb->db)));
9140: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
9150: 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20     .  /*.  **   
9160: 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f   $db eval $sql ?
9170: 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f  array? ?{  ...co
9180: 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20  de... }?.  **   
9190: 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24   $db onecolumn $
91a0: 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  sql.  **.  ** Th
91b0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
91c0: 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75  in $sql is evalu
91d0: 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20  ated.  For each 
91e0: 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20  row, the values 
91f0: 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20  are.  ** placed 
9200: 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  in elements of t
9210: 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22  he array named "
9220: 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f  array" and ...co
9230: 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65  de... is execute
9240: 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
9250: 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72  y" and "code" ar
9260: 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  e omitted, then 
9270: 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65  no callback is e
9280: 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20  very invoked..  
9290: 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73  ** If "array" is
92a0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
92b0: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
92c0: 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20  s are placed in 
92d0: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74  variables.  ** t
92e0: 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  hat have the sam
92f0: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69  e name as the fi
9300: 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62  elds extracted b
9310: 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  y the query..  *
9320: 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f  *.  ** The oneco
9330: 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74  lumn method is t
9340: 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  he equivalent of
9350: 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65  :.  **     linde
9360: 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c  x [$db eval $sql
9370: 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ] 0.  */.  case 
9380: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20  DB_ONECOLUMN:.  
9390: 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20  case DB_EVAL:.  
93a0: 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20  case DB_EXISTS: 
93b0: 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
93c0: 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20   *zSql;      /* 
93d0: 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  Next SQL stateme
93e0: 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f  nt to execute */
93f0: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
9400: 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57  *zLeft;     /* W
9410: 68 61 74 20 69 73 20 6c 65 66 74 20 61 66 74 65  hat is left afte
9420: 72 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20  r first stmt in 
9430: 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69  zSql */.    sqli
9440: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
9450: 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53     /* Compiled S
9460: 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20  QL statment */. 
9470: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72     Tcl_Obj *pArr
9480: 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ay;       /* Nam
9490: 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20  e of array into 
94a0: 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61 72  which results ar
94b0: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
94c0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
94d0: 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70  t;      /* Scrip
94e0: 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63  t to run for eac
94f0: 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  h result set */.
9500: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70      Tcl_Obj **ap
9510: 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61  Parm;      /* Pa
9520: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65  rameters that ne
9530: 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66  ed a Tcl_DecrRef
9540: 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69  Count() */.    i
9550: 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20  nt nParm;       
9560: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9570: 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65 64 20  of entries used 
9580: 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20  in apParm[] */. 
9590: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72     Tcl_Obj *aPar
95a0: 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61  m[10];    /* Sta
95b0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 70  tic space for ap
95c0: 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f  Parm[] in the co
95d0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
95e0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20   Tcl_Obj *pRet; 
95f0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
9600: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
9610: 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72  */.    SqlPrepar
9620: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
9630: 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ;  /* Pointer to
9640: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
9650: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
9660: 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63   rc2;..    if( c
9670: 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29  hoice==DB_EVAL )
9680: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
9690: 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a  <3 || objc>5 ){.
96a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
96b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
96c0: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f   2, objv, "SQL ?
96d0: 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52  ARRAY-NAME? ?SCR
96e0: 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20  IPT?");.        
96f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9710: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
9720: 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  j();.      Tcl_I
9730: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
9740: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9750: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
9760: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
9770: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
9780: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
9790: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  L");.        ret
97a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
97b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
97c0: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53   choice==DB_EXIS
97d0: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  TS ){.        pR
97e0: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  et = Tcl_NewBool
97f0: 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20  eanObj(0);.     
9800: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
9810: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
9820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9830: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
9840: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9850: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
9860: 20 70 41 72 72 61 79 20 3d 20 70 53 63 72 69 70   pArray = pScrip
9870: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
9880: 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
9890: 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 30        pArray = 0
98a0: 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  ;.      pScript 
98b0: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d  = objv[3];.    }
98c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72  else{.      pArr
98d0: 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  ay = objv[3];.  
98e0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53      if( Tcl_GetS
98f0: 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d  tring(pArray)[0]
9900: 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d 20 30  ==0 ) pArray = 0
9910: 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  ;.      pScript 
9920: 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d  = objv[4];.    }
9930: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
9940: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b  fCount(objv[2]);
9950: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  .    zSql = Tcl_
9960: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9970: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
9980: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c    while( rc==TCL
9990: 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29  _OK && zSql[0] )
99a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
99d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
99e0: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
99f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9a00: 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74   of bind paramet
9a10: 65 72 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74  ers in the pStmt
9a20: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   */.      int nC
9a30: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
9a40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9a50: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9a60: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
9a70: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61       Tcl_Obj **a
9a80: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20  pColName = 0;   
9a90: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
9aa0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  mn names */.    
9ab0: 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20    int len;      
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ad0: 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66  String length of
9ae0: 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20   zSql */.  .    
9af0: 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
9b00: 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74   a SQL statement
9b10: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
9b20: 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  y been compiled 
9b30: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69  and.      ** whi
9b40: 63 68 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ch matches the n
9b50: 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ext sequence of 
9b60: 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  SQL..      */.  
9b70: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
9b80: 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20       pPreStmt = 
9b90: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
9ba0: 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
9bb0: 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69  n(zSql);.      i
9bc0: 66 28 20 70 50 72 65 53 74 6d 74 20 26 26 20 73  f( pPreStmt && s
9bd0: 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70  qlite3_expired(p
9be0: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 20  PreStmt->pStmt) 
9bf0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  ){.        flush
9c00: 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a  StmtCache(pDb);.
9c10: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
9c20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
9c30: 20 20 20 20 66 6f 72 28 3b 20 70 50 72 65 53 74      for(; pPreSt
9c40: 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72  mt; pPreStmt=pPr
9c50: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  eStmt->pNext){. 
9c60: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70         int n = p
9c70: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20  PreStmt->nSql;. 
9c80: 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 3d         if( len>=
9c90: 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  n .            &
9ca0: 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d  & memcmp(pPreStm
9cb0: 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e  t->zSql, zSql, n
9cc0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
9cd0: 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20   && (zSql[n]==0 
9ce0: 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b  || zSql[n-1]==';
9cf0: 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ').        ){.  
9d00: 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20          pStmt = 
9d10: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b  pPreStmt->pStmt;
9d20: 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65 66 74  .          zLeft
9d30: 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d   = &zSql[pPreStm
9d40: 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20  t->nSql];..     
9d50: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70       /* When a p
9d60: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9d70: 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69  t is found, unli
9d80: 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20  nk it from the. 
9d90: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68           ** cach
9da0: 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  e list.  It will
9db0: 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20   later be added 
9dc0: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
9dd0: 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  nning.          
9de0: 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ** of the cache 
9df0: 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  list in order to
9e00: 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72   implement LRU r
9e10: 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20  eplacement..    
9e20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9e30: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
9e40: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
9e50: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
9e60: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
9e70: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
9e80: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62  .            pDb
9ea0: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
9eb0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
9ec0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ed0: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
9ee0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
9ef0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
9f00: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
9f10: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b  pPreStmt->pPrev;
9f20: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
9f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
9f40: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50  b->stmtLast = pP
9f50: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20  reStmt->pPrev;. 
9f60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9f70: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d       pDb->nStmt-
9f80: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  -;.          bre
9f90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
9fa0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
9fb0: 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64  * If no prepared
9fc0: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66   statement was f
9fd0: 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20 74  ound.  Compile t
9fe0: 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20 20 20  he SQL text.    
9ff0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
a000: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
a010: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
a020: 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  !=sqlite3_prepar
a030: 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
a040: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c   -1, &pStmt, &zL
a050: 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eft) ){.        
a060: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
a070: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
a080: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  tToObj(sqlite3_e
a090: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29  rrmsg(pDb->db)))
a0a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
a0b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a0c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a0e0: 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  f( pStmt==0 ){. 
a0f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c           if( SQL
a100: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
a110: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
a120: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a130: 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  /* A compile-tim
a140: 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73  e error in the s
a150: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20  tatement.       
a160: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a170: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
a180: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54  sult(interp, dbT
a190: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
a1a0: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
a1b0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
a1c0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a1e0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
a1f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
a200: 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  /* The statement
a210: 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43   was a no-op.  C
a220: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e  ontinue to the n
a230: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ext statement.  
a240: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
a250: 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a  the SQL string..
a260: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
a270: 20 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20             zSql 
a280: 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  = zLeft;.       
a290: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a2a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a2b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
a2c0: 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d 30  ert( pPreStmt==0
a2d0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
a2e0: 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65     /* Bind value
a2f0: 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20  s to parameters 
a300: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
a310: 24 20 6f 72 20 3a 0a 20 20 20 20 20 20 2a 2f 20  $ or :.      */ 
a320: 20 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73   .      nVar = s
a330: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
a340: 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d  meter_count(pStm
a350: 74 29 3b 0a 20 20 20 20 20 20 6e 50 61 72 6d 20  t);.      nParm 
a360: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  = 0;.      if( n
a370: 56 61 72 3e 73 69 7a 65 6f 66 28 61 50 61 72 6d  Var>sizeof(aParm
a380: 29 2f 73 69 7a 65 6f 66 28 61 50 61 72 6d 5b 30  )/sizeof(aParm[0
a390: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  ]) ){.        ap
a3a0: 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a  Parm = (Tcl_Obj*
a3b0: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61 72  *)Tcl_Alloc(nVar
a3c0: 2a 73 69 7a 65 6f 66 28 61 70 50 61 72 6d 5b 30  *sizeof(apParm[0
a3d0: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
a3e0: 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d  {.        apParm
a3f0: 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20 20 20 20   = aParm;.      
a400: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  }.      for(i=1;
a410: 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a   i<=nVar; i++){.
a420: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a430: 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74  ar *zVar = sqlit
a440: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
a450: 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  r_name(pStmt, i)
a460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 56  ;.        if( zV
a470: 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30  ar!=0 && (zVar[0
a480: 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30  ]=='$' || zVar[0
a490: 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20 20 20 20 20  ]==':') ){.     
a4a0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
a4b0: 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32  ar = Tcl_GetVar2
a4c0: 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72  Ex(interp, &zVar
a4d0: 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  [1], 0, 0);.    
a4e0: 20 20 20 20 20 20 69 66 28 20 70 56 61 72 20 29        if( pVar )
a4f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
a500: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t n;.           
a510: 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20   u8 *data;.     
a520: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 79         char *zTy
a530: 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65 50  pe = pVar->typeP
a540: 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50  tr ? pVar->typeP
a550: 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20  tr->name : "";. 
a560: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
a570: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
a580: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
a590: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
a5a0: 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22  Type,"bytearray"
a5b0: 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79  )==0 && pVar->by
a5c0: 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tes==0 ){.      
a5d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
a5e0: 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65  load a BLOB type
a5f0: 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69   if the Tcl vari
a600: 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72  able is a bytear
a610: 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ray and.        
a620: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20        ** has no 
a630: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
a640: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
a650: 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54          data = T
a660: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
a670: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
a680: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a690: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
a6a0: 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61  b(pStmt, i, data
a6b0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
a6c0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
a6d0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
a6e0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
a6f0: 20 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b           apParm[
a700: 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b  nParm++] = pVar;
a710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
a720: 73 65 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26  se if( (c=='b' &
a730: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
a740: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29 20 7c 7c  boolean")==0) ||
a750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a760: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
a770: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
a780: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
a790: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e         Tcl_GetIn
a7a0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
a7b0: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
a7c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a7d0: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
a7e0: 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , i, n);.       
a7f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
a800: 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28  =='d' && strcmp(
a810: 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d  zType,"double")=
a820: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a830: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
a840: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
a850: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
a860: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26  (interp, pVar, &
a870: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
a880: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
a890: 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20  ouble(pStmt, i, 
a8a0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
a8b0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 77 27  }else if( c=='w'
a8c0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
a8d0: 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 20 29  ,"wideInt")==0 )
a8e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a8f0: 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20  Tcl_WideInt v;. 
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
a910: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
a920: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
a930: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
a940: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
a950: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c  _int64(pStmt, i,
a960: 20 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   v);.           
a970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a980: 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e        data = (un
a990: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63  signed char *)Tc
a9a0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a9b0: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a9d0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
a9e0: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
a9f0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
aa00: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
aa10: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
aa20: 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20  efCount(pVar);. 
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50               apP
aa40: 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70  arm[nParm++] = p
aa50: 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Var;.           
aa60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
aa70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
aa80: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
aa90: 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a 20  l( pStmt, i );. 
aaa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aab0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
aac0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63      /* Compute c
aad0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
aae0: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
aaf0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
ab00: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
ab10: 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20  f( pScript ){.  
ab20: 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20        apColName 
ab30: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c  = (Tcl_Obj**)Tcl
ab40: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  _Alloc( sizeof(T
ab50: 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b  cl_Obj*)*nCol );
ab60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 43  .        if( apC
ab70: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61  olName==0 ) brea
ab80: 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  k;.        for(i
ab90: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
aba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 6f  {.          apCo
abb0: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78  lName[i] = dbTex
abc0: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  tToObj(sqlite3_c
abd0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
abe0: 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,i));.          
abf0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
ac00: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
ac10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ac20: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  }..      /* If r
ac30: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
ac40: 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72   stored in an ar
ac50: 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68  ray variable, th
ac60: 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 20 20  en create.      
ac70: 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20  ** the array(*) 
ac80: 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61  entry for that a
ac90: 72 72 61 79 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rray.      */.  
aca0: 20 20 20 20 69 66 28 20 70 41 72 72 61 79 20 29      if( pArray )
acb0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  {.        Tcl_Ob
acc0: 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63  j *pColList = Tc
acd0: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
ace0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74      Tcl_Obj *pSt
acf0: 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  ar = Tcl_NewStri
ad00: 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a  ngObj("*", -1);.
ad10: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
ad20: 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73  RefCount(pColLis
ad30: 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t);.        for(
ad40: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
ad50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
ad60: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ad70: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43  ement(interp, pC
ad80: 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d  olList, apColNam
ad90: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  e[i]);.        }
ada0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
adb0: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
adc0: 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70  pArray, pStar, p
add0: 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20  ColList,0);.    
ade0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
adf0: 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a  ount(pColList);.
ae00: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
ae10: 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b  RefCount(pStar);
ae20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ae30: 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 53  /* Execute the S
ae40: 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  QL.      */.    
ae50: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c    while( rc==TCL
ae60: 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20 26 26 20  _OK && pStmt && 
ae70: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
ae80: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
ae90: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
aea0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
aeb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
aec0: 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  Obj *pVal;.     
aed0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
aee0: 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63  /* Set pVal to c
aef0: 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20  ontain the i'th 
af00: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72  column of this r
af10: 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ow. */.         
af20: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
af30: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
af40: 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  mt, i) ){.      
af50: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
af60: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
af70: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
af80: 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
af90: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
afa0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
afb0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
afc0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c  ByteArrayObj(sql
afd0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
afe0: 28 70 53 74 6d 74 2c 20 69 29 2c 20 62 79 74 65  (pStmt, i), byte
aff0: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
b000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b020: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b030: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
b040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69          sqlite_i
b050: 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33  nt64 v = sqlite3
b060: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
b070: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
b080: 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32         if( v>=-2
b090: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
b0a0: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
b0c0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  al = Tcl_NewIntO
b0d0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
b0e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
b100: 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
b110: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20  tObj(v);.       
b120: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b130: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b140: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b150: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
b160: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
b170: 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c             doubl
b180: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  e r = sqlite3_co
b190: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
b1a0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
b1b0: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
b1c0: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b  NewDoubleObj(r);
b1d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
b1e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b1f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b200: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
b210: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
b220: 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54    pVal = dbTextT
b230: 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  oObj(pDb->zNull)
b240: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b250: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b260: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b270: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b280: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
b290: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 28 63 68   dbTextToObj((ch
b2a0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
b2b0: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
b2c0: 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i));.           
b2d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b2f0: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
b300: 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a   if( pScript ){.
b310: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b320: 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20  pArray==0 ){.   
b330: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f             Tcl_O
b340: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
b350: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
b360: 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  0, pVal, 0);.   
b370: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
b390: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
b3a0: 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43  erp, pArray, apC
b3b0: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c  olName[i], pVal,
b3c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b3d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
b3e0: 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44  se if( choice==D
b3f0: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20  B_ONECOLUMN ){. 
b400: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
b410: 74 28 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20 20  t( pRet==0 );.  
b420: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
b430: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
b440: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 56         pRet = pV
b450: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
b460: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
b470: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
b480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b490: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45      rc = TCL_BRE
b4a0: 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AK;.            
b4b0: 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  i = nCol;.      
b4c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68      }else if( ch
b4d0: 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20  oice==DB_EXISTS 
b4e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  ){.            T
b4f0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b500: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  pRet);.         
b510: 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
b520: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 3b 0a  wBooleanObj(1);.
b530: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
b540: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
b550: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
b560: 72 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a  rc = TCL_BREAK;.
b570: 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20              i = 
b580: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  nCol;.          
b590: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b5a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
b5b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
b5c0: 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c 29 3b  rp, pRet, pVal);
b5d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b5e0: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
b5f0: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
b600: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
b610: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
b620: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
b630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
b640: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
b650: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
b660: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
b670: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b680: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b690: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
b6a0: 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  EAK ){.        r
b6b0: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
b6c0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72    }..      /* Fr
b6d0: 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ee the column na
b6e0: 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  me objects */.  
b6f0: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
b700: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
b710: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
b720: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
b730: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43  DecrRefCount(apC
b740: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
b750: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63      }.        Tc
b760: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70  l_Free((char*)ap
b770: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
b780: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  }..      /* Free
b790: 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e   the bound strin
b7a0: 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d  g and blob param
b7b0: 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 66  eters */.      f
b7c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b  or(i=0; i<nParm;
b7d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54   i++){.        T
b7e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b7f0: 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20  apParm[i]);.    
b800: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70    }.      if( ap
b810: 50 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20  Parm!=aParm ){. 
b820: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
b830: 28 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a  (char*)apParm);.
b840: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
b850: 2a 20 52 65 73 65 74 20 74 68 65 20 73 74 61 74  * Reset the stat
b860: 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72  ement.  If the r
b870: 65 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53 51  esult code is SQ
b880: 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68 65  LITE_SCHEMA, the
b890: 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68  n.      ** flush
b8a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
b8b0: 61 63 68 65 20 61 6e 64 20 74 72 79 20 74 68 65  ache and try the
b8c0: 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e   statement again
b8d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b8e0: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
b8f0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
b900: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 53 43     if( SQLITE_SC
b910: 48 45 4d 41 3d 3d 72 63 32 20 29 7b 0a 20 20 20  HEMA==rc2 ){.   
b920: 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 61 20       /* After a 
b930: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 66  schema change, f
b940: 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 20 61  lush the cache a
b950: 6e 64 20 74 72 79 20 74 6f 20 72 75 6e 20 74 68  nd try to run th
b960: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61  e.        ** sta
b970: 74 65 6d 65 6e 74 20 61 67 61 69 6e 0a 20 20 20  tement again.   
b980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b990: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
b9a0: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 73  pDb );.        s
b9b0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
b9c0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
b9d0: 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54  if( pPreStmt ) T
b9e0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
b9f0: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
ba00: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
ba10: 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49    }else if( SQLI
ba20: 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20  TE_OK!=rc2 ){.  
ba30: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75        /* If a ru
ba40: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63  n-time error occ
ba50: 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20  urs, report the 
ba60: 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72  error and stop r
ba70: 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  eading.        *
ba80: 2a 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20  * the SQL.      
ba90: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c    */.        Tcl
baa0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
bab0: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
bac0: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
bad0: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
bae0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
baf0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
bb00: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
bb10: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
bb20: 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c  ( pPreStmt ) Tcl
bb30: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72  _Free((char*)pPr
bb40: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  eStmt);.        
bb50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
bb60: 73 65 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53  se if( pDb->maxS
bb70: 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt<=0 ){.      
bb80: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
bb90: 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c  e is turned off,
bba0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65   deallocated the
bbb0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
bbc0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
bbd0: 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63  mt ) Tcl_Free((c
bbe0: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  har*)pPreStmt);.
bbf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
bc00: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
bc10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bc20: 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68        /* Everyth
bc30: 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74  ing worked and t
bc40: 68 65 20 63 61 63 68 65 20 69 73 20 6f 70 65 72  he cache is oper
bc50: 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20  ational..       
bc60: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
bc70: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
bc80: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 77 65   structure if we
bc90: 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20   need one..     
bca0: 20 20 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72     ** (If we alr
bcb0: 65 61 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65  eady have one we
bcc0: 20 63 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20   can just reuse 
bcd0: 69 74 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a  it.).        */.
bce0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
bcf0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
bd00: 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74       len = zLeft
bd10: 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20   - zSql;.       
bd20: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
bd30: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
bd40: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
bd50: 66 28 2a 70 50 72 65 53 74 6d 74 29 20 2b 20 6c  f(*pPreStmt) + l
bd60: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  en );.          
bd70: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
bd80: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
bd90: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OR;.          pP
bda0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20  reStmt->pStmt = 
bdb0: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20  pStmt;.         
bdc0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20   pPreStmt->nSql 
bdd0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  = len;.         
bde0: 20 6d 65 6d 63 70 79 28 70 50 72 65 53 74 6d 74   memcpy(pPreStmt
bdf0: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65  ->zSql, zSql, le
be00: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  n);.          pP
be10: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65 6e  reStmt->zSql[len
be20: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 0;.        }
be30: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ..        /* Add
be40: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
be50: 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62  atement to the b
be60: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
be70: 63 61 63 68 65 20 6c 69 73 74 0a 20 20 20 20 20  cache list.     
be80: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50     */.        pP
be90: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20  reStmt->pNext = 
bea0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
beb0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
bec0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
bed0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
bee0: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tList ){.       
bef0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d    pDb->stmtList-
bf00: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
bf10: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
bf20: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
bf30: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
bf40: 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e         if( pDb->
bf50: 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  stmtLast==0 ){. 
bf60: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
bf70: 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29   pDb->nStmt==0 )
bf80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
bf90: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
bfa0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Stmt;.        }e
bfb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
bfc0: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
bfd0: 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  t>0 );.        }
bfe0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53  .        pDb->nS
bff0: 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20  tmt++;.   .     
c000: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
c010: 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d   too many statem
c020: 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65  ent in cache, re
c030: 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73  move the surplus
c040: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
c050: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
c060: 63 61 63 68 65 20 6c 69 73 74 2e 0a 20 20 20 20  cache list..    
c070: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77      */.        w
c080: 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74  hile( pDb->nStmt
c090: 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b  >pDb->maxStmt ){
c0a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c0b0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d  e3_finalize(pDb-
c0c0: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74  >stmtLast->pStmt
c0d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
c0e0: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62  ->stmtLast = pDb
c0f0: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65  ->stmtLast->pPre
c100: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
c110: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62  _Free((char*)pDb
c120: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78  ->stmtLast->pNex
c130: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  t);.          pD
c140: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65  b->stmtLast->pNe
c150: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
c160: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
c170: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c180: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63  }..      /* Proc
c190: 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  eed to the next 
c1a0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
c1b0: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
c1c0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
c1d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ecrRefCount(objv
c1e0: 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  [2]);..    if( p
c1f0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Ret ){.      if(
c200: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
c210: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
c220: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c230: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pRet);.      }. 
c240: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
c250: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
c260: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
c270: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
c280: 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41   $db function NA
c290: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
c2a0: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
c2b0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61   SQL function ca
c2c0: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
c2d0: 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69  ever that functi
c2e0: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65  on is.  ** calle
c2f0: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
c300: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
c310: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
c320: 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49    case DB_FUNCTI
c330: 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e  ON: {.    SqlFun
c340: 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63  c *pFunc;.    Tc
c350: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
c360: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
c370: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  .    if( objc!=4
c380: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
c390: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
c3a0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
c3b0: 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  E SCRIPT");.    
c3c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c3d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  OR;.    }.    zN
c3e0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
c3f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
c400: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 53 63 72  2], 0);.    pScr
c410: 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ipt = objv[3];. 
c420: 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53     pFunc = findS
c430: 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d  qlFunc(pDb, zNam
c440: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  e);.    if( pFun
c450: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  c==0 ) return TC
c460: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28  L_ERROR;.    if(
c470: 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
c480: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
c490: 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d  rRefCount(pFunc-
c4a0: 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  >pScript);.    }
c4b0: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72  .    pFunc->pScr
c4c0: 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20  ipt = pScript;. 
c4d0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
c4e0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
c4f0: 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c    pFunc->useEval
c500: 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65  Objv = safeToUse
c510: 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c  EvalObjv(interp,
c520: 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72   pScript);.    r
c530: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
c540: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d  te_function(pDb-
c550: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  >db, zName, -1, 
c560: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
c570: 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53       pFunc, tclS
c580: 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
c590: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c5a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
c5b0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
c5c0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
c5d0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
c5e0: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
c5f0: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
c600: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65  OLATILE);.    }e
c610: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75  lse{.      /* Mu
c620: 73 74 20 66 6c 75 73 68 20 61 6e 79 20 63 61 63  st flush any cac
c630: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  hed statements *
c640: 2f 0a 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d  /.      flushStm
c650: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
c660: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
c670: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
c680: 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
c690: 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
c6a0: 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
c6b0: 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
c6c0: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
c6d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
c6e0: 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
c6f0: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
c700: 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
c710: 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
c720: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
c730: 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
c740: 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
c750: 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
c760: 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
c770: 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
c780: 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
c790: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
c7a0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
c7b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
c7c0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
c7d0: 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
c7e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c7f0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
c800: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
c810: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
c820: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
c830: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
c840: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
c850: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
c860: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
c870: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
c880: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
c890: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
c8a0: 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
c8b0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
c8c0: 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
c8d0: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
c8e0: 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a    strncpy(pDb->z
c8f0: 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e  Null, zNull, len
c900: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
c910: 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30  zNull[len] = '\0
c920: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ';.      }else{.
c930: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
c940: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
c950: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
c960: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
c970: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70  p, dbTextToObj(p
c980: 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20  Db->zNull));.   
c990: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
c9a0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c  *.  **     $db l
c9b0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
c9c0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75   .  **.  ** Retu
c9d0: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
c9e0: 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44  ich is the ROWID
c9f0: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
ca00: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a  cent insert..  *
ca10: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54  /.  case DB_LAST
ca20: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b  _INSERT_ROWID: {
ca30: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
ca40: 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72  esult;.    int r
ca50: 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62  owid;.    if( ob
ca60: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
ca70: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
ca80: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
ca90: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
caa0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cab0: 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20    }.    rowid = 
cac0: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
cad0: 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64  ert_rowid(pDb->d
cae0: 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20  b);.    pResult 
caf0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
cb00: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
cb10: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
cb20: 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20  esult, rowid);. 
cb30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
cb40: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f   /*.  ** The DB_
cb50: 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64  ONECOLUMN method
cb60: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
cb70: 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42  together with DB
cb80: 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  _EVAL..  */..  /
cb90: 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73  *    $db progres
cba0: 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20  s ?N CALLBACK?. 
cbb0: 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65   ** .  ** Invoke
cbc0: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
cbd0: 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74  ack every N virt
cbe0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f  ual machine opco
cbf0: 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74  des while execut
cc00: 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  ing.  ** queries
cc10: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
cc20: 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20  _PROGRESS: {.   
cc30: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
cc40: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
cc50: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
cc60: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
cc70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
cc80: 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b  ->zProgress, 0);
cc90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
cca0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
ccb0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
ccc0: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69  rogress;.      i
ccd0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e  nt len;.      in
cce0: 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t N;.      if( T
ccf0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
cd00: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
cd10: 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b   objv[2], &N) ){
cd20: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
cd30: 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  OR;.      };.   
cd40: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
cd50: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
cd60: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
cd70: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
cd80: 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65   }.      zProgre
cd90: 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ss = Tcl_GetStri
cda0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
cdb0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
cdc0: 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26  if( zProgress &&
cdd0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
cde0: 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
cdf0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
ce00: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
ce10: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72   strcpy(pDb->zPr
ce20: 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73  ogress, zProgres
ce30: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
ce40: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
ce50: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
ce60: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
ce70: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
ce80: 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20  S_CALLBACK.     
ce90: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
cea0: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
ceb0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
cec0: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
ced0: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
cee0: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e  ndler(pDb->db, N
cef0: 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  , DbProgressHand
cf00: 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
cf10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cf20: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
cf30: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
cf40: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
cf50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
cf60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
cf70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cf80: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
cf90: 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20   CALLBACK");.   
cfa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
cfb0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
cfc0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
cfd0: 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f     $db profile ?
cfe0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
cff0: 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
d000: 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
d010: 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
d020: 74 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20  tine after each 
d030: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
d040: 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e  ** that has run.
d050: 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
d060: 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d  e SQL and the am
d070: 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74  ount of elapse t
d080: 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70  ime are.  ** app
d090: 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
d0a0: 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72  K before the scr
d0b0: 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f  ipt is run..  */
d0c0: 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49  .  case DB_PROFI
d0d0: 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  LE: {.    if( ob
d0e0: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
d0f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d100: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
d110: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
d120: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
d130: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
d140: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
d150: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
d160: 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
d170: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d180: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
d190: 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20  >zProfile, 0);. 
d1a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d1b0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
d1c0: 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e  rofile;.      in
d1d0: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
d1e0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
d1f0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
d200: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
d210: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d220: 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f   zProfile = Tcl_
d230: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
d240: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
d250: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66  .      if( zProf
d260: 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ile && len>0 ){.
d270: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
d280: 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ofile = Tcl_Allo
d290: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
d2a0: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
d2b0: 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f  ->zProfile, zPro
d2c0: 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  file);.      }el
d2d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
d2e0: 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20  >zProfile = 0;. 
d2f0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
d300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
d310: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
d320: 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
d330: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
d340: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
d350: 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
d360: 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f  e(pDb->db, DbPro
d370: 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  fileHandler, pDb
d380: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d3a0: 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c  profile(pDb->db,
d3b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
d3c0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
d3d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
d3e0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72  *.  **     $db r
d3f0: 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20  ekey KEY.  **.  
d400: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e  ** Change the en
d410: 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20  cryption key on 
d420: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
d430: 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  en database..  *
d440: 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45  /.  case DB_REKE
d450: 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65  Y: {.    int nKe
d460: 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  y;.    void *pKe
d470: 79 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  y;.    if( objc!
d480: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
d490: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
d4a0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b  erp, 2, objv, "K
d4b0: 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  EY");.      retu
d4c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d4d0: 20 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54    }.    pKey = T
d4e0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
d4f0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
d500: 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53  &nKey);.#ifdef S
d510: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
d520: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d530: 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20  _rekey(pDb->db, 
d540: 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  pKey, nKey);.   
d550: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d560: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d570: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
d580: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
d590: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
d5a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERROR;.    }.#en
d5b0: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
d5c0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
d5d0: 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49    $db timeout MI
d5e0: 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a  LLESECONDS.  **.
d5f0: 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74    ** Delay for t
d600: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
d610: 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66  liseconds specif
d620: 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  ied when a file 
d630: 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  is locked..  */.
d640: 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55    case DB_TIMEOU
d650: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b  T: {.    int ms;
d660: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
d670: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
d680: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d690: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 2, objv, "MIL
d6a0: 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
d6b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d6c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
d6d0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
d6e0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
d6f0: 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
d700: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d710: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
d720: 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c  timeout(pDb->db,
d730: 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   ms);.    break;
d740: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
d750: 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f  *     $db total_
d760: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
d770: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
d780: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
d790: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
d7a0: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
d7b0: 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  eted .  ** since
d7c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
d7d0: 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
d7e0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
d7f0: 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
d800: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
d810: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
d820: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
d830: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d840: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
d850: 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
d860: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d870: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
d880: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
d890: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
d8a0: 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
d8b0: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
d8c0: 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
d8d0: 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
d8e0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
d8f0: 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
d900: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
d910: 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
d920: 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
d930: 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
d940: 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
d950: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
d960: 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
d970: 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
d980: 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
d990: 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
d9a0: 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
d9b0: 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
d9c0: 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
d9d0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
d9e0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
d9f0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
da00: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
da10: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
da20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
da30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
da40: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
da50: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
da60: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
da70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
da80: 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
da90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
daa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
dab0: 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
dac0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
dad0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
dae0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
daf0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
db00: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
db10: 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
db20: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
db30: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
db40: 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
db50: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
db60: 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
db70: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
db80: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
db90: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 54 72   strcpy(pDb->zTr
dba0: 61 63 65 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20  ace, zTrace);.  
dbb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dbc0: 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
dbd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
dbe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dbf0: 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28 20  TRACE.      if( 
dc00: 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
dc10: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
dc20: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
dc30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
dc40: 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
dc50: 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
dc60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dc70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
dc80: 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
dc90: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
dca0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
dcb0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
dcc0: 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
dcd0: 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
dce0: 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
dcf0: 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
dd00: 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
dd10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
dd20: 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
dd30: 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
dd40: 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
dd50: 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
dd60: 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
dd70: 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
dd80: 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
dd90: 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
dda0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
ddb0: 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
ddc0: 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
ddd0: 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
dde0: 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
ddf0: 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
de00: 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
de10: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
de20: 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
de30: 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
de40: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
de50: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
de60: 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
de70: 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
de80: 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
de90: 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
dea0: 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
deb0: 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
dec0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
ded0: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
dee0: 20 20 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 3b      int inTrans;
def0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
df00: 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74  cript;.    const
df10: 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20   char *zBegin = 
df20: 22 42 45 47 49 4e 22 3b 0a 20 20 20 20 69 66 28  "BEGIN";.    if(
df30: 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
df40: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
df50: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
df60: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
df70: 5b 54 59 50 45 5d 20 53 43 52 49 50 54 22 29 3b  [TYPE] SCRIPT");
df80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
df90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
dfa0: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
dfb0: 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  {.      pScript 
dfc0: 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 7d  = objv[2];.    }
dfd0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74   else {.      st
dfe0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dff0: 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20  *TTYPE_strs[] = 
e000: 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65 72  {.        "defer
e010: 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69  red",   "exclusi
e020: 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65  ve",  "immediate
e030: 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ", 0.      };.  
e040: 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65      enum TTYPE_e
e050: 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54  num {.        TT
e060: 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54  YPE_DEFERRED, TT
e070: 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54  YPE_EXCLUSIVE, T
e080: 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20  TYPE_IMMEDIATE. 
e090: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
e0a0: 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69  t ttype;.      i
e0b0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
e0c0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
e0d0: 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74  bjv[2], TTYPE_st
e0e0: 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e  rs, "transaction
e0f0: 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20   type",.        
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29        0, &ttype)
e120: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e130: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e140: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74      }.      swit
e150: 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
e160: 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
e170: 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
e180: 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a  _DEFERRED:    /*
e190: 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20   no-op */;      
e1a0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
e1b0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
e1c0: 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20  TYPE_EXCLUSIVE: 
e1d0: 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
e1e0: 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62  N EXCLUSIVE";  b
e1f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
e200: 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  se TTYPE_IMMEDIA
e210: 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  TE:   zBegin = "
e220: 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
e230: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
e240: 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  }.      pScript 
e250: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d  = objv[3];.    }
e260: 0a 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 21  .    inTrans = !
e270: 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
e280: 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64 62 29 3b  commit(pDb->db);
e290: 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e  .    if( !inTran
e2a0: 73 20 29 7b 0a 20 20 20 20 20 20 28 76 6f 69 64  s ){.      (void
e2b0: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
e2c0: 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30  b->db, zBegin, 0
e2d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
e2e0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
e2f0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
e300: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 69  cript, 0);.    i
e310: 66 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20  f( !inTrans ){. 
e320: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
e330: 2a 7a 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  *zEnd;.      if(
e340: 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 20 29   rc==TCL_ERROR )
e350: 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d  {.        zEnd =
e360: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
e370: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
e380: 20 20 20 20 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d      zEnd = "COMM
e390: 49 54 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IT";.      }.   
e3a0: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
e3b0: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
e3c0: 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  End, 0, 0, 0);. 
e3d0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
e3e0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
e3f0: 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f    $db update_hoo
e400: 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20  k ?script?.  ** 
e410: 20 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f     $db rollback_
e420: 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
e430: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44  */.  case DB_UPD
e440: 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73  ATE_HOOK: .  cas
e450: 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f  e DB_ROLLBACK_HO
e460: 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65  OK: {..    /* se
e470: 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e  t ppHook to poin
e480: 74 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b  t at pUpdateHook
e490: 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f   or pRollbackHoo
e4a0: 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  k, depending on 
e4b0: 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20  .    ** whether 
e4c0: 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b  [$db update_hook
e4d0: 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61  ] or [$db rollba
e4e0: 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76  ck_hook] was inv
e4f0: 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oked..    */.   
e500: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f   Tcl_Obj **ppHoo
e510: 6b 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69  k; .    if( choi
e520: 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f  ce==DB_UPDATE_HO
e530: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f  OK ){.      ppHo
e540: 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61  ok = &pDb->pUpda
e550: 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73  teHook;.    }els
e560: 65 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20  e{.      ppHook 
e570: 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  = &pDb->pRollbac
e580: 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  kHook;.    }..  
e590: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
e5a0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
e5b0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
e5c0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
e5d0: 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
e5e0: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
e5f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e600: 0a 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b  .    if( *ppHook
e610: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
e620: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
e630: 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  p, *ppHook);.   
e640: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
e650: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  {.        Tcl_De
e660: 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f  crRefCount(*ppHo
e670: 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  ok);.        *pp
e680: 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hook = 0;.      
e690: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e6a0: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
e6b0: 20 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f   assert( !(*ppHo
e6c0: 6f 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ok) );.      if(
e6d0: 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67   Tcl_GetCharLeng
e6e0: 74 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b  th(objv[2])>0 ){
e6f0: 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b  .        *ppHook
e700: 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20   = objv[2];.    
e710: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
e720: 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20  ount(*ppHook);. 
e730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e740: 20 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65    sqlite3_update
e750: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28  _hook(pDb->db, (
e760: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
e770: 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72  ?DbUpdateHandler
e780: 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20 73  :0), pDb);.    s
e790: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
e7a0: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44  hook(pDb->db,(pD
e7b0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
e7c0: 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c  ?DbRollbackHandl
e7d0: 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20  er:0),pDb);..   
e7e0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
e7f0: 2a 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e  *    $db version
e800: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
e810: 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74  n the version st
e820: 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61  ring for this da
e830: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
e840: 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20  ase DB_VERSION: 
e850: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
e860: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
e870: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76  r *)sqlite3_libv
e880: 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54  ersion(), TCL_ST
e890: 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b  ATIC);.    break
e8a0: 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45  ;.  }...  } /* E
e8b0: 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48  nd of the SWITCH
e8c0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
e8d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e8e0: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42  .**   sqlite3 DB
e8f0: 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d  NAME FILENAME ?M
e900: 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a  ODE? ?-key KEY?.
e910: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
e920: 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61  e main Tcl comma
e930: 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73  nd.  When the "s
e940: 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61  qlite" Tcl comma
e950: 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  nd is.** invoked
e960: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
e970: 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74  uns to process t
e980: 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  hat command..**.
e990: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
e9a0: 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69  ument, DBNAME, i
e9b0: 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e  s an arbitrary n
e9c0: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a  ame for a new.**
e9d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
e9e0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d  tion.  This comm
e9f0: 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65  and creates a ne
ea00: 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a  w command named.
ea10: 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69  ** DBNAME that i
ea20: 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  s used to contro
ea30: 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  l that connectio
ea40: 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  n.  The database
ea50: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
ea60: 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  s deleted when t
ea70: 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e  he DBNAME comman
ea80: 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  d is deleted..**
ea90: 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
eaa0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
eab0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
eac0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
ead0: 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  ns.** the sqlite
eae0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
eaf0: 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
eb00: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74  ..**.** For test
eb10: 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65  ing purposes, we
eb20: 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74 68   also support th
eb30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
eb40: 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 65 6e 63  **  sqlite3 -enc
eb50: 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20  oding.**.**     
eb60: 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e 63    Return the enc
eb70: 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c 49  oding used by LI
eb80: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72  KE and GLOB oper
eb90: 61 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73 0a  ators.  Choices.
eba0: 2a 2a 20 20 20 20 20 20 20 61 72 65 20 55 54 46  **       are UTF
ebb0: 2d 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e 0a  -8 and iso8859..
ebc0: 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d  **.**  sqlite3 -
ebd0: 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  version.**.**   
ebe0: 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 76      Return the v
ebf0: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66  ersion number of
ec00: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
ec10: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  ary..**.**  sqli
ec20: 74 65 33 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74  te3 -tcl-uses-ut
ec30: 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65  f.**.**       Re
ec40: 74 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d 70  turn "1" if comp
ec50: 69 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c 20  iled with a Tcl 
ec60: 75 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65 74  uses UTF-8.  Ret
ec70: 75 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20 20  urn "0" if.**   
ec80: 20 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20 62      not.  Used b
ec90: 79 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65 20  y tests to make 
eca0: 73 75 72 65 20 74 68 65 20 6c 69 62 72 61 72 79  sure the library
ecb0: 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a   was compiled .*
ecc0: 2a 20 20 20 20 20 20 20 63 6f 72 72 65 63 74 6c  *       correctl
ecd0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
ece0: 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64   DbMain(void *cd
ecf0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
ed00: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54  terp, int objc,T
ed10: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
ed20: 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  jv){.  SqliteDb 
ed30: 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79  *p;.  void *pKey
ed40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79   = 0;.  int nKey
ed50: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
ed60: 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72  ar *zArg;.  char
ed70: 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e   *zErrMsg;.  con
ed80: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
ed90: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
eda0: 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
edb0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
edc0: 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
edd0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
ede0: 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30  g,"-version")==0
edf0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
ee00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ee10: 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  p,sqlite3_versio
ee20: 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n,0);.      retu
ee30: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
ee40: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
ee50: 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63  zArg,"-has-codec
ee60: 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
ee70: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
ee80: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
ee90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
eea0: 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1",0);.#else.   
eeb0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
eec0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30  ult(interp,"0",0
eed0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
eee0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
eef0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
ef00: 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d 75  cmp(zArg,"-tcl-u
ef10: 73 65 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b 0a  ses-utf")==0 ){.
ef20: 23 69 66 64 65 66 20 54 43 4c 5f 55 54 46 5f 4d  #ifdef TCL_UTF_M
ef30: 41 58 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  AX.      Tcl_App
ef40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ef50: 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20  ,"1",0);.#else. 
ef60: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
ef70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22  esult(interp,"0"
ef80: 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ,0);.#endif.    
ef90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
efa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
efb0: 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63   objc==5 || objc
efc0: 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72 67 20  ==6 ){.    zArg 
efd0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
efe0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63  romObj(objv[objc
eff0: 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  -2], 0);.    if(
f000: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b   strcmp(zArg,"-k
f010: 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
f020: 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
f030: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
f040: 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e  objv[objc-1], &n
f050: 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a 63  Key);.      objc
f060: 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   -= 2;.    }.  }
f070: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
f080: 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
f090: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f0a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
f0b0: 76 2c 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  v, .#ifdef SQLIT
f0c0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
f0d0: 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
f0e0: 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d 4b  ME ?-key CODEC-K
f0f0: 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20 20  EY?".#else.     
f100: 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d   "HANDLE FILENAM
f110: 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69 66  E ?MODE?".#endif
f120: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
f130: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f140: 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b  }.  zErrMsg = 0;
f150: 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62  .  p = (SqliteDb
f160: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
f170: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
f180: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c   p==0 ){.    Tcl
f190: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
f1a0: 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  p, "malloc faile
f1b0: 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  d", TCL_STATIC);
f1c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
f1d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d  ERROR;.  }.  mem
f1e0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
f1f0: 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  (*p));.  zFile =
f200: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f210: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
f220: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  );.  sqlite3_ope
f230: 6e 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 29  n(zFile, &p->db)
f240: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
f250: 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
f260: 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
f270: 20 7a 45 72 72 4d 73 67 20 3d 20 73 74 72 64 75   zErrMsg = strdu
f280: 70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  p(sqlite3_errmsg
f290: 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71  (p->db));.    sq
f2a0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
f2b0: 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
f2c0: 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  0;.  }.#ifdef SQ
f2d0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
f2e0: 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e   sqlite3_key(p->
f2f0: 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, pKey, nKey);
f300: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
f310: 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  >db==0 ){.    Tc
f320: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f330: 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c  rp, zErrMsg, TCL
f340: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
f350: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
f360: 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 45 72  p);.    free(zEr
f370: 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
f380: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
f390: 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20  .  p->maxStmt = 
f3a0: 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  NUM_PREPARED_STM
f3b0: 54 53 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c  TS;.  zArg = Tcl
f3c0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f3d0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
f3e0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
f3f0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41  mmand(interp, zA
f400: 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63  rg, DbObjCmd, (c
f410: 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65  har*)p, DbDelete
f420: 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63  Cmd);..  /* If c
f430: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
f440: 49 54 45 5f 54 45 53 54 20 74 75 72 6e 65 64 20  ITE_TEST turned 
f450: 6f 6e 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65  on, then registe
f460: 72 20 74 68 65 20 22 6d 64 35 73 75 6d 22 0a 20  r the "md5sum". 
f470: 20 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   ** SQL function
f480: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
f490: 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20  LITE_TEST.  {.  
f4a0: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 4d 64    extern void Md
f4b0: 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69 74  5_Register(sqlit
f4c0: 65 33 2a 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  e3*);.#ifdef SQL
f4d0: 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20  ITE_MEMDEBUG.   
f4e0: 20 69 6e 74 20 6d 61 6c 6c 6f 63 66 61 69 6c 20   int mallocfail 
f4f0: 3d 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f  = sqlite3_iMallo
f500: 63 46 61 69 6c 3b 0a 20 20 20 20 73 71 6c 69 74  cFail;.    sqlit
f510: 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d  e3_iMallocFail =
f520: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 4d   0;.#endif.    M
f530: 64 35 5f 52 65 67 69 73 74 65 72 28 70 2d 3e 64  d5_Register(p->d
f540: 62 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b);.#ifdef SQLIT
f550: 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 73  E_MEMDEBUG.    s
f560: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
f570: 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66 61 69 6c 3b  il = mallocfail;
f580: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
f590: 69 66 20 20 0a 20 20 70 2d 3e 69 6e 74 65 72 70  if  .  p->interp
f5a0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 72 65 74   = interp;.  ret
f5b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
f5c0: 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64  *.** Provide a d
f5d0: 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75  ummy Tcl_InitStu
f5e0: 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73 69  bs if we are usi
f5f0: 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74 61  ng this as a sta
f600: 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a  tic.** library..
f610: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54  */.#ifndef USE_T
f620: 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66  CL_STUBS.# undef
f630: 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a    Tcl_InitStubs.
f640: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69  # define Tcl_Ini
f650: 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65  tStubs(a,b,c).#e
f660: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
f670: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
f680: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
f690: 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20  macro defined.  
f6a0: 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  This will be.** 
f6b0: 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69  defined automati
f6c0: 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41  cally by the TEA
f6d0: 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20   makefile.  But 
f6e0: 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a  other makefiles.
f6f0: 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65  ** do not define
f700: 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   it..*/.#ifndef 
f710: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a  PACKAGE_VERSION.
f720: 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45  # define PACKAGE
f730: 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f  _VERSION SQLITE_
f740: 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a  VERSION.#endif..
f750: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
f760: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a   this module..**
f770: 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64  .** This Tcl mod
f780: 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  ule contains onl
f790: 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54  y a single new T
f7a0: 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  cl command named
f7b0: 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48   "sqlite"..** (H
f7c0: 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ence there is no
f7d0: 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65   namespace.  The
f7e0: 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
f7f0: 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70  n using a namesp
f800: 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ace.** if the ex
f810: 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70  tension only sup
f820: 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61  plies one new na
f830: 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69 74  me!)  The "sqlit
f840: 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  e" command is.**
f850: 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20   used to open a 
f860: 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61 62  new SQLite datab
f870: 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44 62  ase.  See the Db
f880: 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61  Main() routine a
f890: 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69  bove.** for addi
f8a0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
f8b0: 6f 6e 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e  on..*/.extern in
f8c0: 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  t Sqlite3_Init(T
f8d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
f8e0: 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74  p){.  Tcl_InitSt
f8f0: 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34  ubs(interp, "8.4
f900: 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ", 0);.  Tcl_Cre
f910: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
f920: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
f930: 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
f940: 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
f950: 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
f960: 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
f970: 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52  e3", PACKAGE_VER
f980: 53 49 4f 4e 29 3b 0a 20 20 54 63 6c 5f 43 72 65  SION);.  Tcl_Cre
f990: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
f9a0: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20  terp, "sqlite", 
f9b0: 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
f9c0: 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a  )DbMain, 0, 0);.
f9d0: 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65    Tcl_PkgProvide
f9e0: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
f9f0: 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ", PACKAGE_VERSI
fa00: 4f 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ON);.  return TC
fa10: 4c 5f 4f 4b 3b 0a 7d 0a 65 78 74 65 72 6e 20 69  L_OK;.}.extern i
fa20: 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e  nt Tclsqlite3_In
fa30: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
fa40: 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
fa50: 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
fa60: 72 70 29 3b 20 7d 0a 65 78 74 65 72 6e 20 69 6e  rp); }.extern in
fa70: 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e  t Sqlite3_SafeIn
fa80: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
fa90: 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
faa0: 43 4c 5f 4f 4b 3b 20 7d 0a 65 78 74 65 72 6e 20  CL_OK; }.extern 
fab0: 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53  int Tclsqlite3_S
fac0: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
fad0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
fae0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23  urn TCL_OK; }..#
faf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f  ifndef SQLITE_3_
fb00: 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 65 78 74 65  SUFFIX_ONLY.exte
fb10: 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e  rn int Sqlite_In
fb20: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
fb30: 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
fb40: 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
fb50: 72 70 29 3b 20 7d 0a 65 78 74 65 72 6e 20 69 6e  rp); }.extern in
fb60: 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74  t Tclsqlite_Init
fb70: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
fb80: 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
fb90: 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
fba0: 29 3b 20 7d 0a 65 78 74 65 72 6e 20 69 6e 74 20  ); }.extern int 
fbb0: 53 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28  Sqlite_SafeInit(
fbc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
fbd0: 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
fbe0: 4f 4b 3b 20 7d 0a 65 78 74 65 72 6e 20 69 6e 74  OK; }.extern int
fbf0: 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66 65 49   Tclsqlite_SafeI
fc00: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
fc10: 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
fc20: 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66  TCL_OK; }.#endif
fc30: 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f  ..#ifdef TCLSH./
fc40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
fc90: 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   The code that f
fca0: 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74  ollows is used t
fcb0: 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f  o build standalo
fcc0: 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  ne TCL interpret
fcd0: 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  ers.*/../*.** If
fce0: 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48   the macro TCLSH
fcf0: 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75   is one, then pu
fd00: 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66  t in code this f
fd10: 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22  or the.** "main"
fd20: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69   routine that wi
fd30: 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63  ll initialize Tc
fd40: 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74  l and take input
fd50: 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72   from.** standar
fd60: 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 23 69 66 20  d input..*/.#if 
fd70: 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20  TCLSH==1.static 
fd80: 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d  char zMainloop[]
fd90: 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65 20 7b   =.  "set line {
fda0: 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20 7b 21  }\n".  "while {!
fdb0: 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e  [eof stdin]} {\n
fdc0: 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69 6e 65  ".    "if {$line
fdd0: 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
fde0: 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c     "puts -nonewl
fdf0: 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20  ine \"> \"\n".  
fe00: 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
fe10: 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
fe20: 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a  wline \"% \"\n".
fe30: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66      "}\n".    "f
fe40: 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20  lush stdout\n". 
fe50: 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20     "append line 
fe60: 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a  [gets stdin]\n".
fe70: 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63      "if {[info c
fe80: 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20  omplete $line]} 
fe90: 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b  {\n".      "if {
fea0: 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
feb0: 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74  #0 $line} result
fec0: 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  ]} {\n".        
fed0: 22 70 75 74 73 20 73 74 64 65 72 72 20 5c 22 45  "puts stderr \"E
fee0: 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c  rror: $result\"\
fef0: 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65  n".      "} else
ff00: 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c  if {$result!=\"\
ff10: 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  "} {\n".        
ff20: 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22  "puts $result\n"
ff30: 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20  .      "}\n".   
ff40: 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c     "set line {}\
ff50: 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  n".    "} else {
ff60: 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65 6e  \n".      "appen
ff70: 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20  d line \\n\n".  
ff80: 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a    "}\n".  "}\n".
ff90: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
ffa0: 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
ffb0: 53 48 20 69 73 20 74 77 6f 2c 20 74 68 65 6e 20  SH is two, then 
ffc0: 67 65 74 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  get the main loo
ffd0: 70 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a 2a 2a  p code out of.**
ffe0: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 66 69   the separate fi
fff0: 6c 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63  le "spaceanal_tc
10000 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c  l.h"..*/.#if TCL
10010 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 68 61  SH==2.static cha
10020 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20  r zMainloop[] = 
10030 0a 23 69 6e 63 6c 75 64 65 20 22 73 70 61 63 65  .#include "space
10040 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65  anal_tcl.h".;.#e
10050 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 43  ndif..#define TC
10060 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20  LSH_MAIN main   
10070 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b  /* Needed to fak
10080 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a  e out mktclapp *
10090 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e  /.int TCLSH_MAIN
100a0 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
100b0 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49  **argv){.  Tcl_I
100c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
100d0 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61   Tcl_FindExecuta
100e0 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
100f0 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65  interp = Tcl_Cre
10100 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 53  ateInterp();.  S
10110 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
10120 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  rp);.#ifdef SQLI
10130 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20  TE_TEST.  {.    
10140 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10150 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f  etest1_Init(Tcl_
10160 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
10170 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
10180 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est2_Init(Tcl_In
10190 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
101a0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
101b0 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t3_Init(Tcl_Inte
101c0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
101d0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34   int Sqlitetest4
101e0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
101f0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10200 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49  nt Sqlitetest5_I
10210 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10220 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10230 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69   Sqlitetest6_Ini
10240 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10250 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10260 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28  qlitetest7_Init(
10270 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10280 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
10290 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63  itetest8_Init(Tc
102a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
102b0 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49  extern int Md5_I
102c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
102d0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
102e0 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
102f0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10300 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10310 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63   Sqlitetestasync
10320 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10330 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10340 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c  nt Sqlitetesttcl
10350 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  var_Init(Tcl_Int
10360 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
10370 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
10380 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f  schema_Init(Tcl_
10390 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20 20 53  Interp*);..    S
103a0 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
103b0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
103c0 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e  itetest2_Init(in
103d0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
103e0 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65  etest3_Init(inte
103f0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
10400 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70  est4_Init(interp
10410 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
10420 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t5_Init(interp);
10430 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 36  .    Sqlitetest6
10440 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
10450 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49     Sqlitetest7_I
10460 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
10470 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69   Sqlitetest8_Ini
10480 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
10490 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49  qlitetestasync_I
104a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
104b0 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61   Sqlitetesttclva
104c0 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  r_Init(interp);.
104d0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 63      Sqlitetestsc
104e0 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70  hema_Init(interp
104f0 29 3b 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74 28  );.    Md5_Init(
10500 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20  interp);.#ifdef 
10510 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20 53  SQLITE_SSE.    S
10520 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69  qlitetestsse_Ini
10530 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
10540 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
10550 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43  f( argc>=2 || TC
10560 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  LSH==2 ){.    in
10570 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  t i;.    Tcl_Set
10580 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
10590 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
105a0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
105b0 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
105c0 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
105d0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
105e0 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
105f0 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
10600 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
10610 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
10620 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
10630 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
10640 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
10650 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
10660 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
10670 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
10680 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
10690 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
106a0 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
106b0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
106c0 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
106d0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
106e0 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
106f0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
10700 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
10710 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70  ) zInfo = interp
10720 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20  ->result;.      
10730 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
10740 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76  %s: %s\n", *argv
10750 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , zInfo);.      
10760 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
10770 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d    }.  if( argc<=
10780 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b  1 || TCLSH==2 ){
10790 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  .    Tcl_GlobalE
107a0 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69  val(interp, zMai
107b0 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nloop);.  }.  re
107c0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
107d0 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23 65   /* TCLSH */..#e
107e0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
107f0 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a              (NO_TCL) */.