/ Hex Artifact Content
Login

Artifact 4ad22f354b6e4e137889000e9f585a0590ca39c5:


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 38 20 32 30 30 36 2f 30 36 2f 31 33 20 32 33  58 2006/06/13 23
01c0: 3a 35 31 3a 33 35 20 64 72 68 20 45 78 70 20 24  :51:35 drh Exp $
01d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54  .*/.#ifndef NO_T
01e0: 43 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74  CL     /* Omit t
01f0: 68 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69  his whole file i
0200: 66 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c  f TCL is unavail
0210: 61 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  able */..#includ
0220: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0230: 23 69 6e 63 6c 75 64 65 20 22 68 61 73 68 2e 68  #include "hash.h
0240: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
0250: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0260: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0270: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0280: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0290: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
02a0: 3e 0a 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f  >...#define NUM_
02b0: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31  PREPARED_STMTS 1
02c0: 30 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 52  0.#define MAX_PR
02d0: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30 30  EPARED_STMTS 100
02e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c 20 75  ../*.** If TCL u
02f0: 73 65 73 20 55 54 46 2d 38 20 61 6e 64 20 53 51  ses UTF-8 and SQ
0300: 4c 69 74 65 20 69 73 20 63 6f 6e 66 69 67 75 72  Lite is configur
0310: 65 64 20 74 6f 20 75 73 65 20 69 73 6f 38 38 35  ed to use iso885
0320: 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20 68 61  9, then we.** ha
0330: 76 65 20 74 6f 20 64 6f 20 61 20 74 72 61 6e 73  ve to do a trans
0340: 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f 69 6e  lation when goin
0350: 67 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  g between the tw
0360: 6f 2e 20 20 53 65 74 20 74 68 65 20 0a 2a 2a 20  o.  Set the .** 
0370: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
0380: 4e 45 45 44 45 44 20 6d 61 63 72 6f 20 74 6f 20  NEEDED macro to 
0390: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65  indicate that we
03a0: 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74   need to do.** t
03b0: 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e  his translation.
03c0: 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65    .*/.#if define
03d0: 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29 20 26  d(TCL_UTF_MAX) &
03e0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
03f0: 45 5f 55 54 46 38 29 0a 23 20 64 65 66 69 6e 65  E_UTF8).# define
0400: 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e   UTF_TRANSLATION
0410: 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e 64 69 66  _NEEDED 1.#endif
0420: 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c 20  ../*.** New SQL 
0430: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65  functions can be
0440: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
0450: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
0460: 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  uch function.** 
0470: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0480: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0490: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
04a0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
04b0: 65 66 20 73 74 72 75 63 74 20 53 71 6c 46 75 6e  ef struct SqlFun
04c0: 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72 75 63  c SqlFunc;.struc
04d0: 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20 54 63  t SqlFunc {.  Tc
04e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
04f0: 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69  ;   /* The TCL i
0500: 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65 63  nterpret to exec
0510: 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ute the function
0520: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
0530: 53 63 72 69 70 74 3b 20 20 20 20 20 2f 2a 20 54  Script;     /* T
0540: 68 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70 72 65  he Tcl_Obj repre
0550: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
0560: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74   script */.  int
0570: 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20   useEvalObjv;   
0580: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74     /* True if it
0590: 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20   is safe to use 
05a0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a  Tcl_EvalObjv */.
05b0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
05c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
05d0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
05e0: 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70   */.  SqlFunc *p
05f0: 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  Next;       /* N
0600: 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  ext function on 
0610: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  the list of them
0620: 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   all */.};../*.*
0630: 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  * New collation 
0640: 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69  sequences functi
0650: 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65  on can be create
0660: 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73  d as TCL scripts
0670: 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20  .  Each such.** 
0680: 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63  function is desc
0690: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
06a0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
06b0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
06c0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
06d0: 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71  ct SqlCollate Sq
06e0: 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74  lCollate;.struct
06f0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20   SqlCollate {.  
0700: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0710: 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  rp;   /* The TCL
0720: 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78   interpret to ex
0730: 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69  ecute the functi
0740: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  on */.  char *zS
0750: 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a  cript;        /*
0760: 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62   The script to b
0770: 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f  e run */.  SqlCo
0780: 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20  llate *pNext;   
0790: 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f   /* Next functio
07a0: 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  n on the list of
07b0: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a   them all */.};.
07c0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20  ./*.** Prepared 
07d0: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63  statements are c
07e0: 61 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72  ached for faster
07f0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63   execution.  Eac
0800: 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  h prepared.** st
0810: 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72  atement is descr
0820: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0830: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0840: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0850: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0860: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0870: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0880: 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65  t;.struct SqlPre
0890: 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71  paredStmt {.  Sq
08a0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
08b0: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
08c0: 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f  n linked list */
08d0: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
08e0: 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50  mt *pPrev;  /* P
08f0: 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c  revious on the l
0900: 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
0910: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
0920: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
0930: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
0940: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
0950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61            /* cha
0960: 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a  rs in zSql[] */.
0970: 20 20 63 68 61 72 20 7a 53 71 6c 5b 31 5d 3b 20    char zSql[1]; 
0980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
0990: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  xt of the SQL st
09a0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f  atement */.};../
09b0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
09c0: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
09d0: 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
09e0: 20 65 61 63 68 20 53 51 4c 69 74 65 20 64 61 74   each SQLite dat
09f0: 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20 68 61  abase.** that ha
0a00: 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
0a10: 20 74 68 65 20 53 51 4c 69 74 65 20 54 43 4c 20   the SQLite TCL 
0a20: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 74 79  interface..*/.ty
0a30: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0a40: 69 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a  iteDb SqliteDb;.
0a50: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
0a60: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0a80: 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74  * The "real" dat
0a90: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
0aa0: 20 4d 55 53 54 20 42 45 20 46 49 52 53 54 20 2a   MUST BE FIRST *
0ab0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
0ac0: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f  interp;        /
0ad0: 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65  * The interprete
0ae0: 72 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  r used for this 
0af0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
0b00: 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20  ar *zBusy;      
0b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0b20: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f  busy callback ro
0b30: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0b40: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
0b50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
0b60: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
0b70: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0b80: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0ba0: 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
0bb0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0bc0: 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20 20 20  r *zProfile;    
0bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0be0: 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20  rofile callback 
0bf0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0c00: 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20  r *zProgress;   
0c10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0c20: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
0c30: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0c40: 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20  ar *zAuth;      
0c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0c60: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
0c70: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0c80: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b  /.  char *zNull;
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0ca0: 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69  * Text to substi
0cb0: 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20  tute for an SQL 
0cc0: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
0cd0: 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20  SqlFunc *pFunc; 
0ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
0cf0: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
0d00: 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ons */.  Tcl_Obj
0d10: 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20   *pUpdateHook;  
0d20: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f      /* Update ho
0d30: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0d40: 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  y) */.  Tcl_Obj 
0d50: 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20  *pRollbackHook; 
0d60: 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68     /* Rollback h
0d70: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
0d80: 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ny) */.  SqlColl
0d90: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20  ate *pCollate;  
0da0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53      /* List of S
0db0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
0dc0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
0dd0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
0de0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
0df0: 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65   code of most re
0e00: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  cent sqlite3_exe
0e10: 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  c() */.  Tcl_Obj
0e20: 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64   *pCollateNeeded
0e30: 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e  ;   /* Collation
0e40: 20 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a   needed script *
0e50: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
0e60: 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f  tmt *stmtList; /
0e70: 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72  * List of prepar
0e80: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a  ed statements*/.
0e90: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0ea0: 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20  t *stmtLast; /* 
0eb0: 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69  Last statement i
0ec0: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0ed0: 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20  int maxStmt;    
0ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0ef0: 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e  e next maximum n
0f00: 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73  umber of stmtLis
0f10: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74  t */.  int nStmt
0f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0f30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
0f40: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d  tatements in stm
0f50: 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  tList */.};../*.
0f60: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73  ** Look at the s
0f70: 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20  cript prefix in 
0f80: 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62  pCmd.  We will b
0f90: 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
0fa0: 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72   script.** after
0fb0: 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67   first appending
0fc0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67   one or more arg
0fd0: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f  uments.  This ro
0fe0: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a  utine analyzes.*
0ff0: 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20  * the script to 
1000: 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66  see if it is saf
1010: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
1020: 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73  lObjv() on the s
1030: 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20  cript.** rather 
1040: 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65  than the more ge
1050: 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78  neral Tcl_EvalEx
1060: 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ().  Tcl_EvalObj
1070: 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66  v() is much.** f
1080: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72  aster..**.** Scr
1090: 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61  ipts that are sa
10a0: 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54  fe to use with T
10b0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f  cl_EvalObjv() co
10c0: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63  nsists of a.** c
10d0: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c  ommand name foll
10e0: 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20  owed by zero or 
10f0: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77  more arguments w
1100: 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20  ith no [...] or 
1110: 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72  $.** or {...} or
1120: 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e   ; to be seen an
1130: 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61  ywhere.  Most ca
1140: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63  llback scripts c
1150: 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73  onsist.** of jus
1160: 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  t a single proce
1170: 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  dure name and th
1180: 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71  ey meet this req
1190: 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  uirement..*/.sta
11a0: 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73  tic int safeToUs
11b0: 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e  eEvalObjv(Tcl_In
11c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
11d0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20  l_Obj *pCmd){.  
11e0: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20  /* We could try 
11f0: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
1200: 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29  with Tcl_Parse()
1210: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69  .  But we will i
1220: 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74  nstead.  ** just
1230: 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
1240: 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61   forbidden chara
1250: 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f  cters.  If any o
1260: 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a  f the forbidden.
1270: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
1280: 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20  appear in pCmd, 
1290: 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  we will report t
12a0: 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73  he string as uns
12b0: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  afe..  */.  cons
12c0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
12d0: 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65   n;.  z = Tcl_Ge
12e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
12f0: 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c  Cmd, &n);.  whil
1300: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
1310: 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29    int c = *(z++)
1320: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27  ;.    if( c=='$'
1330: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
1340: 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b  =';' ) return 0;
1350: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
1370: 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74  n SqlFunc struct
1380: 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ure with the giv
1390: 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65  en name.  Or cre
13a0: 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65  ate a new.** one
13b0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
13c0: 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  one cannot be fo
13d0: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  und.  Return a p
13e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
13f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1400: 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66  tatic SqlFunc *f
1410: 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74  indSqlFunc(Sqlit
1420: 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  eDb *pDb, const 
1430: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1440: 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65  SqlFunc *p, *pNe
1450: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e  w;.  int i;.  pN
1460: 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54  ew = (SqlFunc*)T
1470: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
1480: 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e  (*pNew) + strlen
1490: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20  (zName) + 1 );. 
14a0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28   pNew->zName = (
14b0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
14c0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65    for(i=0; zName
14d0: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d  [i]; i++){ pNew-
14e0: 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f  >zName[i] = tolo
14f0: 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d  wer(zName[i]); }
1500: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69  .  pNew->zName[i
1510: 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70  ] = 0;.  for(p=p
1520: 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d  Db->pFunc; p; p=
1530: 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20  p->pNext){ .    
1540: 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e  if( strcmp(p->zN
1550: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  ame, pNew->zName
1560: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
1570: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e  l_Free((char*)pN
1580: 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ew);.      retur
1590: 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n p;.    }.  }. 
15a0: 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20   pNew->interp = 
15b0: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70  pDb->interp;.  p
15c0: 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30  New->pScript = 0
15d0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
15e0: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
15f0: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65  pDb->pFunc = pNe
1600: 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  w;.  return pNew
1610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
1620: 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c  ize and free a l
1630: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
1640: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  statements.*/.st
1650: 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53  atic void flushS
1660: 74 6d 74 43 61 63 68 65 28 20 53 71 6c 69 74 65  tmtCache( Sqlite
1670: 44 62 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c  Db *pDb ){.  Sql
1680: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
1690: 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65  reStmt;..  while
16a0: 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  (  pDb->stmtList
16b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
16c0: 66 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73  finalize( pDb->s
16d0: 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29  tmtList->pStmt )
16e0: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d  ;.    pPreStmt =
16f0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a   pDb->stmtList;.
1700: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
1710: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
1720: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  t->pNext;.    Tc
1730: 6c 5f 46 72 65 65 28 20 28 63 68 61 72 2a 29 70  l_Free( (char*)p
1740: 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20  PreStmt );.  }. 
1750: 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b   pDb->nStmt = 0;
1760: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  .  pDb->stmtLast
1770: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1780: 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72  CL calls this pr
1790: 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20  ocedure when an 
17a0: 73 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65  sqlite3 database
17b0: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64   command is.** d
17c0: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
17d0: 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43  c void DbDeleteC
17e0: 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20  md(void *db){.  
17f0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
1800: 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20  (SqliteDb*)db;. 
1810: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
1820: 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pDb);.  sqlite3_
1830: 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a  close(pDb->db);.
1840: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46    while( pDb->pF
1850: 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75  unc ){.    SqlFu
1860: 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d  nc *pFunc = pDb-
1870: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d  >pFunc;.    pDb-
1880: 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e  >pFunc = pFunc->
1890: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44  pNext;.    Tcl_D
18a0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
18b0: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
18c0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
18d0: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
18e0: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
18f0: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
1900: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
1910: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
1920: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
1930: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
1940: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
1950: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
1960: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
1970: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
1980: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1990: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
19a0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
19b0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
19c0: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
19d0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
19e0: 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  le ){.    Tcl_Fr
19f0: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
1a00: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
1a10: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
1a20: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
1a30: 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
1a40: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
1a50: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1a60: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Null);.  }.  if(
1a70: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
1a80: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
1a90: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
1aa0: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d  UpdateHook);.  }
1ab0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c  .  if( pDb->pRol
1ac0: 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20  lbackHook ){.   
1ad0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1ae0: 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  t(pDb->pRollback
1af0: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
1b00: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
1b10: 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f  eded ){.    Tcl_
1b20: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
1b30: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
1b40: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65  );.  }.  Tcl_Fre
1b50: 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d  e((char*)pDb);.}
1b60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1b70: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
1b80: 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  hen a database f
1b90: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68  ile is locked wh
1ba0: 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
1bb0: 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f   execute SQL..*/
1bc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75  .static int DbBu
1bd0: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
1be0: 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b  cd, int nTries){
1bf0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1c00: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
1c10: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
1c20: 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20  ar zVal[30];..  
1c30: 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22 25  sprintf(zVal, "%
1c40: 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72  d", nTries);.  r
1c50: 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28  c = Tcl_VarEval(
1c60: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
1c70: 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56  ->zBusy, " ", zV
1c80: 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  al, (char*)0);. 
1c90: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
1ca0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
1cb0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
1cc0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
1cd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1cf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d00: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74   is invoked as t
1d10: 68 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c  he 'progress cal
1d20: 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64  lback' for the d
1d30: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1d40: 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73  ic int DbProgres
1d50: 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  sHandler(void *c
1d60: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
1d70: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
1d80: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
1d90: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a    assert( pDb->z
1da0: 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63  Progress );.  rc
1db0: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
1dc0: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  >interp, pDb->zP
1dd0: 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20  rogress);.  if( 
1de0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
1df0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
1e00: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
1e10: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
1e20: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
1e30: 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 0;.}..#ifndef
1e40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1e50: 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CE./*.** This ro
1e60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1e70: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 74 72  by the SQLite tr
1e80: 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  ace handler when
1e90: 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c  ever a new.** bl
1ea0: 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78  ock of SQL is ex
1eb0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c  ecuted.  The TCL
1ec0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
1ed0: 7a 54 72 61 63 65 20 69 73 20 65 78 65 63 75 74  zTrace is execut
1ee0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1ef0: 69 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  id DbTraceHandle
1f00: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
1f10: 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
1f20: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
1f30: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
1f40: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
1f50: 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r;..  Tcl_DStrin
1f60: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
1f70: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
1f80: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61  (&str, pDb->zTra
1f90: 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  ce, -1);.  Tcl_D
1fa0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1fb0: 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b  ent(&str, zSql);
1fc0: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
1fd0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
1fe0: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
1ff0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2000: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
2010: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
2020: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  ->interp);.}.#en
2030: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
2040: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
2050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2060: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
2070: 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c  he SQLite profil
2080: 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20  e handler after 
2090: 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53  a statement.** S
20a0: 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64 2e  QL has executed.
20b0: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
20c0: 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c   in pDb->zProfil
20d0: 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  e is evaluated..
20e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
20f0: 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28  bProfileHandler(
2100: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
2110: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69  char *zSql, sqli
2120: 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20  te_uint64 tm){. 
2130: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
2140: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
2150: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
2160: 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30  r;.  char zTm[10
2170: 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  0];..  sqlite3_s
2180: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2190: 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c  Tm)-1, zTm, "%ll
21a0: 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44  d", tm);.  Tcl_D
21b0: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
21c0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
21d0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
21e0: 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a  >zProfile, -1);.
21f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
2200: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
2210: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53   zSql);.  Tcl_DS
2220: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
2230: 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20  nt(&str, zTm);. 
2240: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
2250: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
2260: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
2270: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
2280: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
2290: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
22a0: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
22b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
22c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
22d0: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
22e0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
22f0: 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72    The.** TCL scr
2300: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d  ipt in pDb->zCom
2310: 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  mit is executed.
2320: 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20    If it returns 
2330: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69  non-zero or.** i
2340: 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65  f it throws an e
2350: 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72  xception, the tr
2360: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
2370: 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64  led back instead
2380: 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d  .** of being com
2390: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mitted..*/.stati
23a0: 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61  c int DbCommitHa
23b0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
23c0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
23d0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
23e0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
23f0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
2400: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
2410: 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
2420: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
2430: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
2440: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
2450: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
2460: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2470: 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n 0;.}..static v
2480: 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61  oid DbRollbackHa
2490: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65  ndler(void *clie
24a0: 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74  ntData){.  Sqlit
24b0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
24c0: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
24d0: 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e  ;.  assert(pDb->
24e0: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
24f0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
2500: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
2510: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52  >interp, pDb->pR
2520: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20  ollbackHook, 0) 
2530: 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67  ){.    Tcl_Backg
2540: 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e  roundError(pDb->
2550: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  interp);.  }.}..
2560: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70  static void DbUp
2570: 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76  dateHandler(.  v
2580: 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f  oid *p, .  int o
2590: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
25a0: 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *zDb, .  const c
25b0: 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71  har *zTbl, .  sq
25c0: 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64  lite_int64 rowid
25d0: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
25e0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
25f0: 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  *)p;.  Tcl_Obj *
2600: 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pCmd;..  assert(
2610: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
2620: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  k );.  assert( o
2630: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  p==SQLITE_INSERT
2640: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55   || op==SQLITE_U
2650: 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c  PDATE || op==SQL
2660: 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20  ITE_DELETE );.. 
2670: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c   pCmd = Tcl_Dupl
2680: 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55  icateObj(pDb->pU
2690: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63  pdateHook);.  Tc
26a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
26b0: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
26c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
26d0: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
26e0: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20  wStringObj(.    
26f0: 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  ( (op==SQLITE_IN
2700: 53 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28  SERT)?"INSERT":(
2710: 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54  op==SQLITE_UPDAT
2720: 45 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c  E)?"UPDATE":"DEL
2730: 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54  ETE"), -1));.  T
2740: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2750: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
2760: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2770: 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54  j(zDb, -1));.  T
2780: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2790: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
27a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
27b0: 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20  j(zTbl, -1));.  
27c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27d0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
27e0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
27f0: 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54  Obj(rowid));.  T
2800: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
2810: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
2820: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
2830: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2840: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
2850: 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  d(.  void *pCtx,
2860: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
2870: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e    int enc,.  con
2880: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
2890: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
28a0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
28b0: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
28c0: 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  *pScript = Tcl_D
28d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
28e0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
28f0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
2900: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
2910: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2920: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
2930: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
2940: 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31  ingObj(zName, -1
2950: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
2960: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
2970: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
2980: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2990: 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a  (pScript);.}../*
29a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
29c0: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f  aluate an SQL co
29d0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
29e0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
29f0: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
2a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a10: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20  tclSqlCollate(. 
2a20: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
2a30: 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nA,.  const v
2a40: 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
2a50: 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  B,.  const void 
2a60: 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c  *zB.){.  SqlColl
2a70: 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c  ate *p = (SqlCol
2a80: 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54  late *)pCtx;.  T
2a90: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
2aa0: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53   pCmd = Tcl_NewS
2ab0: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72  tringObj(p->zScr
2ac0: 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ipt, -1);.  Tcl_
2ad0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
2ae0: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
2af0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
2b00: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
2b10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2b20: 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c  (zA, nA));.  Tcl
2b30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2b40: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
2b50: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
2b60: 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29  ringObj(zB, nB))
2b70: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
2b80: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
2b90: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
2ba0: 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
2bb0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
2bc0: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
2bd0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
2be0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
2bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2c00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2c10: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
2c20: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
2c30: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
2c40: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
2c50: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
2c60: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
2c70: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2c80: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
2c90: 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b  e3_value**argv){
2ca0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20  .  SqlFunc *p = 
2cb0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
2cc0: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63  a(context);.  Tc
2cd0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69  l_Obj *pCmd;.  i
2ce0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
2cf0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
2d00: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
2d10: 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e  e are no argumen
2d20: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
2d30: 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  on, call Tcl_Eva
2d40: 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20  lObjEx on the.  
2d50: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
2d60: 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ct directly.  Th
2d70: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43  is allows the TC
2d80: 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65  L compiler to ge
2d90: 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79  nerate.    ** by
2da0: 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63  tecode for the c
2db0: 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69  ommand on the fi
2dc0: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
2dd0: 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20  nd thus make.   
2de0: 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69   ** subsequent i
2df0: 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20  nvocations much 
2e00: 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70  faster. */.    p
2e10: 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74  Cmd = p->pScript
2e20: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
2e30: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
2e40: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
2e50: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
2e60: 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63  pCmd, 0);.    Tc
2e70: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
2e80: 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
2e90: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
2ea0: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  re arguments to 
2eb0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  the function, ma
2ec0: 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70  ke a shallow cop
2ed0: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
2ee0: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c  script object, l
2ef0: 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d  append the argum
2f00: 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75  ents, then evalu
2f10: 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ate the copy..  
2f20: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22    **.    ** By "
2f30: 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77  shallow" copy, w
2f40: 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68  e mean a only th
2f50: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
2f60: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
2f70: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
2f80: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
2f90: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
2fa0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
2fb0: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
2fc0: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
2fd0: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
2fe0: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
2ff0: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
3000: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
3010: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
3020: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
3030: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
3040: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
3050: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
3060: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
3070: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
3080: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
3090: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
30a0: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
30b0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
30c0: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
30d0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
30e0: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
30f0: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
3100: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
3110: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
3120: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
3130: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
3140: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
3150: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
3160: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
3170: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
3180: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
3190: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
31a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
31b0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
31c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
31d0: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
31e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
31f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
3200: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
3210: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
3220: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
3230: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
3240: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
3250: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
3260: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
3270: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
3280: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
3290: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
32a0: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
32b0: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
32c0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
32d0: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
32e0: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
32f0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
3300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3310: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
3320: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
3330: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3340: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
3350: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
3360: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
3370: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
3380: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
3390: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
33a0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
33b0: 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  wIntObj(v);.    
33c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33d0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
33e0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
33f0: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
3400: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
3410: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
3420: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
3430: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
3440: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
3450: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
3460: 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  ble(pIn);.      
3470: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
3480: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a  ewDoubleObj(r);.
3490: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
34a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
34c0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
34d0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
34e0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b  tringObj("", 0);
34f0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
3500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3510: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
3520: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
3530: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
3540: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
3550: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
3560: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3570: 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  ((char *)sqlite3
3580: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29  _value_text(pIn)
3590: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
35a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
35b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35c0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74     rc = Tcl_List
35d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
35e0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
35f0: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  , pVal);.      i
3600: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
3610: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3620: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20  t(pCmd);.       
3630: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3640: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
3650: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
3660: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
3670: 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74  1); .        ret
3680: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
3690: 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75   }.    if( !p->u
36a0: 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20  seEvalObjv ){.  
36b0: 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f      /* Tcl_EvalO
36c0: 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f  bjEx() will auto
36d0: 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54  matically call T
36e0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66  cl_EvalObjv() if
36f0: 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69   pCmd.      ** i
3700: 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74  s a list without
3710: 20 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73   a string repres
3720: 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72  entation.  To pr
3730: 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a  event this from.
3740: 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69        ** happeni
3750: 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43  ng, make sure pC
3760: 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73  md has a valid s
3770: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
3780: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63  tion */.      Tc
3790: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64  l_GetString(pCmd
37a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
37b0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
37c0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
37d0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
37e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
37f0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
3800: 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20   }..  if( rc && 
3810: 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29  rc!=TCL_RETURN )
3820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
3830: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
3840: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
3850: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
3860: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73  p), -1); .  }els
3870: 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  e{.    Tcl_Obj *
3880: 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62  pVar = Tcl_GetOb
3890: 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  jResult(p->inter
38a0: 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  p);.    int n;. 
38b0: 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20     u8 *data;.   
38c0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70   char *zType = p
38d0: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
38e0: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
38f0: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61  me : "";.    cha
3900: 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a  r c = zType[0];.
3910: 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26      if( c=='b' &
3920: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
3930: 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26  bytearray")==0 &
3940: 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30  & pVar->bytes==0
3950: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   ){.      /* Onl
3960: 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20  y return a BLOB 
3970: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
3980: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
3990: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
39a0: 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69    ** has no stri
39b0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
39c0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61  n. */.      data
39d0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
39e0: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
39f0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
3a00: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
3a10: 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e  context, data, n
3a20: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
3a30: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
3a40: 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74  f( (c=='b' && st
3a50: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
3a60: 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  ean")==0) ||.   
3a70: 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26         (c=='i' &
3a80: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
3a90: 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20  int")==0) ){.   
3aa0: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
3ab0: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e  mObj(0, pVar, &n
3ac0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3ad0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
3ae0: 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  ext, n);.    }el
3af0: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
3b00: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
3b10: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
3b20: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
3b30: 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c      Tcl_GetDoubl
3b40: 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72  eFromObj(0, pVar
3b50: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &r);.      sql
3b60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
3b70: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a  le(context, r);.
3b80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
3b90: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
3ba0: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
3bb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
3bc0: 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20  WideInt v;.     
3bd0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
3be0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
3bf0: 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &v);.      sqlit
3c00: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
3c10: 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20  context, v);.   
3c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61   }else{.      da
3c30: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
3c40: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
3c50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
3c60: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
3c70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
3c80: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a  context, (char *
3c90: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
3ca0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
3cb0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
3cc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
3cd0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  THORIZATION./*.*
3ce0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75  * This is the au
3cf0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e  thentication fun
3d00: 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e  ction.  It appen
3d10: 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  ds the authentic
3d20: 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f  ation.** type co
3d30: 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61  de and the two a
3d40: 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64  rguments to zCmd
3d50: 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20  [] then invokes 
3d60: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e  the result.** on
3d70: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
3d80: 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20  .  The reply is 
3d90: 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65  examined to dete
3da0: 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20  rmine if the.** 
3db0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
3dc0: 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73  ails or succeeds
3dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3de0: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  auth_callback(. 
3df0: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
3e00: 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74  nt code,.  const
3e10: 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20   char *zArg1,.  
3e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
3e30: 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2,.  const char 
3e40: 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20  *zArg3,.  const 
3e50: 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20  char *zArg4.){. 
3e60: 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20   char *zCode;.  
3e70: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
3e80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
3e90: 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b  st char *zReply;
3ea0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3eb0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41   = (SqliteDb*)pA
3ec0: 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63  rg;..  switch( c
3ed0: 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
3ee0: 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20  SQLITE_COPY     
3ef0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
3f00: 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20  ="SQLITE_COPY"; 
3f10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3f20: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
3f30: 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  DEX      : zCode
3f40: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
3f50: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
3f60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3f70: 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20  REATE_TABLE     
3f80: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3f90: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20  _CREATE_TABLE"; 
3fa0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3fb0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
3fc0: 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65  MP_INDEX : zCode
3fd0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
3fe0: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
3ff0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4000: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
4010: 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53  TABLE : zCode="S
4020: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
4030: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
4040: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4050: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
4060: 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GGER: zCode="SQL
4070: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
4080: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
4090: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
40a0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
40b0: 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  W  : zCode="SQLI
40c0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
40d0: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
40e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
40f0: 41 54 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a  ATE_TRIGGER    :
4100: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
4110: 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20  REATE_TRIGGER"; 
4120: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4130: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
4140: 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  EW       : zCode
4150: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
4160: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
4170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
4180: 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20  LETE            
4190: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
41a0: 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a  DELETE"; break;.
41b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
41c0: 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20  DROP_INDEX      
41d0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
41e0: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62  E_DROP_INDEX"; b
41f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
4200: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
4210: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4220: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42  "SQLITE_DROP_TAB
4230: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
4240: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
4250: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20  _TEMP_INDEX   : 
4260: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
4270: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20  OP_TEMP_INDEX"; 
4280: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4290: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
42a0: 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65  _TABLE   : zCode
42b0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
42c0: 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  MP_TABLE"; break
42d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
42e0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
42f0: 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GER : zCode="SQL
4300: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
4310: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
4320: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
4330: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20  ROP_TEMP_VIEW   
4340: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4350: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22  _DROP_TEMP_VIEW"
4360: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4370: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  e SQLITE_DROP_TR
4380: 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f  IGGER      : zCo
4390: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
43a0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
43b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
43c0: 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20  _DROP_VIEW      
43d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
43e0: 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62  TE_DROP_VIEW"; b
43f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
4400: 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20  QLITE_INSERT    
4410: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4420: 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b  "SQLITE_INSERT";
4430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4440: 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20   SQLITE_PRAGMA  
4450: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4460: 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e="SQLITE_PRAGMA
4470: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4480: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20  se SQLITE_READ  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
44a0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44  ode="SQLITE_READ
44b0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
44c0: 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  se SQLITE_SELECT
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
44e0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45  ode="SQLITE_SELE
44f0: 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CT"; break;.    
4500: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e  case SQLITE_TRAN
4510: 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20  SACTION       : 
4520: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52  zCode="SQLITE_TR
4530: 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61  ANSACTION"; brea
4540: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4550: 54 45 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  TE_UPDATE       
4560: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
4570: 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72  LITE_UPDATE"; br
4580: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4590: 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20 20 20  LITE_ATTACH     
45a0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
45b0: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20  SQLITE_ATTACH"; 
45c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
45d0: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20  SQLITE_DETACH   
45e0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
45f0: 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22  ="SQLITE_DETACH"
4600: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4610: 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  e SQLITE_ALTER_T
4620: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
4630: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52  de="SQLITE_ALTER
4640: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
4650: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4660: 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
4670: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
4680: 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61  E_REINDEX"; brea
4690: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
46a0: 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20  TE_ANALYZE      
46b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
46c0: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62  LITE_ANALYZE"; b
46d0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
46e0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
46f0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4700: 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20  "????"; break;. 
4710: 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67   }.  Tcl_DString
4720: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
4730: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
4740: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68  &str, pDb->zAuth
4750: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
4760: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4770: 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a  t(&str, zCode);.
4780: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4790: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
47a0: 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a   zArg1 ? zArg1 :
47b0: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
47c0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
47d0: 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a  (&str, zArg2 ? z
47e0: 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg2 : "");.  Tc
47f0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
4800: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
4810: 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29  g3 ? zArg3 : "")
4820: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
4830: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
4840: 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34  r, zArg4 ? zArg4
4850: 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54   : "");.  rc = T
4860: 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44  cl_GlobalEval(pD
4870: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
4880: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
4890: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
48a0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a  gFree(&str);.  z
48b0: 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53  Reply = Tcl_GetS
48c0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
48d0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  >interp);.  if( 
48e0: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
48f0: 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b  QLITE_OK")==0 ){
4900: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4910: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
4920: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
4930: 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30  SQLITE_DENY")==0
4940: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
4950: 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73  ITE_DENY;.  }els
4960: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
4970: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f  ply,"SQLITE_IGNO
4980: 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  RE")==0 ){.    r
4990: 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  c = SQLITE_IGNOR
49a0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
49b0: 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20  rc = 999;.  }.  
49c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
49d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
49e0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
49f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74   */../*.** zText
4a00: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4a10: 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76   text obtained v
4a20: 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65  ia an sqlite3_re
4a30: 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f  sult_text().** o
4a40: 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66  r similar interf
4a50: 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ace. This routin
4a60: 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20  e returns a Tcl 
4a70: 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a  string object, .
4a80: 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ** reference cou
4a90: 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e  nt set to 0, con
4aa0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74  taining the text
4ab0: 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69  . If a translati
4ac0: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73  on.** between is
4ad0: 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20  o8859 and UTF-8 
4ae0: 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20  is required, it 
4af0: 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f  is preformed..*/
4b00: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
4b10: 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61  *dbTextToObj(cha
4b20: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b  r const *zText){
4b30: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c  .  Tcl_Obj *pVal
4b40: 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41  ;.#ifdef UTF_TRA
4b50: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a  NSLATION_NEEDED.
4b60: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43    Tcl_DString dC
4b70: 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ol;.  Tcl_DStrin
4b80: 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20  gInit(&dCol);.  
4b90: 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74  Tcl_ExternalToUt
4ba0: 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a  fDString(NULL, z
4bb0: 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29  Text, -1, &dCol)
4bc0: 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e  ;.  pVal = Tcl_N
4bd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
4be0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43  DStringValue(&dC
4bf0: 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ol), -1);.  Tcl_
4c00: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f  DStringFree(&dCo
4c10: 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c  l);.#else.  pVal
4c20: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4c30: 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a  Obj(zText, -1);.
4c40: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
4c50: 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pVal;.}../*.** T
4c60: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
4c70: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
4c80: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
4c90: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
4ca0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
4cb0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
4cc0: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
4cd0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
4ce0: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
4cf0: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
4d00: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
4d10: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
4d20: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ls..**.** The in
4d30: 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20  terface is like 
4d40: 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e  "readline" but n
4d50: 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65  o command-line e
4d60: 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e  diting.** is don
4d70: 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20  e..**.** copied 
4d80: 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f  from shell.c fro
4d90: 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d  m '.import' comm
4da0: 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  and.*/.static ch
4db0: 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  ar *local_getlin
4dc0: 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c  e(char *zPrompt,
4dd0: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
4de0: 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74  ar *zLine;.  int
4df0: 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b   nLine;.  int n;
4e00: 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e  .  int eol;..  n
4e10: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
4e20: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
4e30: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
4e40: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
4e50: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c  ;.  n = 0;.  eol
4e60: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21   = 0;.  while( !
4e70: 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  eol ){.    if( n
4e80: 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20  +100>nLine ){.  
4e90: 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e      nLine = nLin
4ea0: 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20  e*2 + 100;.     
4eb0: 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63   zLine = realloc
4ec0: 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a  (zLine, nLine);.
4ed0: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d        if( zLine=
4ee0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4ef0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65     }.    if( fge
4f00: 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c  ts(&zLine[n], nL
4f10: 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20  ine - n, in)==0 
4f20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  ){.      if( n==
4f30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65  0 ){.        fre
4f40: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
4f50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4f60: 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b    }.      zLine[
4f70: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
4f80: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  l = 1;.      bre
4f90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  ak;.    }.    wh
4fa0: 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b  ile( zLine[n] ){
4fb0: 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   n++; }.    if( 
4fc0: 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31  n>0 && zLine[n-1
4fd0: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
4fe0: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   n--;.      zLin
4ff0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
5000: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  eol = 1;.    }. 
5010: 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61   }.  zLine = rea
5020: 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31  lloc( zLine, n+1
5030: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69   );.  return zLi
5040: 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ne;.}../*.** The
5050: 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
5060: 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20  d below creates 
5070: 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  a new Tcl comman
5080: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
5090: 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e  nnection it open
50a0: 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64  s to an SQLite d
50b0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
50c0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
50d0: 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e  d.** whenever on
50e0: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
50f0: 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63  ction-specific c
5100: 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75  ommands is execu
5110: 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20  ted.** in Tcl.  
5120: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
5130: 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65  you run Tcl code
5140: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
5150: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  *       sqlite3 
5160: 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73  db1  "my_databas
5170: 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20  e".**       db1 
5180: 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  close.**.** The 
5190: 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70  first command op
51a0: 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ens a connection
51b0: 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61   to the "my_data
51c0: 62 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a  base" database.*
51d0: 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74  * and calls that
51e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31   connection "db1
51f0: 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63  ".  The second c
5200: 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68  ommand causes th
5210: 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  is.** subroutine
5220: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a   to be invoked..
5230: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
5240: 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c  ObjCmd(void *cd,
5250: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5260: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
5270: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
5280: 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
5290: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
52a0: 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63  )cd;.  int choic
52b0: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43  e;.  int rc = TC
52c0: 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63  L_OK;.  static c
52d0: 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74  onst char *DB_st
52e0: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75  rs[] = {.    "au
52f0: 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20  thorizer",      
5300: 20 20 20 22 62 75 73 79 22 2c 20 20 20 20 20 20     "busy",      
5310: 20 20 20 20 20 20 20 20 22 63 61 63 68 65 22 2c          "cache",
5320: 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20  .    "changes", 
5330: 20 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73             "clos
5340: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5350: 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20 20 22  "collate",.    "
5360: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
5370: 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f  ",   "commit_hoo
5380: 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d 70 6c  k",       "compl
5390: 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70 79 22  ete",.    "copy"
53a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
53b0: 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20  "errorcode",    
53c0: 20 20 20 20 20 22 65 76 61 6c 22 2c 0a 20 20 20       "eval",.   
53d0: 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20 20   "exists",      
53e0: 20 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e         "function
53f0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 6c 61 73  ",          "las
5400: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
5410: 0a 20 20 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22  .    "nullvalue"
5420: 2c 20 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63  ,          "onec
5430: 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20  olumn",         
5440: 22 70 72 6f 66 69 6c 65 22 2c 0a 20 20 20 20 22  "profile",.    "
5450: 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20  progress",      
5460: 20 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20       "rekey",   
5470: 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c 62            "rollb
5480: 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22  ack_hook",.    "
5490: 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
54a0: 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e       "total_chan
54b0: 67 65 73 22 2c 20 20 20 20 20 22 74 72 61 63 65  ges",     "trace
54c0: 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61 63 74  ",.    "transact
54d0: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22 75 70  ion",        "up
54e0: 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  date_hook",     
54f0: 20 20 22 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20    "version",.   
5500: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5510: 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e        .  };.  en
5520: 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20  um DB_enum {.   
5530: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20   DB_AUTHORIZER, 
5540: 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 20         DB_BUSY, 
5550: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
5560: 41 43 48 45 2c 0a 20 20 20 20 44 42 5f 43 48 41  ACHE,.    DB_CHA
5570: 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 20  NGES,           
5580: 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 20  DB_CLOSE,       
5590: 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c       DB_COLLATE,
55a0: 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  .    DB_COLLATIO
55b0: 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42 5f 43 4f  N_NEEDED,  DB_CO
55c0: 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20  MMIT_HOOK,      
55d0: 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20  DB_COMPLETE,.   
55e0: 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20   DB_COPY,       
55f0: 20 20 20 20 20 20 20 44 42 5f 45 52 52 4f 52 43         DB_ERRORC
5600: 4f 44 45 2c 20 20 20 20 20 20 20 20 44 42 5f 45  ODE,        DB_E
5610: 56 41 4c 2c 0a 20 20 20 20 44 42 5f 45 58 49 53  VAL,.    DB_EXIS
5620: 54 53 2c 20 20 20 20 20 20 20 20 20 20 20 20 44  TS,            D
5630: 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20  B_FUNCTION,     
5640: 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45      DB_LAST_INSE
5650: 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44 42  RT_ROWID,.    DB
5660: 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20 20  _NULLVALUE,     
5670: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
5680: 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f 46  ,        DB_PROF
5690: 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f 47  ILE,.    DB_PROG
56a0: 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 20 44  RESS,          D
56b0: 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20 20  B_REKEY,        
56c0: 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f      DB_ROLLBACK_
56d0: 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54 49 4d  HOOK,.    DB_TIM
56e0: 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 20  EOUT,           
56f0: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
5700: 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a 20  ,    DB_TRACE,. 
5710: 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f     DB_TRANSACTIO
5720: 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50 44 41  N,       DB_UPDA
5730: 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42  TE_HOOK,      DB
5740: 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20 20  _VERSION.  };.  
5750: 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74  /* don't leave t
5760: 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f  railing commas o
5770: 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f  n DB_enum, it co
5780: 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78  nfuses the AIX x
5790: 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a  lc compiler */..
57a0: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
57b0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
57c0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
57d0: 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e  objv, "SUBCOMMAN
57e0: 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74  D ...");.    ret
57f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5800: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
5810: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
5820: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42  erp, objv[1], DB
5830: 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  _strs, "option",
5840: 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a   0, &choice) ){.
5850: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5860: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  RROR;.  }..  swi
5870: 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e  tch( (enum DB_en
5880: 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20  um)choice ){..  
5890: 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72  /*    $db author
58a0: 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  izer ?CALLBACK?.
58b0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
58c0: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
58d0: 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65  ack to authorize
58e0: 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74   each SQL operat
58f0: 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a  ion as it is.  *
5900: 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61  * compiled.  5 a
5910: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70  rguments are app
5920: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c  ended to the cal
5930: 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20  lback before it 
5940: 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a  is.  ** invoked:
5950: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29  .  **.  **   (1)
5960: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
5970: 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c  on type (ex: SQL
5980: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5990: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
59a0: 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29   ...).  **   (2)
59b0: 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69   First descripti
59c0: 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73  ve name (depends
59d0: 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   on authorizatio
59e0: 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28  n type).  **   (
59f0: 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69  3) Second descri
5a00: 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20  ptive name.  ** 
5a10: 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68    (4) Name of th
5a20: 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20  e database (ex: 
5a30: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a  "main", "temp").
5a40: 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20    **   (5) Name 
5a50: 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20  of trigger that 
5a60: 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63  is doing the acc
5a70: 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ess.  **.  ** Th
5a80: 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c  e callback shoul
5a90: 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74  d return on of t
5aa0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5ab0: 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c  ings: SQLITE_OK,
5ac0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e  .  ** SQLITE_IGN
5ad0: 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44  ORE, or SQLITE_D
5ae0: 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ENY.  Any other 
5af0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
5b00: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20  an error..  **. 
5b10: 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68   ** If this meth
5b20: 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  od is invoked wi
5b30: 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c  th no arguments,
5b40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74   the current aut
5b50: 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  horization.  ** 
5b60: 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20  callback string 
5b70: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
5b80: 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48  /.  case DB_AUTH
5b90: 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66  ORIZER: {.#ifdef
5ba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5bb0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54  HORIZATION.    T
5bc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5bd0: 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69  interp, "authori
5be0: 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c  zation not avail
5bf0: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
5c00: 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ld", 0);.    ret
5c10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
5c20: 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a  else.    if( obj
5c30: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
5c40: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
5c50: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
5c60: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
5c70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5c80: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
5c90: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
5ca0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
5cb0: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
5cc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5cd0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75  interp, pDb->zAu
5ce0: 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  th, 0);.      }.
5cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d00: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20   char *zAuth;.  
5d10: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
5d20: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
5d30: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
5d40: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
5d50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5d60: 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74   zAuth = Tcl_Get
5d70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
5d80: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
5d90: 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26      if( zAuth &&
5da0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
5db0: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54    pDb->zAuth = T
5dc0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
5dd0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
5de0: 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20  cpy(pDb->zAuth, 
5df0: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 65  zAuth);.      }e
5e00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
5e10: 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->zAuth = 0;.   
5e20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5e30: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
5e40: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
5e50: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
5e60: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
5e70: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
5e80: 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  b, auth_callback
5e90: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
5ea0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5eb0: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
5ec0: 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  zer(pDb->db, 0, 
5ed0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
5ee0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
5ef0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
5f00: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
5f10: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
5f20: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
5f30: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
5f40: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
5f50: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
5f60: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
5f70: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
5f80: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
5f90: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
5fa0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
5fb0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5fc0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
5fd0: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
5fe0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5ff0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
6000: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
6010: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
6020: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
6030: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6040: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30  p, pDb->zBusy, 0
6050: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
6070: 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69   *zBusy;.      i
6080: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
6090: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
60a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
60b0: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
60c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73      }.      zBus
60d0: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
60e0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
60f0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
6100: 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e  f( zBusy && len>
6110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
6120: 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c  ->zBusy = Tcl_Al
6130: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
6140: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
6150: 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79  Db->zBusy, zBusy
6160: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6170: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
6180: 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sy = 0;.      }.
6190: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
61a0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
61b0: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
61c0: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
61d0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
61e0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75  er(pDb->db, DbBu
61f0: 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  syHandler, pDb);
6200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
6220: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
6230: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
6240: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
6250: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
6260: 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73    $db cache flus
6270: 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  h.  **     $db c
6280: 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a  ache size n.  **
6290: 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  .  ** Flush the 
62a0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
62b0: 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74  nt cache, or set
62c0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
62d0: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68  ber of.  ** cach
62e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
62f0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41   */.  case DB_CA
6300: 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  CHE: {.    char 
6310: 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74  *subCmd;.    int
6320: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   n;..    if( obj
6330: 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c<=2 ){.      Tc
6340: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6350: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
6360: 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61  "cache option ?a
6370: 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  rg?");.      ret
6380: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6390: 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20     }.    subCmd 
63a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
63b0: 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c  romObj( objv[2],
63c0: 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73   0 );.    if( *s
63d0: 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74  ubCmd=='f' && st
63e0: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75  rcmp(subCmd,"flu
63f0: 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sh")==0 ){.     
6400: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
6410: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
6420: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6430: 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68   2, objv, "flush
6440: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
6450: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6470: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
6480: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
6490: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
64a0: 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20  *subCmd=='s' && 
64b0: 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73  strcmp(subCmd,"s
64c0: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
64d0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
64e0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
64f0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6500: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65  , 2, objv, "size
6510: 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65   n");.        re
6520: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6530: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6540: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52       if( TCL_ERR
6550: 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OR==Tcl_GetIntFr
6560: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
6570: 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20  jv[3], &n) ){.  
6580: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
6590: 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
65a0: 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72  , "cannot conver
65b0: 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  t \"", .        
65c0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
65d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
65e0: 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69  [3],0), "\" to i
65f0: 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20  nteger", 0);.   
6600: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
6610: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
6620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6630: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
6640: 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74           flushSt
6650: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
6660: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
6670: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
6680: 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45  se if( n>MAX_PRE
6690: 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20  PARED_STMTS ){. 
66a0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d             n = M
66b0: 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
66c0: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  S;.          }. 
66d0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61           pDb->ma
66e0: 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20  xStmt = n;.     
66f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
6710: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
6720: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74  interp, "bad opt
6730: 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20  ion \"", .      
6740: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
6750: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
6760: 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62  ,0), "\": must b
6770: 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22  e flush or size"
6780: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
6790: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
67a0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
67b0: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62   }..  /*     $db
67c0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20   changes.  **.  
67d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
67e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
67f0: 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
6800: 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
6810: 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68  leted by.  ** th
6820: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e  e most recent IN
6830: 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
6840: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
6850: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  , not including 
6860: 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65  .  ** any change
6870: 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65  s made by trigge
6880: 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f  r programs..  */
6890: 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47  .  case DB_CHANG
68a0: 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
68b0: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
68c0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
68d0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
68e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
68f0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
6900: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6910: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
6920: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
6930: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
6940: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
6950: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
6960: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62  ite3_changes(pDb
6970: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
6980: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
6990: 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20  $db close.  **. 
69a0: 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65   ** Shutdown the
69b0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20   database.  */. 
69c0: 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20   case DB_CLOSE: 
69d0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  {.    Tcl_Delete
69e0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
69f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6a00: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
6a10: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
6a20: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
6a30: 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d   $db collate NAM
6a40: 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
6a50: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
6a60: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
6a70: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
6a80: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
6a90: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
6aa0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
6ab0: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
6ac0: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
6ad0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
6ae0: 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  DB_COLLATE: {.  
6af0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
6b00: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72  ollate;.    char
6b10: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
6b20: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
6b30: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
6b40: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
6b50: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6b60: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6b70: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
6b80: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
6b90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6ba0: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
6bb0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6bc0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
6bd0: 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
6be0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6bf0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
6c00: 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
6c10: 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f  Collate = (SqlCo
6c20: 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63  llate*)Tcl_Alloc
6c30: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61  ( sizeof(*pColla
6c40: 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20  te) + nScript + 
6c50: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  1 );.    if( pCo
6c60: 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72  llate==0 ) retur
6c70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6c80: 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72   pCollate->inter
6c90: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
6ca0: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20  pCollate->pNext 
6cb0: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
6cc0: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a  .    pCollate->z
6cd0: 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29  Script = (char*)
6ce0: 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20  &pCollate[1];.  
6cf0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
6d00: 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  = pCollate;.    
6d10: 73 74 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d  strcpy(pCollate-
6d20: 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70  >zScript, zScrip
6d30: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  t);.    if( sqli
6d40: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
6d50: 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
6d60: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
6d70: 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  , .        pColl
6d80: 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61  ate, tclSqlColla
6d90: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  te) ){.      Tcl
6da0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
6db0: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
6dc0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
6dd0: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
6de0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6df0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6e00: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6e10: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
6e20: 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  db collation_nee
6e30: 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ded SCRIPT.  **.
6e40: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
6e50: 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
6e60: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
6e70: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
6e80: 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
6e90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
6ea0: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
6eb0: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
6ec0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
6ed0: 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e  e DB_COLLATION_N
6ee0: 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28  EEDED: {.    if(
6ef0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
6f00: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6f10: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
6f20: 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
6f30: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6f40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6f50: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
6f60: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
6f70: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6f80: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
6f90: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  Needed);.    }. 
6fa0: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
6fb0: 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70  Needed = Tcl_Dup
6fc0: 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32  licateObj(objv[2
6fd0: 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  ]);.    Tcl_Incr
6fe0: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
6ff0: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
7000: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61     sqlite3_colla
7010: 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d  tion_needed(pDb-
7020: 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c  >db, pDb, tclCol
7030: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
7040: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
7050: 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f  *    $db commit_
7060: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  hook ?CALLBACK?.
7070: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
7080: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
7090: 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ack just before 
70a0: 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79  committing every
70b0: 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   SQL transaction
70c0: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
70d0: 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e  llback throws an
70e0: 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65   exception or re
70f0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
7100: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72  then the.  ** tr
7110: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f  ansaction is abo
7120: 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41  rted.  If CALLBA
7130: 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  CK is an empty s
7140: 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62  tring, the callb
7150: 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ack.  ** is disa
7160: 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  bled..  */.  cas
7170: 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b  e DB_COMMIT_HOOK
7180: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
7190: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
71a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
71b0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
71c0: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
71d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
71e0: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
71f0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
7200: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
7210: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
7220: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7230: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  (interp, pDb->zC
7240: 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  ommit, 0);.     
7250: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
7260: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
7270: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
7280: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
7290: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
72a0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
72b0: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
72c0: 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
72d0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
72e0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
72f0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
7300: 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
7310: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
7320: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
7330: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
7340: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
7350: 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
7360: 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   zCommit);.     
7370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7380: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
7390: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
73a0: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
73b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
73c0: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
73d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
73e0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
73f0: 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
7400: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
7410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7420: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
7430: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
7440: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
7450: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
7460: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
7470: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
7480: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
7490: 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
74a0: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
74b0: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
74c0: 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
74d0: 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
74e0: 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
74f0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
7500: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
7510: 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
7520: 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
7530: 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
7540: 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
7550: 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
7560: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
7570: 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
7580: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
7590: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
75a0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
75b0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
75c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
75d0: 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
75e0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
75f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
7600: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
7610: 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
7620: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7630: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
7640: 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
7650: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
7660: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
7670: 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
7680: 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
7690: 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
76a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
76b0: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
76c0: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
76d0: 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
76e0: 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
76f0: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
7700: 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
7710: 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
7720: 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
7730: 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
7740: 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
7750: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
7760: 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
7770: 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
7780: 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
7790: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
77a0: 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
77b0: 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
77c0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
77d0: 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
77e0: 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
77f0: 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
7800: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
7810: 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
7820: 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
7830: 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
7840: 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
7850: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
7860: 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
7870: 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
7880: 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
7890: 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
78a0: 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
78b0: 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
78c0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
78d0: 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
78e0: 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
78f0: 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
7900: 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
7910: 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
7920: 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
7930: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
7940: 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
7950: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
7960: 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
7970: 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
7980: 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
7990: 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
79a0: 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
79b0: 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
79c0: 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
79d0: 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
79e0: 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
79f0: 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
7a00: 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
7a10: 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
7a20: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
7a30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7a40: 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
7a50: 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
7a60: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
7a70: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
7a80: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
7a90: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
7aa0: 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
7ab0: 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
7ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7ad0: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
7ae0: 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
7af0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
7b00: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
7b10: 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
7b20: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  */.    int rc;  
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
7b50: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  e */.    int nCo
7b60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7b70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7b80: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
7b90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
7ba0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
7bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7bc0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
7bd0: 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f  an SQL string */
7be0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  .    int i, j;  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7c10: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
7c20: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
7c30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7c40: 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b  f bytes in zSep[
7c50: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75  ] */.    int nNu
7c60: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7c70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7c80: 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c  f bytes in zNull
7c90: 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  [] */.    char *
7ca0: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
7cb0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20        /* An SQL 
7cc0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
7cd0: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20   char *zLine;   
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7cf0: 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  A single line of
7d00: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
7d10: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
7d20: 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20   **azCol;       
7d30: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65          /* zLine
7d40: 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74  [] broken up int
7d50: 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  o columns */.   
7d60: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d80: 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68  How to commit ch
7d90: 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c  anges */.    FIL
7da0: 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
7db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7dc0: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
7dd0: 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30    int lineno = 0
7de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7df0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20   Line number of 
7e00: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
7e10: 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b    char zLineNum[
7e20: 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  80];          /*
7e30: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69   Line number pri
7e40: 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  nt buffer */.   
7e50: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
7e60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
7e70: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f  interp result */
7e80: 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70  ..    char *zSep
7e90: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c  ;.    char *zNul
7ea0: 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  l;.    if( objc<
7eb0: 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20  5 || objc>7 ){. 
7ec0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
7ed0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
7ee0: 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20   objv, .        
7ef0: 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52   "CONFLICT-ALGOR
7f00: 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e  ITHM TABLE FILEN
7f10: 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  AME ?SEPARATOR? 
7f20: 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22  ?NULLINDICATOR?"
7f30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7f40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7f50: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36  .    if( objc>=6
7f60: 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d   ){.      zSep =
7f70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
7f80: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30  omObj(objv[5], 0
7f90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7fa0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b      zSep = "\t";
7fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
7fc0: 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20  bjc>=7 ){.      
7fd0: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
7fe0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
7ff0: 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[6], 0);.    }e
8000: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  lse{.      zNull
8010: 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20   = "";.    }.   
8020: 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c   zConflict = Tcl
8030: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8040: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
8050: 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
8060: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8070: 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20  (objv[3], 0);.  
8080: 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
8090: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
80a0: 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[4], 0);.    
80b0: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53  nSep = strlen(zS
80c0: 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d  ep);.    nNull =
80d0: 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a   strlen(zNull);.
80e0: 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
80f0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
8100: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8110: 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75  , "Error: non-nu
8120: 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  ll separator req
8130: 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c  uired for copy",
8140: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
8150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8160: 20 7d 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65   }.    if(sqlite
8170: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
8180: 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20  ct, "rollback") 
8190: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
81a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
81b0: 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
81c0: 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
81d0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
81e0: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66  mp(zConflict, "f
81f0: 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26  ail"    ) != 0 &
8200: 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  &.       sqlite3
8210: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
8220: 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
8230: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
8240: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
8250: 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65  nflict, "replace
8260: 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20  " ) != 0 ) {.   
8270: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8280: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
8290: 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69  or: \"", zConfli
82a0: 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ct, .           
82b0: 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61   "\", conflict-a
82c0: 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65  lgorithm must be
82d0: 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63   one of: rollbac
82e0: 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  k, ".           
82f0: 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69   "abort, fail, i
8300: 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63  gnore, or replac
8310: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
8320: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8330: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
8340: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8350: 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
8360: 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  '%q'", zTable);.
8370: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
8380: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
8390: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
83a0: 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63  , "Error: no suc
83b0: 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62  h table: ", zTab
83c0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  le, 0);.      re
83d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
83e0: 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
83f0: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
8400: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8410: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
8420: 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d  , zSql, 0, &pStm
8430: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
8440: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
8450: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
8460: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8470: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
8480: 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
8490: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
84a0: 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
84b0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
84c0: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
84d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
84e0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
84f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
8500: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
8510: 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
8520: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8530: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8540: 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
8550: 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
8560: 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
8570: 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
8580: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8590: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
85a0: 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
85b0: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  )", 0);.      re
85c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
85d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
85e0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
85f0: 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +50, zSql, "INSE
8600: 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25  RT OR %q INTO '%
8610: 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20  q' VALUES(?",.  
8620: 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74         zConflict
8630: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
8640: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
8650: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
8660: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8670: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
8680: 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
8690: 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
86a0: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
86b0: 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
86c0: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
86d0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
86e0: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  Db->db, zSql, 0,
86f0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
8700: 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20   free(zSql);.   
8710: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
8720: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8730: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8740: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
8750: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
8760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8770: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
8780: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8790: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
87a0: 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46     in = fopen(zF
87b0: 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  ile, "rb");.    
87c0: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
87d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
87e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
87f0: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
8800: 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20  file: ", zFile, 
8810: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
8820: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8830: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
8840: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8850: 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20    }.    azCol = 
8860: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
8870: 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31  zCol[0])*(nCol+1
8880: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43  ) );.    if( azC
8890: 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ol==0 ) {.      
88a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
88b0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
88c0: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
88d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f  , 0);.      fclo
88e0: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65  se(in);.      re
88f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8900: 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29      }.    (void)
8910: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
8920: 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  ->db, "BEGIN", 0
8930: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f  , 0, 0);.    zCo
8940: 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b  mmit = "COMMIT";
8950: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69  .    while( (zLi
8960: 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69  ne = local_getli
8970: 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b  ne(0, in))!=0 ){
8980: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  .      char *z;.
8990: 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20        i = 0;.   
89a0: 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
89b0: 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c     azCol[0] = zL
89c0: 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ine;.      for(i
89d0: 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b  =0, z=zLine; *z;
89e0: 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   z++){.        i
89f0: 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26  f( *z==zSep[0] &
8a00: 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65  & strncmp(z, zSe
8a10: 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20  p, nSep)==0 ){. 
8a20: 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b           *z = 0;
8a30: 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
8a40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
8a50: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
8a60: 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26      azCol[i] = &
8a70: 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20  z[nSep];.       
8a80: 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31       z += nSep-1
8a90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8ab0: 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e        if( i+1!=n
8ac0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Col ){.        c
8ad0: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
8ae0: 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63     zErr = malloc
8af0: 28 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46  (200 + strlen(zF
8b00: 69 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ile));.        i
8b10: 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
8b20: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72       sprintf(zEr
8b30: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
8b40: 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20  "Error: %s line 
8b50: 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
8b60: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
8b70: 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20  but found %d",. 
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
8b90: 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c  e, lineno, nCol,
8ba0: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
8bb0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8bc0: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20  t(interp, zErr, 
8bd0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72  0);.          fr
8be0: 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ee(zErr);.      
8bf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d    }.        zCom
8c00: 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
8c10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8c20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
8c30: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
8c40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
8c50: 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20   check for null 
8c60: 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e  data, if so, bin
8c70: 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  d as null */.   
8c80: 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e       if ((nNull>
8c90: 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f  0 && strcmp(azCo
8ca0: 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29  l[i], zNull)==0)
8cb0: 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c   || strlen(azCol
8cc0: 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20  [i])==0) {.     
8cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
8ce0: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b  d_null(pStmt, i+
8cf0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
8d00: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
8d10: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
8d20: 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c  Stmt, i+1, azCol
8d30: 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
8d40: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
8d50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
8d60: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
8d70: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
8d80: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
8d90: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65  Stmt);.      fre
8da0: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
8db0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8dc0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
8dd0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8de0: 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20  terp,"Error: ", 
8df0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
8e00: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
8e10: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
8e20: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
8e30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8e40: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
8e50: 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c  (azCol);.    fcl
8e60: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c  ose(in);.    sql
8e70: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8e80: 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  tmt);.    (void)
8e90: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
8ea0: 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30  ->db, zCommit, 0
8eb0: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66  , 0, 0);..    if
8ec0: 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20  ( zCommit[0] == 
8ed0: 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  'C' ){.      /* 
8ee0: 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73  success, set res
8ef0: 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66  ult as number of
8f00: 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64   lines processed
8f10: 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c   */.      pResul
8f20: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
8f30: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
8f40: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
8f50: 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e  j(pResult, linen
8f60: 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  o);.      rc = T
8f70: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
8f80: 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75  {.      /* failu
8f90: 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e  re, append linen
8fa0: 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a  o where failed *
8fb0: 2f 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  /.      sprintf(
8fc0: 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69  zLineNum,"%d",li
8fd0: 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c  neno);.      Tcl
8fe0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8ff0: 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77  terp,", failed w
9000: 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  hile processing 
9010: 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d  line: ",zLineNum
9020: 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ,0);.      rc = 
9030: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9040: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
9050: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
9060: 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a  b errorcode.  **
9070: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
9080: 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63   numeric error c
9090: 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65 74  ode that was ret
90a0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73  urned by the mos
90b0: 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61  t recent.  ** ca
90c0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
90d0: 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ec()..  */.  cas
90e0: 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20  e DB_ERRORCODE: 
90f0: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
9100: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
9110: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
9120: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
9130: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65  ->db)));.    bre
9140: 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a  ak;.  }.   .  /*
9150: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61  .  **    $db eva
9160: 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f  l $sql ?array? ?
9170: 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f  {  ...code... }?
9180: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65  .  **    $db one
9190: 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a  column $sql.  **
91a0: 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 20 73 74  .  ** The SQL st
91b0: 61 74 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20  atement in $sql 
91c0: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 46  is evaluated.  F
91d0: 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 74 68 65  or each row, the
91e0: 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a   values are.  **
91f0: 20 70 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d 65   placed in eleme
9200: 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72 61 79  nts of the array
9210: 20 6e 61 6d 65 64 20 22 61 72 72 61 79 22 20 61   named "array" a
9220: 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73  nd ...code... is
9230: 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20   executed..  ** 
9240: 49 66 20 22 61 72 72 61 79 22 20 61 6e 64 20 22  If "array" and "
9250: 63 6f 64 65 22 20 61 72 65 20 6f 6d 69 74 74 65  code" are omitte
9260: 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62  d, then no callb
9270: 61 63 6b 20 69 73 20 65 76 65 72 79 20 69 6e 76  ack is every inv
9280: 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  oked..  ** If "a
9290: 72 72 61 79 22 20 69 73 20 61 6e 20 65 6d 70 74  rray" is an empt
92a0: 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74  y string, then t
92b0: 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 70 6c  he values are pl
92c0: 61 63 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65  aced in variable
92d0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 76 65  s.  ** that have
92e0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
92f0: 73 20 74 68 65 20 66 69 65 6c 64 73 20 65 78 74  s the fields ext
9300: 72 61 63 74 65 64 20 62 79 20 74 68 65 20 71 75  racted by the qu
9310: 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ery..  **.  ** T
9320: 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74  he onecolumn met
9330: 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69 76  hod is the equiv
9340: 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20  alent of:.  **  
9350: 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65     lindex [$db e
9360: 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f  val $sql] 0.  */
9370: 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f  .  case DB_ONECO
9380: 4c 55 4d 4e 3a 0a 20 20 63 61 73 65 20 44 42 5f  LUMN:.  case DB_
9390: 45 56 41 4c 3a 0a 20 20 63 61 73 65 20 44 42 5f  EVAL:.  case DB_
93a0: 45 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 63 68  EXISTS: {.    ch
93b0: 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b 20  ar const *zSql; 
93c0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53 51 4c       /* Next SQL
93d0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   statement to ex
93e0: 65 63 75 74 65 20 2a 2f 0a 20 20 20 20 63 68 61  ecute */.    cha
93f0: 72 20 63 6f 6e 73 74 20 2a 7a 4c 65 66 74 3b 20  r const *zLeft; 
9400: 20 20 20 20 2f 2a 20 57 68 61 74 20 69 73 20 6c      /* What is l
9410: 65 66 74 20 61 66 74 65 72 20 66 69 72 73 74 20  eft after first 
9420: 73 74 6d 74 20 69 6e 20 7a 53 71 6c 20 2a 2f 0a  stmt in zSql */.
9430: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
9440: 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 6f   *pStmt;   /* Co
9450: 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74 6d  mpiled SQL statm
9460: 65 6e 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  ent */.    Tcl_O
9470: 62 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20  bj *pArray;     
9480: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72    /* Name of arr
9490: 61 79 20 69 6e 74 6f 20 77 68 69 63 68 20 72 65  ay into which re
94a0: 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65  sults are writte
94b0: 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  n */.    Tcl_Obj
94c0: 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20 20   *pScript;      
94d0: 2f 2a 20 53 63 72 69 70 74 20 74 6f 20 72 75 6e  /* Script to run
94e0: 20 66 6f 72 20 65 61 63 68 20 72 65 73 75 6c 74   for each result
94f0: 20 73 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   set */.    Tcl_
9500: 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20  Obj **apParm;   
9510: 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73     /* Parameters
9520: 20 74 68 61 74 20 6e 65 65 64 20 61 20 54 63 6c   that need a Tcl
9530: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 29 20  _DecrRefCount() 
9540: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 6d  */.    int nParm
9550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9560: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
9570: 65 73 20 75 73 65 64 20 69 6e 20 61 70 50 61 72  es used in apPar
9580: 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  m[] */.    Tcl_O
9590: 62 6a 20 2a 61 50 61 72 6d 5b 31 30 5d 3b 20 20  bj *aParm[10];  
95a0: 20 20 2f 2a 20 53 74 61 74 69 63 20 73 70 61 63    /* Static spac
95b0: 65 20 66 6f 72 20 61 70 50 61 72 6d 5b 5d 20 69  e for apParm[] i
95c0: 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
95d0: 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  e */.    Tcl_Obj
95e0: 20 2a 70 52 65 74 3b 20 20 20 20 20 20 20 20 20   *pRet;         
95f0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20 72  /* Value to be r
9600: 65 74 75 72 6e 65 64 20 2a 2f 0a 20 20 20 20 53  eturned */.    S
9610: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
9620: 70 50 72 65 53 74 6d 74 3b 20 20 2f 2a 20 50 6f  pPreStmt;  /* Po
9630: 69 6e 74 65 72 20 74 6f 20 61 20 70 72 65 70 61  inter to a prepa
9640: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
9650: 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
9660: 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
9670: 42 5f 45 56 41 4c 20 29 7b 0a 20 20 20 20 20 20  B_EVAL ){.      
9680: 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62  if( objc<3 || ob
9690: 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20 20 20 20  jc>5 ){.        
96a0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
96b0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
96c0: 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41  , "SQL ?ARRAY-NA
96d0: 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a  ME? ?SCRIPT?");.
96e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
96f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
9700: 7d 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 54  }.      pRet = T
9710: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
9720: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
9730: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d  unt(pRet);.    }
9740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
9750: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
9760: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
9770: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
9780: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
9790: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
97a0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
97b0: 20 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d       if( choice=
97c0: 3d 44 42 5f 45 58 49 53 54 53 20 29 7b 0a 20 20  =DB_EXISTS ){.  
97d0: 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c        pRet = Tcl
97e0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 30  _NewBooleanObj(0
97f0: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  );.        Tcl_I
9800: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
9810: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9820: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
9830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9840: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
9850: 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20  ){.      pArray 
9860: 3d 20 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  = pScript = 0;. 
9870: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
9880: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 70 41  c==4 ){.      pA
9890: 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  rray = 0;.      
98a0: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
98b0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
98c0: 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a      pArray = obj
98d0: 76 5b 33 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  v[3];.      if( 
98e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 41  Tcl_GetString(pA
98f0: 72 72 61 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41  rray)[0]==0 ) pA
9900: 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  rray = 0;.      
9910: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34  pScript = objv[4
9920: 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  ];.    }..    Tc
9930: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_IncrRefCount(o
9940: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71  bjv[2]);.    zSq
9950: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
9960: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
9970: 2c 20 30 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  , 0);.    while(
9980: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a   rc==TCL_OK && z
9990: 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Sql[0] ){.      
99a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
99b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
99c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
99d0: 20 20 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20      int nVar;   
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 69 6e 64  * Number of bind
9a00: 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20 74   parameters in t
9a10: 68 65 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20  he pStmt */.    
9a20: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a40: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
9a50: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
9a60: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c  set */.      Tcl
9a70: 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65  _Obj **apColName
9a80: 20 3d 20 30 3b 20 20 20 2f 2a 20 41 72 72 61 79   = 0;   /* Array
9a90: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
9aa0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   */.      int le
9ab0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
9ac0: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c       /* String l
9ad0: 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 2a 2f  ength of zSql */
9ae0: 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 72 79  .  .      /* Try
9af0: 20 74 6f 20 66 69 6e 64 20 61 20 53 51 4c 20 73   to find a SQL s
9b00: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 68 61  tatement that ha
9b10: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
9b20: 6f 6d 70 69 6c 65 64 20 61 6e 64 0a 20 20 20 20  ompiled and.    
9b30: 20 20 2a 2a 20 77 68 69 63 68 20 6d 61 74 63 68    ** which match
9b40: 65 73 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  es the next sequ
9b50: 65 6e 63 65 20 6f 66 20 53 51 4c 2e 0a 20 20 20  ence of SQL..   
9b60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 53 74 6d     */.      pStm
9b70: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 72  t = 0;.      pPr
9b80: 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d  eStmt = pDb->stm
9b90: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 6c 65 6e  tList;.      len
9ba0: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
9bb0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53  .      if( pPreS
9bc0: 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 65  tmt && sqlite3_e
9bd0: 78 70 69 72 65 64 28 70 50 72 65 53 74 6d 74 2d  xpired(pPreStmt-
9be0: 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  >pStmt) ){.     
9bf0: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
9c00: 65 28 70 44 62 29 3b 0a 20 20 20 20 20 20 20 20  e(pDb);.        
9c10: 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20  pPreStmt = 0;.  
9c20: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
9c30: 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65  ; pPreStmt; pPre
9c40: 53 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70  Stmt=pPreStmt->p
9c50: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
9c60: 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d  nt n = pPreStmt-
9c70: 3e 6e 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69  >nSql;.        i
9c80: 66 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20  f( len>=n .     
9c90: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
9ca0: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
9cb0: 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20   zSql, n)==0.   
9cc0: 20 20 20 20 20 20 20 20 20 26 26 20 28 7a 53 71           && (zSq
9cd0: 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b  l[n]==0 || zSql[
9ce0: 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20  n-1]==';').     
9cf0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
9d00: 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  pStmt = pPreStmt
9d10: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  ->pStmt;.       
9d20: 20 20 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c     zLeft = &zSql
9d30: 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d  [pPreStmt->nSql]
9d40: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
9d50: 57 68 65 6e 20 61 20 70 72 65 70 61 72 65 64 20  When a prepared 
9d60: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75  statement is fou
9d70: 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72  nd, unlink it fr
9d80: 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  om the.         
9d90: 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20   ** cache list. 
9da0: 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62   It will later b
9db0: 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20  e added back to 
9dc0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
9dd0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
9de0: 65 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20  e cache list in 
9df0: 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65  order to impleme
9e00: 6e 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65  nt LRU replaceme
9e10: 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  nt..          */
9e20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
9e30: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29  PreStmt->pPrev )
9e40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
9e50: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70  reStmt->pPrev->p
9e60: 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Next = pPreStmt-
9e70: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
9e80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9e90: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
9ea0: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
9eb0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
9ec0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
9ed0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20  pPreStmt->pNext 
9ee0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
9ef0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e  PreStmt->pNext->
9f00: 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74  pPrev = pPreStmt
9f10: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20  ->pPrev;.       
9f20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9f30: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
9f40: 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ast = pPreStmt->
9f50: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  pPrev;.         
9f60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62   }.          pDb
9f70: 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20  ->nStmt--;.     
9f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9fa0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  .      /* If no 
9fb0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
9fc0: 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 43  nt was found.  C
9fd0: 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74  ompile the SQL t
9fe0: 65 78 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ext.      */.   
9ff0: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
a000: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  ){.        if( S
a010: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
a020: 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
a030: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
a040: 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a  tmt, &zLeft) ){.
a050: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65            Tcl_Se
a060: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
a070: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
a080: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
a090: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
a0a0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
a0b0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OR;.          br
a0c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a0d0: 20 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74         if( pStmt
a0e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a0f0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
a100: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
a110: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
a120: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d          /* A com
a130: 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20  pile-time error 
a140: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
a150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
a160: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
a170: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
a180: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
a190: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
a1a0: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
a1b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
a1c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
a1d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a1e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a1f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
a200: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
a210: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
a220: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
a230: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  ement.          
a240: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20    ** in the SQL 
a250: 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  string..        
a260: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
a270: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
a280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
a290: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
a2a0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
a2b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
a2c0: 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  eStmt==0 );.    
a2d0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69    }..      /* Bi
a2e0: 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72  nd values to par
a2f0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67  ameters that beg
a300: 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 0a 20  in with $ or :. 
a310: 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20       */  .      
a320: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
a330: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
a340: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
a350: 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20    nParm = 0;.   
a360: 20 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a 65     if( nVar>size
a370: 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66  of(aParm)/sizeof
a380: 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20  (aParm[0]) ){.  
a390: 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 28        apParm = (
a3a0: 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c  Tcl_Obj**)Tcl_Al
a3b0: 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28  loc(nVar*sizeof(
a3c0: 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20  apParm[0]));.   
a3d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3e0: 20 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72 6d    apParm = aParm
a3f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a400: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
a410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
a430: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
a440: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
a450: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
a460: 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26    if( zVar!=0 &&
a470: 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c   (zVar[0]=='$' |
a480: 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 29 20  | zVar[0]==':') 
a490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
a4a0: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
a4b0: 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
a4c0: 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20  p, &zVar[1], 0, 
a4d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
a4e0: 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ( pVar ){.      
a4f0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
a500: 20 20 20 20 20 20 20 20 20 75 38 20 2a 64 61 74           u8 *dat
a510: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  a;.            c
a520: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61  har *zType = pVa
a530: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
a540: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
a550: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   : "";.         
a560: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70     char c = zTyp
a570: 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[0];.          
a580: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
a590: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
a5a0: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
a5b0: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29  pVar->bytes==0 )
a5c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a5d0: 2f 2a 20 4f 6e 6c 79 20 6c 6f 61 64 20 61 20 42  /* Only load a B
a5e0: 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20  LOB type if the 
a5f0: 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  Tcl variable is 
a600: 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a  a bytearray and.
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
a620: 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72   has no string r
a630: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a  epresentation. *
a640: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
a650: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79  data = Tcl_GetBy
a660: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70  teArrayFromObj(p
a670: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
a680: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a690: 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
a6a0: 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c   i, data, n, SQL
a6b0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
a6c0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
a6d0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72  ncrRefCount(pVar
a6e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a6f0: 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d   apParm[nParm++]
a700: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
a710: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
a720: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
a730: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
a740: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
a750: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
a760: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
a770: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
a780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
a790: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
a7a0: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26  (interp, pVar, &
a7b0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
a7c0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
a7d0: 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b  nt(pStmt, i, n);
a7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
a7f0: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
a800: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
a810: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
a820: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
a830: 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  le r;.          
a840: 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c      Tcl_GetDoubl
a850: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
a860: 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20   pVar, &r);.    
a870: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a880: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
a890: 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20  tmt, i, r);.    
a8a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
a8b0: 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63  ( c=='w' && strc
a8c0: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
a8d0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
a8e0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65          Tcl_Wide
a8f0: 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20  Int v;.         
a900: 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65       Tcl_GetWide
a910: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
a920: 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20  p, pVar, &v);.  
a930: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a940: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
a950: 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20  Stmt, i, v);.   
a960: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
a980: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
a990: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
a9a0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
a9b0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
a9c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
a9d0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20  _text(pStmt, i, 
a9e0: 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c  (char *)data, n,
a9f0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
aa00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
aa10: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
aa20: 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pVar);.         
aa30: 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72       apParm[nPar
aa40: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
aa50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aa60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
aa80: 62 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74  bind_null( pStmt
aa90: 2c 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20 20  , i );.         
aaa0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
aab0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
aac0: 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  ompute column na
aad0: 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f  mes */.      nCo
aae0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
aaf0: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
ab00: 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69  .      if( pScri
ab10: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  pt ){.        ap
ab20: 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f  ColName = (Tcl_O
ab30: 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  bj**)Tcl_Alloc( 
ab40: 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29  sizeof(Tcl_Obj*)
ab50: 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  *nCol );.       
ab60: 20 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d 3d   if( apColName==
ab70: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
ab80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
ab90: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
aba0: 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d      apColName[i]
abb0: 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73   = dbTextToObj(s
abc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
abd0: 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  me(pStmt,i));.  
abe0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
abf0: 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61  RefCount(apColNa
ac00: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  me[i]);.        
ac10: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
ac20: 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61   /* If results a
ac30: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20  re being stored 
ac40: 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  in an array vari
ac50: 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74  able, then creat
ac60: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 61  e.      ** the a
ac70: 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f  rray(*) entry fo
ac80: 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20  r that array.   
ac90: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
aca0: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
acb0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c    Tcl_Obj *pColL
acc0: 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ist = Tcl_NewObj
acd0: 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ();.        Tcl_
ace0: 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c  Obj *pStar = Tcl
acf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a  _NewStringObj("*
ad00: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ", -1);.        
ad10: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
ad20: 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20  (pColList);.    
ad30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ad40: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ad50: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
ad60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
ad70: 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20  terp, pColList, 
ad80: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
ad90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ada0: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
adb0: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
adc0: 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c  pStar, pColList,
add0: 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  0);.        Tcl_
ade0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f  DecrRefCount(pCo
adf0: 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  lList);.        
ae00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
ae10: 28 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20 7d  (pStar);.      }
ae20: 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63 75  ..      /* Execu
ae30: 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20  te the SQL.     
ae40: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
ae50: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70   rc==TCL_OK && p
ae60: 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 52  Stmt && SQLITE_R
ae70: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
ae80: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
ae90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
aea0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
aeb0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
aec0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  l;.          .  
aed0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70          /* Set p
aee0: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
aef0: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
af00: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
af10: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
af20: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
af30: 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20 29  type(pStmt, i) )
af40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
af50: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
af60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
af70: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
af80: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
af90: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
afa0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
afb0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
afc0: 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  yObj(sqlite3_col
afd0: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
afe0: 69 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  i), bytes);.    
aff0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b010: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
b020: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
b030: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b040: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
b050: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b060: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b  int64(pStmt, i);
b070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
b080: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
b090: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
b0a0: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
b0b0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
b0c0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  _NewIntObj(v);. 
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
b0e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
b0f0: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
b100: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
b110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
b120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
b130: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b140: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b150: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
b160: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
b170: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
b180: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
b190: 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ble(pStmt, i);. 
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
b1b0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  l = Tcl_NewDoubl
b1c0: 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20  eObj(r);.       
b1d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b1e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b1f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
b200: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
b210: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
b220: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62   dbTextToObj(pDb
b230: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ->zNull);.      
b240: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b250: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b260: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
b270: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
b280: 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54    pVal = dbTextT
b290: 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  oObj((char *)sql
b2a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
b2b0: 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20  (pStmt, i));.   
b2c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b2d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b2e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
b2f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
b300: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
b310: 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d      if( pArray==
b320: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
b330: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
b340: 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e  2(interp, apColN
b350: 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c  ame[i], 0, pVal,
b360: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b380: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
b390: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72  Var2(interp, pAr
b3a0: 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  ray, apColName[i
b3b0: 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  ], pVal, 0);.   
b3c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b3d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
b3e0: 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c  hoice==DB_ONECOL
b3f0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
b400: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d     assert( pRet=
b410: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
b420: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
b430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b440: 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20  Ret = pVal;.    
b450: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
b460: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
b470: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b480: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
b490: 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20   TCL_BREAK;.    
b4a0: 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c          i = nCol
b4b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
b4c0: 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42  e if( choice==DB
b4d0: 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20  _EXISTS ){.     
b4e0: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
b4f0: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
b500: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20             pRet 
b510: 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  = Tcl_NewBoolean
b520: 4f 62 6a 28 31 29 3b 0a 20 20 20 20 20 20 20 20  Obj(1);.        
b530: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
b540: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
b550: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
b560: 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20  _BREAK;.        
b570: 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20      i = nCol;.  
b580: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b590: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c             Tcl_L
b5a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b5b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
b5c0: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , pVal);.       
b5d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
b5e0: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53   .        if( pS
b5f0: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
b600: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
b610: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
b620: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 20  cript, 0);.     
b630: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
b640: 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20 20  _CONTINUE ){.   
b650: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
b660: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  L_OK;.          
b670: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b680: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
b690: 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
b6a0: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
b6b0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  OK;.      }..   
b6c0: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63     /* Free the c
b6d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65 63  olumn name objec
b6e0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
b6f0: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
b700: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
b710: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
b720: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
b730: 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69  ount(apColName[i
b740: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
b750: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
b760: 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29  char*)apColName)
b770: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
b780: 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75   /* Free the bou
b790: 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c  nd string and bl
b7a0: 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ob parameters */
b7b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b7c0: 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nParm; i++){. 
b7d0: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
b7e0: 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69  efCount(apParm[i
b7f0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
b800: 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61 50    if( apParm!=aP
b810: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 54  arm ){.        T
b820: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61  cl_Free((char*)a
b830: 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  pParm);.      }.
b840: 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20  .      /* Reset 
b850: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
b860: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  If the result co
b870: 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43 48  de is SQLITE_SCH
b880: 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  EMA, then.      
b890: 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74 61  ** flush the sta
b8a0: 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e 64  tement cache and
b8b0: 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d 65   try the stateme
b8c0: 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20  nt again..      
b8d0: 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73  */.      rc2 = s
b8e0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
b8f0: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  mt);.      if( S
b900: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 72 63  QLITE_SCHEMA==rc
b910: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
b920: 41 66 74 65 72 20 61 20 73 63 68 65 6d 61 20 63  After a schema c
b930: 68 61 6e 67 65 2c 20 66 6c 75 73 68 20 74 68 65  hange, flush the
b940: 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20 74   cache and try t
b950: 6f 20 72 75 6e 20 74 68 65 0a 20 20 20 20 20 20  o run the.      
b960: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61    ** statement a
b970: 67 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  gain.        */.
b980: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
b990: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
b9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
b9b0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
b9c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
b9d0: 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28  Stmt ) Tcl_Free(
b9e0: 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29  (char*)pPreStmt)
b9f0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
ba00: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ue;.      }else 
ba10: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
ba20: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  c2 ){.        /*
ba30: 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65   If a run-time e
ba40: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70  rror occurs, rep
ba50: 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e  ort the error an
ba60: 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20  d stop reading. 
ba70: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
ba80: 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  L.        */.   
ba90: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
baa0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
bab0: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
bac0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
bad0: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  )));.        sql
bae0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
baf0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  tmt);.        rc
bb00: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
bb10: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
bb20: 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63  mt ) Tcl_Free((c
bb30: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  har*)pPreStmt);.
bb40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bb50: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
bb60: 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 29  Db->maxStmt<=0 )
bb70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
bb80: 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72  the cache is tur
bb90: 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63  ned off, dealloc
bba0: 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65  ated the stateme
bbb0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  nt */.        if
bbc0: 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c  ( pPreStmt ) Tcl
bbd0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72  _Free((char*)pPr
bbe0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  eStmt);.        
bbf0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
bc00: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d  (pStmt);.      }
bc10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
bc20: 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   Everything work
bc30: 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
bc40: 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c 2e   is operational.
bc50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65 61  .        ** Crea
bc60: 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70  te a new SqlPrep
bc70: 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75  aredStmt structu
bc80: 72 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f 6e  re if we need on
bc90: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 49  e..        ** (I
bca0: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
bcb0: 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75 73  e one we can jus
bcc0: 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20 20  t reuse it.).   
bcd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
bce0: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
bcf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
bd00: 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c 3b   = zLeft - zSql;
bd10: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
bd20: 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72  tmt = (SqlPrepar
bd30: 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f  edStmt*)Tcl_Allo
bd40: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65 53  c( sizeof(*pPreS
bd50: 74 6d 74 29 20 2b 20 6c 65 6e 20 29 3b 0a 20 20  tmt) + len );.  
bd60: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
bd70: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
bd80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
bd90: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
bda0: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
bdb0: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
bdc0: 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20  t->nSql = len;. 
bdd0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
bde0: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
bdf0: 7a 53 71 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  zSql, len);.    
be00: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
be10: 7a 53 71 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20  zSql[len] = 0;. 
be20: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
be30: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
be40: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
be50: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
be60: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
be70: 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  st.        */.  
be80: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
be90: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
bea0: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70  tList;.        p
beb0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d  PreStmt->pPrev =
bec0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
bed0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
bee0: 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  .         pDb->s
bef0: 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  tmtList->pPrev =
bf00: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
bf10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
bf20: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
bf30: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  eStmt;.        i
bf40: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
bf50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
bf60: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
bf70: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
bf80: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
bf90: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
bfa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bfb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
bfc0: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
bfd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bfe0: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20   pDb->nStmt++;. 
bff0: 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66    .        /* If
c000: 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e   we have too man
c010: 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63  y statement in c
c020: 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65  ache, remove the
c030: 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74 68   surplus from th
c040: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 64  e.        ** end
c050: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
c060: 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  st..        */. 
c070: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 44         while( pD
c080: 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61  b->nStmt>pDb->ma
c090: 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  xStmt ){.       
c0a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
c0b0: 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ize(pDb->stmtLas
c0c0: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
c0d0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
c0e0: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61  st = pDb->stmtLa
c0f0: 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  st->pPrev;.     
c100: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
c110: 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61  har*)pDb->stmtLa
c120: 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20  st->pNext);.    
c130: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
c140: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
c150: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
c160: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
c170: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
c180: 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20 74   /* Proceed to t
c190: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
c1a0: 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20  t */.      zSql 
c1b0: 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20  = zLeft;.    }. 
c1c0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
c1d0: 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20  unt(objv[2]);.. 
c1e0: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
c1f0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
c200: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
c210: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
c220: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
c230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
c240: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
c250: 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  et);.    }.    b
c260: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
c270: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e    **     $db fun
c280: 63 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50  ction NAME SCRIP
c290: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
c2a0: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e  te a new SQL fun
c2b0: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
c2c0: 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61  E.  Whenever tha
c2d0: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  t function is.  
c2e0: 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  ** called, invok
c2f0: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
c300: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
c310: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
c320: 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  B_FUNCTION: {.  
c330: 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
c340: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
c350: 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72  Script;.    char
c360: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28   *zName;.    if(
c370: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
c380: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c390: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
c3a0: 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54  jv, "NAME SCRIPT
c3b0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
c3c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c3d0: 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
c3e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
c3f0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
c400: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
c410: 6a 76 5b 33 5d 3b 0a 20 20 20 20 70 46 75 6e 63  jv[3];.    pFunc
c420: 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70   = findSqlFunc(p
c430: 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db, zName);.    
c440: 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72  if( pFunc==0 ) r
c450: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c460: 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
c470: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
c480: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
c490: 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  t(pFunc->pScript
c4a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75  );.    }.    pFu
c4b0: 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53  nc->pScript = pS
c4c0: 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
c4d0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
c4e0: 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d  ipt);.    pFunc-
c4f0: 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73  >useEvalObjv = s
c500: 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76  afeToUseEvalObjv
c510: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
c520: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
c530: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c540: 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
c550: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
c560: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75  TF8,.        pFu
c570: 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20  nc, tclSqlFunc, 
c580: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
c590: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c5a0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
c5b0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f  RROR;.      Tcl_
c5c0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
c5d0: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
c5e0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
c5f0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
c600: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c610: 20 20 20 2f 2a 20 4d 75 73 74 20 66 6c 75 73 68     /* Must flush
c620: 20 61 6e 79 20 63 61 63 68 65 64 20 73 74 61 74   any cached stat
c630: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
c640: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
c650: 70 44 62 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDb );.    }.   
c660: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
c670: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e  *.  **     $db n
c680: 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47  ullvalue ?STRING
c690: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e  ?.  **.  ** Chan
c6a0: 67 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65  ge text used whe
c6b0: 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62  n a NULL comes b
c6c0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ack from the dat
c6d0: 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e  abase. If ?STRIN
c6e0: 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  G?.  ** is not p
c6f0: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
c700: 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20   current string 
c710: 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73  used for NULL is
c720: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20   returned..  ** 
c730: 49 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65  If STRING is pre
c740: 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e  sent, then STRIN
c750: 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  G is returned.. 
c760: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
c770: 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a  DB_NULLVALUE: {.
c780: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
c790: 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  && objc!=3 ){.  
c7a0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
c7b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
c7c0: 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45  objv, "NULLVALUE
c7d0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
c7e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c7f0: 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
c800: 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  3 ){.      int l
c810: 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  en;.      char *
c820: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
c830: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
c840: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
c850: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c     if( pDb->zNul
c860: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  l ){.        Tcl
c870: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c  _Free(pDb->zNull
c880: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c890: 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65   if( zNull && le
c8a0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
c8b0: 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f  Db->zNull = Tcl_
c8c0: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
c8d0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 70  ;.        strncp
c8e0: 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e  y(pDb->zNull, zN
c8f0: 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  ull, len);.     
c900: 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65     pDb->zNull[le
c910: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  n] = '\0';.     
c920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c930: 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a  pDb->zNull = 0;.
c940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c950: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
c960: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
c970: 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c  tToObj(pDb->zNul
c980: 6c 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  l));.    break;.
c990: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
c9a0: 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65     $db last_inse
c9b0: 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20  rt_rowid .  **. 
c9c0: 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e   ** Return an in
c9d0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
c9e0: 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65  he ROWID for the
c9f0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
ca00: 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ert..  */.  case
ca10: 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f   DB_LAST_INSERT_
ca20: 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c  ROWID: {.    Tcl
ca30: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
ca40: 20 20 20 69 6e 74 20 72 6f 77 69 64 3b 0a 20 20     int rowid;.  
ca50: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
ca60: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
ca70: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ca80: 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
ca90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
caa0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
cab0: 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
cac0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
cad0: 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  d(pDb->db);.    
cae0: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
caf0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
cb00: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
cb10: 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72  ntObj(pResult, r
cb20: 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  owid);.    break
cb30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
cb40: 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d   The DB_ONECOLUM
cb50: 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c  N method is impl
cb60: 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72  emented together
cb70: 20 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20   with DB_EVAL.. 
cb80: 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   */..  /*    $db
cb90: 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c   progress ?N CAL
cba0: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a  LBACK?.  ** .  *
cbb0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
cbc0: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72  en callback ever
cbd0: 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68  y N virtual mach
cbe0: 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c  ine opcodes whil
cbf0: 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a  e executing.  **
cc00: 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
cc10: 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53   case DB_PROGRES
cc20: 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  S: {.    if( obj
cc30: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
cc40: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
cc50: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
cc60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
cc70: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
cc80: 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ess, 0);.      }
cc90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
cca0: 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
ccb0: 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b  char *zProgress;
ccc0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
ccd0: 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20        int N;.   
cce0: 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
ccf0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
cd00: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
cd10: 2c 20 26 4e 29 20 29 7b 0a 09 72 65 74 75 72 6e  , &N) ){..return
cd20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
cd30: 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70    };.      if( p
cd40: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
cd50: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
cd60: 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  e(pDb->zProgress
cd70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cd80: 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c   zProgress = Tcl
cd90: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
cda0: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29  j(objv[3], &len)
cdb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f  ;.      if( zPro
cdc0: 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29  gress && len>0 )
cdd0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
cde0: 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41  Progress = Tcl_A
cdf0: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
ce00: 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
ce10: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20  pDb->zProgress, 
ce20: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20  zProgress);.    
ce30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ce40: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
ce50: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
ce60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ce70: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
ce80: 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CK.      if( pDb
ce90: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->zProgress ){. 
cea0: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
ceb0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
cec0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
ced0: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
cee0: 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67  b->db, N, DbProg
cef0: 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62  ressHandler, pDb
cf00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
cf10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
cf20: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
cf30: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  (pDb->db, 0, 0, 
cf40: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
cf50: 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
cf60: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
cf70: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
cf80: 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43  objv, "N CALLBAC
cf90: 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
cfa0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
cfb0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
cfc0: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70  }..  /*    $db p
cfd0: 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b  rofile ?CALLBACK
cfe0: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
cff0: 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
d000: 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
d010: 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74  BACK routine aft
d020: 65 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  er each SQL stat
d030: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20  ement.  ** that 
d040: 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65  has run.  The te
d050: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e  xt of the SQL an
d060: 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  d the amount of 
d070: 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a  elapse time are.
d080: 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f    ** appended to
d090: 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65   CALLBACK before
d0a0: 20 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72   the script is r
d0b0: 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  un..  */.  case 
d0c0: 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20  DB_PROFILE: {.  
d0d0: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
d0e0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
d0f0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
d100: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
d110: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
d120: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d130: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
d140: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
d150: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
d160: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
d170: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d180: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  rp, pDb->zProfil
d190: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
d1a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d1b0: 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a  char *zProfile;.
d1c0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
d1d0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
d1e0: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
d1f0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
d200: 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20  zProfile);.     
d210: 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c   }.      zProfil
d220: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
d230: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
d240: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
d250: 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c  f( zProfile && l
d260: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
d270: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20  pDb->zProfile = 
d280: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
d290: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74   1 );.        st
d2a0: 72 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69  rcpy(pDb->zProfi
d2b0: 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  le, zProfile);. 
d2c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d2d0: 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c      pDb->zProfil
d2e0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  e = 0;.      }.#
d2f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d300: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69  IT_TRACE.      i
d310: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
d320: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
d330: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
d340: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d350: 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64  3_profile(pDb->d
d360: 62 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64  b, DbProfileHand
d370: 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
d380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d390: 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
d3a0: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
d3b0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
d3c0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
d3d0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
d3e0: 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59     $db rekey KEY
d3f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67  .  **.  ** Chang
d400: 65 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e  e the encryption
d410: 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72   key on the curr
d420: 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62  ently open datab
d430: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
d440: 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20   DB_REKEY: {.   
d450: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76   int nKey;.    v
d460: 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69  oid *pKey;.    i
d470: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
d480: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
d490: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
d4a0: 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20  objv, "KEY");.  
d4b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d4c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
d4d0: 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
d4e0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
d4f0: 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a  bjv[2], &nKey);.
d500: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
d510: 53 5f 43 4f 44 45 43 0a 20 20 20 20 72 63 20 3d  S_CODEC.    rc =
d520: 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70   sqlite3_rekey(p
d530: 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b  Db->db, pKey, nK
d540: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ey);.    if( rc 
d550: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
d560: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d570: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
d580: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  rc), 0);.      r
d590: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
d5a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d5b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
d5c0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69  .  **     $db ti
d5d0: 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e  meout MILLESECON
d5e0: 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c  DS.  **.  ** Del
d5f0: 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  ay for the numbe
d600: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
d610: 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  s specified when
d620: 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65   a file is locke
d630: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
d640: 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20  B_TIMEOUT: {.   
d650: 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28   int ms;.    if(
d660: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
d670: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
d680: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
d690: 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44  jv, "MILLISECOND
d6a0: 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  S");.      retur
d6b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
d6c0: 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47   }.    if( Tcl_G
d6d0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
d6e0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d  erp, objv[2], &m
d6f0: 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
d700: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
d710: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
d720: 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20  pDb->db, ms);.  
d730: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a    break;.  }.  .
d740: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
d750: 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a  b total_changes.
d760: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
d770: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
d780: 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
d790: 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
d7a0: 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20  , or deleted .  
d7b0: 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  ** since the dat
d7c0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
d7d0: 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20   created..  */. 
d7e0: 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43   case DB_TOTAL_C
d7f0: 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63  HANGES: {.    Tc
d800: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
d810: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
d820: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
d830: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
d840: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
d850: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
d860: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
d870: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
d880: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
d890: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
d8a0: 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
d8b0: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
d8c0: 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29  hanges(pDb->db))
d8d0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
d8e0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72  ..  /*    $db tr
d8f0: 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ace ?CALLBACK?. 
d900: 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72   **.  ** Make ar
d910: 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e  rangements to in
d920: 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43  voke the CALLBAC
d930: 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61  K routine for ea
d940: 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
d950: 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78  .  ** that is ex
d960: 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 78  ecuted.  The tex
d970: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20  t of the SQL is 
d980: 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c  appended to CALL
d990: 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a  BACK before.  **
d9a0: 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e   it is executed.
d9b0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
d9c0: 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28  TRACE: {.    if(
d9d0: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
d9e0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d9f0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
da00: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
da10: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
da20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
da30: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
da40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
da50: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
da60: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
da70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
da80: 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20 20  ->zTrace, 0);.  
da90: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
daa0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72  .      char *zTr
dab0: 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ace;.      int l
dac0: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
dad0: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
dae0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
daf0: 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20  b->zTrace);.    
db00: 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65    }.      zTrace
db10: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
db20: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
db30: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
db40: 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e  ( zTrace && len>
db50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
db60: 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41  ->zTrace = Tcl_A
db70: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
db80: 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
db90: 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72  pDb->zTrace, zTr
dba0: 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ace);.      }els
dbb0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
dbc0: 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  zTrace = 0;.    
dbd0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
dbe0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
dbf0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
dc00: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
dc10: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
dc20: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
dc30: 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e  ite3_trace(pDb->
dc40: 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c  db, DbTraceHandl
dc50: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
dc60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
dc70: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62  qlite3_trace(pDb
dc80: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
dc90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
dca0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
dcb0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72  ..  /*    $db tr
dcc0: 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65  ansaction [-defe
dcd0: 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c  rred|-immediate|
dce0: 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49  -exclusive] SCRI
dcf0: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61  PT.  **.  ** Sta
dd00: 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
dd10: 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20  tion (if we are 
dd20: 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74  not already in t
dd30: 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20  he midst of a.  
dd40: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20  ** transaction) 
dd50: 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20  and execute the 
dd60: 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49 50  TCL script SCRIP
dd70: 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50 54  T.  After SCRIPT
dd80: 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c  .  ** completes,
dd90: 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74   either commit t
dda0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
ddb0: 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69  r roll it back i
ddc0: 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68  f SCRIPT.  ** th
ddd0: 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
dde0: 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77  n.  Or if no new
ddf0: 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20   transation was 
de00: 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68  started, do noth
de10: 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74  ing..  ** pass t
de20: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20  he exception on 
de30: 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  up the stack..  
de40: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d  **.  ** This com
de50: 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65  mand was inspire
de60: 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73  d by Dave Thomas
de70: 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20  's talk on Ruby 
de80: 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35  at the.  ** 2005
de90: 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53   O'Reilly Open S
dea0: 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e  ource Convention
deb0: 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20   (OSCON)..  */. 
dec0: 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43   case DB_TRANSAC
ded0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20  TION: {.    int 
dee0: 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c  inTrans;.    Tcl
def0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
df00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
df10: 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b  Begin = "BEGIN";
df20: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
df30: 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
df40: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
df50: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
df60: 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53   objv, "[TYPE] S
df70: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
df80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
df90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
dfa0: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
dfb0: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32  pScript = objv[2
dfc0: 5d 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ];.    } else {.
dfd0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
dfe0: 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73  st char *TTYPE_s
dff0: 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  trs[] = {.      
e000: 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20    "deferred",   
e010: 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69  "exclusive",  "i
e020: 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20  mmediate", 0.   
e030: 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d     };.      enum
e040: 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20   TTYPE_enum {.  
e050: 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45        TTYPE_DEFE
e060: 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c  RRED, TTYPE_EXCL
e070: 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d  USIVE, TTYPE_IMM
e080: 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a  EDIATE.      };.
e090: 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b        int ttype;
e0a0: 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
e0b0: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
e0c0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
e0d0: 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61  TTYPE_strs, "tra
e0e0: 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a  nsaction type",.
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e110: 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20   &ttype) ){.    
e120: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e130: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
e140: 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75      switch( (enu
e150: 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79  m TTYPE_enum)tty
e160: 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  pe ){.        ca
e170: 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45  se TTYPE_DEFERRE
e180: 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  D:    /* no-op *
e190: 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /;              
e1a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e1b0: 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43    case TTYPE_EXC
e1c0: 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e  LUSIVE:   zBegin
e1d0: 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53   = "BEGIN EXCLUS
e1e0: 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  IVE";  break;.  
e1f0: 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
e200: 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42  _IMMEDIATE:   zB
e210: 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d  egin = "BEGIN IM
e220: 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b  MEDIATE";  break
e230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e240: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
e250: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 54  ];.    }.    inT
e260: 72 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33 5f  rans = !sqlite3_
e270: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70  get_autocommit(p
e280: 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28  Db->db);.    if(
e290: 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20   !inTrans ){.   
e2a0: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
e2b0: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
e2c0: 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  Begin, 0, 0, 0);
e2d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
e2e0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
e2f0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
e300: 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72  );.    if( !inTr
e310: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ans ){.      con
e320: 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20  st char *zEnd;. 
e330: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
e340: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
e350: 20 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41    zEnd = "ROLLBA
e360: 43 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  CK";.      } els
e370: 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64  e {.        zEnd
e380: 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20   = "COMMIT";.   
e390: 20 20 20 7d 0a 20 20 20 20 20 20 28 76 6f 69 64     }.      (void
e3a0: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
e3b0: 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20  b->db, zEnd, 0, 
e3c0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
e3d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
e3e0: 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70  *.  **    $db up
e3f0: 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  date_hook ?scrip
e400: 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72  t?.  **    $db r
e410: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63  ollback_hook ?sc
e420: 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73  ript?.  */.  cas
e430: 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b  e DB_UPDATE_HOOK
e440: 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c  : .  case DB_ROL
e450: 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20  LBACK_HOOK: {.. 
e460: 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b     /* set ppHook
e470: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70   to point at pUp
e480: 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c  dateHook or pRol
e490: 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e  lbackHook, depen
e4a0: 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20  ding on .    ** 
e4b0: 77 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64  whether [$db upd
e4c0: 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64  ate_hook] or [$d
e4d0: 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d  b rollback_hook]
e4e0: 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20   was invoked..  
e4f0: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a    */.    Tcl_Obj
e500: 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20   **ppHook; .    
e510: 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55  if( choice==DB_U
e520: 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20  PDATE_HOOK ){.  
e530: 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44      ppHook = &pD
e540: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a  b->pUpdateHook;.
e550: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e560: 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
e570: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20  pRollbackHook;. 
e580: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
e590: 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
e5a0: 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57   ){.       Tcl_W
e5b0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
e5c0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
e5d0: 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
e5e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e5f0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
e600: 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20   *ppHook ){.    
e610: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
e620: 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f  lt(interp, *ppHo
e630: 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  ok);.      if( o
e640: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
e650: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
e660: 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
e670: 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30       *ppHook = 0
e680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e690: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
e6a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e6b0: 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20   !(*ppHook) );. 
e6c0: 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
e6d0: 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b  CharLength(objv[
e6e0: 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  2])>0 ){.       
e6f0: 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b   *ppHook = objv[
e700: 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  2];.        Tcl_
e710: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70  IncrRefCount(*pp
e720: 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Hook);.      }. 
e730: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
e740: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44  3_update_hook(pD
e750: 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70  b->db, (pDb->pUp
e760: 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74  dateHook?DbUpdat
e770: 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62  eHandler:0), pDb
e780: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
e790: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62  ollback_hook(pDb
e7a0: 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c  ->db,(pDb->pRoll
e7b0: 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62  backHook?DbRollb
e7c0: 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44  ackHandler:0),pD
e7d0: 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b);..    break;.
e7e0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
e7f0: 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20   version.  **.  
e800: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 65  ** Return the ve
e810: 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72  rsion string for
e820: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a   this database..
e830: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56    */.  case DB_V
e840: 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63  ERSION: {.    Tc
e850: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
e860: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
e870: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
e880: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
e890: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a     break;.  }...
e8a0: 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
e8b0: 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d 65  e SWITCH stateme
e8c0: 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  nt */.  return r
e8d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71  c;.}../*.**   sq
e8e0: 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c  lite3 DBNAME FIL
e8f0: 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b  ENAME ?MODE? ?-k
e900: 65 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68  ey KEY?.**.** Th
e910: 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54  is is the main T
e920: 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65  cl command.  Whe
e930: 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54  n the "sqlite" T
e940: 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  cl command is.**
e950: 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72   invoked, this r
e960: 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70  outine runs to p
e970: 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d  rocess that comm
e980: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  and..**.** The f
e990: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44  irst argument, D
e9a0: 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62  BNAME, is an arb
e9b0: 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20  itrary name for 
e9c0: 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73  a new.** databas
e9d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  e connection.  T
e9e0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61  his command crea
e9f0: 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e  tes a new comman
ea00: 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d  d named.** DBNAM
ea10: 45 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  E that is used t
ea20: 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63  o control that c
ea30: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20  onnection.  The 
ea40: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
ea50: 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65  ection is delete
ea60: 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d  d when the DBNAM
ea70: 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c  E command is del
ea80: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
ea90: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
eaa0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
eab0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
eac0: 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  t contains.** th
ead0: 65 20 73 71 6c 69 74 65 20 64 61 74 61 62 61 73  e sqlite databas
eae0: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
eaf0: 61 63 63 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  accessed..**.** 
eb00: 46 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  For testing purp
eb10: 6f 73 65 73 2c 20 77 65 20 61 6c 73 6f 20 73 75  oses, we also su
eb20: 70 70 6f 72 74 20 74 68 65 20 66 6f 6c 6c 6f 77  pport the follow
eb30: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  ing:.**.**  sqli
eb40: 74 65 33 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a  te3 -encoding.**
eb50: 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e  .**       Return
eb60: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 75 73   the encoding us
eb70: 65 64 20 62 79 20 4c 49 4b 45 20 61 6e 64 20 47  ed by LIKE and G
eb80: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e 20 20  LOB operators.  
eb90: 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20 20 20 20  Choices.**      
eba0: 20 61 72 65 20 55 54 46 2d 38 20 61 6e 64 20 69   are UTF-8 and i
ebb0: 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73  so8859..**.**  s
ebc0: 71 6c 69 74 65 33 20 2d 76 65 72 73 69 6f 6e 0a  qlite3 -version.
ebd0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75  **.**       Retu
ebe0: 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  rn the version n
ebf0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 53 51 4c  umber of the SQL
ec00: 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a  ite library..**.
ec10: 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 74 63 6c  **  sqlite3 -tcl
ec20: 2d 75 73 65 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20  -uses-utf.**.** 
ec30: 20 20 20 20 20 20 52 65 74 75 72 6e 20 22 31 22        Return "1"
ec40: 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   if compiled wit
ec50: 68 20 61 20 54 63 6c 20 75 73 65 73 20 55 54 46  h a Tcl uses UTF
ec60: 2d 38 2e 20 20 52 65 74 75 72 6e 20 22 30 22 20  -8.  Return "0" 
ec70: 69 66 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 74 2e  if.**       not.
ec80: 20 20 55 73 65 64 20 62 79 20 74 65 73 74 73 20    Used by tests 
ec90: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
eca0: 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d   library was com
ecb0: 70 69 6c 65 64 20 0a 2a 2a 20 20 20 20 20 20 20  piled .**       
ecc0: 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
ecd0: 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28  atic int DbMain(
ece0: 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
ecf0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
ed00: 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
ed10: 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
ed20: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f  qliteDb *p;.  vo
ed30: 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20  id *pKey = 0;.  
ed40: 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20  int nKey = 0;.  
ed50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
ed60: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
ed70: 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  g;.  const char 
ed80: 2a 7a 46 69 6c 65 3b 0a 20 20 69 66 28 20 6f 62  *zFile;.  if( ob
ed90: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72  jc==2 ){.    zAr
eda0: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
edb0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
edc0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
edd0: 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73  rcmp(zArg,"-vers
ede0: 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
edf0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ee00: 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
ee10: 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20  3_version,0);.  
ee20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
ee30: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
ee40: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68   strcmp(zArg,"-h
ee50: 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b  as-codec")==0 ){
ee60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
ee70: 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54  AS_CODEC.      T
ee80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ee90: 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23  interp,"1",0);.#
eea0: 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41  else.      Tcl_A
eeb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
eec0: 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69  rp,"0",0);.#endi
eed0: 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  f.      return T
eee0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
eef0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
ef00: 2c 22 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 22  ,"-tcl-uses-utf"
ef10: 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 54  )==0 ){.#ifdef T
ef20: 43 4c 5f 55 54 46 5f 4d 41 58 0a 20 20 20 20 20  CL_UTF_MAX.     
ef30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ef40: 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b  t(interp,"1",0);
ef50: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c  .#else.      Tcl
ef60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ef70: 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e  terp,"0",0);.#en
ef80: 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
ef90: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
efa0: 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35   }.  if( objc==5
efb0: 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20   || objc==6 ){. 
efc0: 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
efd0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
efe0: 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b  bjv[objc-2], 0);
eff0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
f000: 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20  zArg,"-key")==0 
f010: 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20  ){.      pKey = 
f020: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
f030: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a  FromObj(objv[obj
f040: 63 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20  c-1], &nKey);.  
f050: 20 20 20 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20      objc -= 2;. 
f060: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
f070: 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
f080: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
f090: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f0a0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 23 69 66 64  , 1, objv, .#ifd
f0b0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
f0c0: 44 45 43 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  DEC.      "HANDL
f0d0: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79  E FILENAME ?-key
f0e0: 20 43 4f 44 45 43 2d 4b 45 59 3f 22 0a 23 65 6c   CODEC-KEY?".#el
f0f0: 73 65 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45  se.      "HANDLE
f100: 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f   FILENAME ?MODE?
f110: 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a  ".#endif.    );.
f120: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f130: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  RROR;.  }.  zErr
f140: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28  Msg = 0;.  p = (
f150: 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c  SqliteDb*)Tcl_Al
f160: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
f170: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
f180: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
f190: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c  lt(interp, "mall
f1a0: 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f  oc failed", TCL_
f1b0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
f1c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f1d0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
f1e0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
f1f0: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
f200: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f210: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 73 71 6c  jv[2], 0);.  sql
f220: 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c  ite3_open(zFile,
f230: 20 26 70 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20   &p->db);.  if( 
f240: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
f250: 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  e3_errcode(p->db
f260: 29 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67  ) ){.    zErrMsg
f270: 20 3d 20 73 74 72 64 75 70 28 73 71 6c 69 74 65   = strdup(sqlite
f280: 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
f290: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  ;.    sqlite3_cl
f2a0: 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ose(p->db);.    
f2b0: 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23  p->db = 0;.  }.#
f2c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
f2d0: 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33  _CODEC.  sqlite3
f2e0: 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79  _key(p->db, pKey
f2f0: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
f300: 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
f310: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
f320: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
f330: 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  Msg, TCL_VOLATIL
f340: 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  E);.    Tcl_Free
f350: 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20  ((char*)p);.    
f360: 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
f370: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f380: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  ROR;.  }.  p->ma
f390: 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50  xStmt = NUM_PREP
f3a0: 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 7a 41  ARED_STMTS;.  zA
f3b0: 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
f3c0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
f3d0: 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ], 0);.  Tcl_Cre
f3e0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
f3f0: 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
f400: 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20  jCmd, (char*)p, 
f410: 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 0a 20  DbDeleteCmd);.. 
f420: 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20   /* If compiled 
f430: 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
f440: 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 6e   turned on, then
f450: 20 72 65 67 69 73 74 65 72 20 74 68 65 20 22 6d   register the "m
f460: 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c 20  d5sum".  ** SQL 
f470: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  function..  */.#
f480: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
f490: 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  T.  {.    extern
f4a0: 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74   void Md5_Regist
f4b0: 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 69  er(sqlite3*);.#i
f4c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44  fdef SQLITE_MEMD
f4d0: 45 42 55 47 0a 20 20 20 20 69 6e 74 20 6d 61 6c  EBUG.    int mal
f4e0: 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c 69 74 65  locfail = sqlite
f4f0: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 0a 20  3_iMallocFail;. 
f500: 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c     sqlite3_iMall
f510: 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64  ocFail = 0;.#end
f520: 69 66 0a 20 20 20 20 4d 64 35 5f 52 65 67 69 73  if.    Md5_Regis
f530: 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23 69 66 64  ter(p->db);.#ifd
f540: 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
f550: 55 47 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  UG.    sqlite3_i
f560: 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6d 61 6c  MallocFail = mal
f570: 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64 69 66 0a  locfail;.#endif.
f580: 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a 20 20 70    }.#endif  .  p
f590: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
f5a0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  p;.  return TCL_
f5b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
f5c0: 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
f5d0: 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
f5e0: 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
f5f0: 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
f600: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
f610: 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
f620: 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
f630: 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
f640: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
f650: 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
f660: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
f670: 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
f680: 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
f690: 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
f6a0: 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
f6b0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
f6c0: 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
f6d0: 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
f6e0: 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
f6f0: 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
f700: 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
f710: 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
f720: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
f730: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
f740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
f750: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
f760: 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
f770: 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
f780: 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
f790: 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
f7a0: 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
f7b0: 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
f7c0: 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
f7d0: 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
f7e0: 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
f7f0: 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
f800: 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
f810: 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
f820: 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
f830: 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
f840: 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
f850: 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
f860: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
f870: 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
f880: 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
f890: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
f8a0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 65  nformation..*/.e
f8b0: 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
f8c0: 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
f8d0: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63  p *interp){.  Tc
f8e0: 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
f8f0: 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20  rp, "8.4", 0);. 
f900: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
f910: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
f920: 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62  qlite3", (Tcl_Ob
f930: 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
f940: 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50  , 0, 0);.  Tcl_P
f950: 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
f960: 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43  , "sqlite3", PAC
f970: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
f980: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
f990: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
f9a0: 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a  qlite", (Tcl_Obj
f9b0: 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
f9c0: 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
f9d0: 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
f9e0: 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43 4b 41   "sqlite", PACKA
f9f0: 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72  GE_VERSION);.  r
fa00: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
fa10: 65 78 74 65 72 6e 20 69 6e 74 20 54 63 6c 73 71  extern int Tclsq
fa20: 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
fa30: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
fa40: 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
fa50: 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 65  nit(interp); }.e
fa60: 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
fa70: 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
fa80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
fa90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
faa0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 54 63 6c 73  .extern int Tcls
fab0: 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
fac0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
fad0: 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
fae0: 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK; }..#ifndef S
faf0: 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
fb00: 4e 4c 59 0a 65 78 74 65 72 6e 20 69 6e 74 20 53  NLY.extern int S
fb10: 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
fb20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
fb30: 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
fb40: 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 65  nit(interp); }.e
fb50: 78 74 65 72 6e 20 69 6e 74 20 54 63 6c 73 71 6c  xtern int Tclsql
fb60: 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ite_Init(Tcl_Int
fb70: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
fb80: 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
fb90: 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 65 78 74  t(interp); }.ext
fba0: 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53  ern int Sqlite_S
fbb0: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
fbc0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
fbd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 65 78  urn TCL_OK; }.ex
fbe0: 74 65 72 6e 20 69 6e 74 20 54 63 6c 73 71 6c 69  tern int Tclsqli
fbf0: 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
fc00: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
fc10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
fc20: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
fc30: 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   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 0a 2a 2a 20 54 68 65 20 63 6f 64  *****.** The cod
fc90: 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  e that follows i
fca0: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
fcb0: 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69  standalone TCL i
fcc0: 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2f 0a 0a  nterpreters.*/..
fcd0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63  /*.** If the mac
fce0: 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c  ro TCLSH is one,
fcf0: 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64   then put in cod
fd00: 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a  e this for the.*
fd10: 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65  * "main" routine
fd20: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69   that will initi
fd30: 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61  alize Tcl and ta
fd40: 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a  ke input from.**
fd50: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e   standard input.
fd60: 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31  .*/.#if TCLSH==1
fd70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
fd80: 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65  inloop[] =.  "se
fd90: 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22  t line {}\n".  "
fda0: 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64  while {![eof std
fdb0: 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69  in]} {\n".    "i
fdc0: 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20  f {$line!=\"\"} 
fdd0: 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73  {\n".      "puts
fde0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20   -nonewline \"> 
fdf0: 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73  \"\n".    "} els
fe00: 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75  e {\n".      "pu
fe10: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
fe20: 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e  % \"\n".    "}\n
fe30: 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74 64  ".    "flush std
fe40: 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65  out\n".    "appe
fe50: 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74  nd line [gets st
fe60: 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20  din]\n".    "if 
fe70: 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20  {[info complete 
fe80: 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20  $line]} {\n".   
fe90: 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b     "if {[catch {
fea0: 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65  uplevel #0 $line
feb0: 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a  } result]} {\n".
fec0: 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74          "puts st
fed0: 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72  derr \"Error: $r
fee0: 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20  esult\"\n".     
fef0: 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73   "} elseif {$res
ff00: 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ult!=\"\"} {\n".
ff10: 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72          "puts $r
ff20: 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22  esult\n".      "
ff30: 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20  }\n".      "set 
ff40: 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22  line {}\n".    "
ff50: 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
ff60: 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c    "append line \
ff70: 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  \n\n".    "}\n".
ff80: 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66    "}\n".;.#endif
ff90: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ../*.** If the m
ffa0: 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 74 77  acro TCLSH is tw
ffb0: 6f 2c 20 74 68 65 6e 20 67 65 74 20 74 68 65 20  o, then get the 
ffc0: 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f  main loop code o
ffd0: 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70  ut of.** the sep
ffe0: 61 72 61 74 65 20 66 69 6c 65 20 22 73 70 61 63  arate file "spac
fff0: 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f  eanal_tcl.h"..*/
10000 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74  .#if TCLSH==2.st
10010 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
10020 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64  oop[] = .#includ
10030 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c  e "spaceanal_tcl
10040 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64  .h".;.#endif..#d
10050 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e  efine TCLSH_MAIN
10060 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65   main   /* Neede
10070 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b  d to fake out mk
10080 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43  tclapp */.int TC
10090 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67  LSH_MAIN(int arg
100a0 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
100b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
100c0 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e  nterp;.  Tcl_Fin
100d0 64 45 78 65 63 75 74 61 62 6c 65 28 61 72 67 76  dExecutable(argv
100e0 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d  [0]);.  interp =
100f0 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72   Tcl_CreateInter
10100 70 28 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49  p();.  Sqlite3_I
10110 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66  nit(interp);.#if
10120 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
10130 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69    {.    extern i
10140 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49  nt Sqlitetest1_I
10150 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10160 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10170 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
10180 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10190 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
101a0 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
101b0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
101c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
101d0 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63  itetest4_Init(Tc
101e0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
101f0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10200 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f  etest5_Init(Tcl_
10210 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
10220 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
10230 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est6_Init(Tcl_In
10240 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
10250 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
10260 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t7_Init(Tcl_Inte
10270 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
10280 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 38   int Sqlitetest8
10290 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
102a0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
102b0 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f  nt Md5_Init(Tcl_
102c0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
102d0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
102e0 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f  estsse_Init(Tcl_
102f0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
10300 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
10310 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63  estasync_Init(Tc
10320 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10330 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10340 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
10350 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a  (Tcl_Interp*);..
10360 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f      Sqlitetest1_
10370 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10380 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e    Sqlitetest2_In
10390 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
103a0 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74  Sqlitetest3_Init
103b0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
103c0 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69  litetest4_Init(i
103d0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
103e0 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74  tetest5_Init(int
103f0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
10400 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72  test6_Init(inter
10410 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
10420 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st7_Init(interp)
10430 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
10440 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  8_Init(interp);.
10450 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73      Sqlitetestas
10460 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ync_Init(interp)
10470 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
10480 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65  tclvar_Init(inte
10490 72 70 29 3b 0a 20 20 20 20 4d 64 35 5f 49 6e 69  rp);.    Md5_Ini
104a0 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65  t(interp);.#ifde
104b0 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20  f SQLITE_SSE.   
104c0 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
104d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
104e0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
104f0 20 69 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c 20   if( argc>=2 || 
10500 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20  TCLSH==2 ){.    
10510 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f 53  int i;.    Tcl_S
10520 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
10530 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c  gv0",argv[1],TCL
10540 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
10550 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
10560 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c  terp,"argv", "",
10570 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
10580 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54  );.    for(i=3-T
10590 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b  CLSH; i<argc; i+
105a0 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  +){.      Tcl_Se
105b0 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72  tVar(interp, "ar
105c0 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20  gv", argv[i],.  
105d0 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42          TCL_GLOB
105e0 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49  AL_ONLY | TCL_LI
105f0 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c  ST_ELEMENT | TCL
10600 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a  _APPEND_VALUE);.
10610 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43      }.    if( TC
10620 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76  LSH==1 && Tcl_Ev
10630 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61  alFile(interp, a
10640 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20  rgv[1])!=TCL_OK 
10650 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
10660 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c  har *zInfo = Tcl
10670 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _GetVar(interp, 
10680 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c  "errorInfo", TCL
10690 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
106a0 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d       if( zInfo==
106b0 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65  0 ) zInfo = inte
106c0 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20  rp->result;.    
106d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
106e0 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72  ,"%s: %s\n", *ar
106f0 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20  gv, zInfo);.    
10700 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
10710 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63  }.  }.  if( argc
10720 3c 3d 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20  <=1 || TCLSH==2 
10730 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61  ){.    Tcl_Globa
10740 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d  lEval(interp, zM
10750 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20  ainloop);.  }.  
10760 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
10770 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a  if /* TCLSH */..
10780 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
10790 65 64 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a        ed(NO_TCL) */.