/ Hex Artifact Content
Login

Artifact 0220791dc66d287a7f199568393f04f3db24364b:


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: 36 32 20 32 30 30 36 2f 30 37 2f 30 36 20 31 37  62 2006/07/06 17
01c0: 3a 30 38 3a 34 38 20 64 72 68 20 45 78 70 20 24  :08:48 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 63 61 73 65 20 53  reak;.    case S
46e0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41  QLITE_CREATE_VTA
46f0: 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  BLE     : zCode=
4700: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56  "SQLITE_CREATE_V
4710: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
4720: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
4730: 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20  ROP_VTABLE      
4740: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4750: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62  _DROP_VTABLE"; b
4760: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
4770: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
4780: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4790: 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20  "????"; break;. 
47a0: 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67   }.  Tcl_DString
47b0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
47c0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
47d0: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68  &str, pDb->zAuth
47e0: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
47f0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4800: 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a  t(&str, zCode);.
4810: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4820: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
4830: 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a   zArg1 ? zArg1 :
4840: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
4850: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
4860: 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a  (&str, zArg2 ? z
4870: 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg2 : "");.  Tc
4880: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
4890: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
48a0: 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29  g3 ? zArg3 : "")
48b0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
48c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
48d0: 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34  r, zArg4 ? zArg4
48e0: 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54   : "");.  rc = T
48f0: 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44  cl_GlobalEval(pD
4900: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
4910: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
4920: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
4930: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a  gFree(&str);.  z
4940: 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53  Reply = Tcl_GetS
4950: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
4960: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  >interp);.  if( 
4970: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
4980: 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b  QLITE_OK")==0 ){
4990: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
49a0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
49b0: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
49c0: 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30  SQLITE_DENY")==0
49d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
49e0: 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73  ITE_DENY;.  }els
49f0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
4a00: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f  ply,"SQLITE_IGNO
4a10: 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  RE")==0 ){.    r
4a20: 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  c = SQLITE_IGNOR
4a30: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
4a40: 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20  rc = 999;.  }.  
4a50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
4a60: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a70: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
4a80: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74   */../*.** zText
4a90: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4aa0: 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76   text obtained v
4ab0: 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65  ia an sqlite3_re
4ac0: 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f  sult_text().** o
4ad0: 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66  r similar interf
4ae0: 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ace. This routin
4af0: 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20  e returns a Tcl 
4b00: 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a  string object, .
4b10: 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ** reference cou
4b20: 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e  nt set to 0, con
4b30: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74  taining the text
4b40: 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69  . If a translati
4b50: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73  on.** between is
4b60: 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20  o8859 and UTF-8 
4b70: 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20  is required, it 
4b80: 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f  is preformed..*/
4b90: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
4ba0: 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61  *dbTextToObj(cha
4bb0: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b  r const *zText){
4bc0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c  .  Tcl_Obj *pVal
4bd0: 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41  ;.#ifdef UTF_TRA
4be0: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a  NSLATION_NEEDED.
4bf0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43    Tcl_DString dC
4c00: 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ol;.  Tcl_DStrin
4c10: 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20  gInit(&dCol);.  
4c20: 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74  Tcl_ExternalToUt
4c30: 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a  fDString(NULL, z
4c40: 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29  Text, -1, &dCol)
4c50: 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e  ;.  pVal = Tcl_N
4c60: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
4c70: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43  DStringValue(&dC
4c80: 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ol), -1);.  Tcl_
4c90: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f  DStringFree(&dCo
4ca0: 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c  l);.#else.  pVal
4cb0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4cc0: 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a  Obj(zText, -1);.
4cd0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
4ce0: 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pVal;.}../*.** T
4cf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
4d00: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
4d10: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
4d20: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
4d30: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
4d40: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
4d50: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
4d60: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
4d70: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
4d80: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
4d90: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
4da0: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
4db0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ls..**.** The in
4dc0: 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20  terface is like 
4dd0: 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e  "readline" but n
4de0: 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65  o command-line e
4df0: 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e  diting.** is don
4e00: 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20  e..**.** copied 
4e10: 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f  from shell.c fro
4e20: 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d  m '.import' comm
4e30: 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  and.*/.static ch
4e40: 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  ar *local_getlin
4e50: 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c  e(char *zPrompt,
4e60: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
4e70: 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74  ar *zLine;.  int
4e80: 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b   nLine;.  int n;
4e90: 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e  .  int eol;..  n
4ea0: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
4eb0: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
4ec0: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
4ed0: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
4ee0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c  ;.  n = 0;.  eol
4ef0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21   = 0;.  while( !
4f00: 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  eol ){.    if( n
4f10: 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20  +100>nLine ){.  
4f20: 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e      nLine = nLin
4f30: 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20  e*2 + 100;.     
4f40: 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63   zLine = realloc
4f50: 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a  (zLine, nLine);.
4f60: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d        if( zLine=
4f70: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4f80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65     }.    if( fge
4f90: 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c  ts(&zLine[n], nL
4fa0: 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20  ine - n, in)==0 
4fb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  ){.      if( n==
4fc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65  0 ){.        fre
4fd0: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
4fe0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4ff0: 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b    }.      zLine[
5000: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
5010: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  l = 1;.      bre
5020: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  ak;.    }.    wh
5030: 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b  ile( zLine[n] ){
5040: 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   n++; }.    if( 
5050: 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31  n>0 && zLine[n-1
5060: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
5070: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   n--;.      zLin
5080: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
5090: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  eol = 1;.    }. 
50a0: 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61   }.  zLine = rea
50b0: 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31  lloc( zLine, n+1
50c0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69   );.  return zLi
50d0: 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ne;.}../*.** The
50e0: 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
50f0: 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20  d below creates 
5100: 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  a new Tcl comman
5110: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
5120: 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e  nnection it open
5130: 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64  s to an SQLite d
5140: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
5150: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
5160: 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e  d.** whenever on
5170: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
5180: 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63  ction-specific c
5190: 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75  ommands is execu
51a0: 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20  ted.** in Tcl.  
51b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
51c0: 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65  you run Tcl code
51d0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
51e0: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  *       sqlite3 
51f0: 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73  db1  "my_databas
5200: 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20  e".**       db1 
5210: 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  close.**.** The 
5220: 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70  first command op
5230: 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ens a connection
5240: 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61   to the "my_data
5250: 62 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a  base" database.*
5260: 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74  * and calls that
5270: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31   connection "db1
5280: 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63  ".  The second c
5290: 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68  ommand causes th
52a0: 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  is.** subroutine
52b0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a   to be invoked..
52c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
52d0: 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c  ObjCmd(void *cd,
52e0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
52f0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
5300: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
5310: 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
5320: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
5330: 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63  )cd;.  int choic
5340: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43  e;.  int rc = TC
5350: 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63  L_OK;.  static c
5360: 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74  onst char *DB_st
5370: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75  rs[] = {.    "au
5380: 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20  thorizer",      
5390: 20 20 20 22 62 75 73 79 22 2c 20 20 20 20 20 20     "busy",      
53a0: 20 20 20 20 20 20 20 20 22 63 61 63 68 65 22 2c          "cache",
53b0: 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20  .    "changes", 
53c0: 20 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73             "clos
53d0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
53e0: 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20 20 22  "collate",.    "
53f0: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
5400: 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f  ",   "commit_hoo
5410: 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d 70 6c  k",       "compl
5420: 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70 79 22  ete",.    "copy"
5430: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5440: 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  "enable_load_ext
5450: 65 6e 73 69 6f 6e 22 2c 22 65 72 72 6f 72 63 6f  ension","errorco
5460: 64 65 22 2c 0a 20 20 20 20 22 65 76 61 6c 22 2c  de",.    "eval",
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
5480: 65 78 69 73 74 73 22 2c 20 20 20 20 20 20 20 20  exists",        
5490: 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 0a      "function",.
54a0: 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74      "last_insert
54b0: 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c 76  _rowid",  "nullv
54c0: 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20 22  alue",         "
54d0: 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20  onecolumn",.    
54e0: 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20  "profile",      
54f0: 20 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22        "progress"
5500: 2c 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65  ,          "reke
5510: 79 22 2c 0a 20 20 20 20 22 72 6f 6c 6c 62 61 63  y",.    "rollbac
5520: 6b 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 22 74  k_hook",      "t
5530: 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20  imeout",        
5540: 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65     "total_change
5550: 73 22 2c 0a 20 20 20 20 22 74 72 61 63 65 22 2c  s",.    "trace",
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
5570: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20  ransaction",    
5580: 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22     "update_hook"
5590: 2c 0a 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c  ,.    "version",
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42   .  };.  enum DB
55d0: 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41  _enum {.    DB_A
55e0: 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20  UTHORIZER,      
55f0: 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20    DB_BUSY,      
5600: 20 20 20 20 20 20 20 44 42 5f 43 41 43 48 45 2c         DB_CACHE,
5610: 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c  .    DB_CHANGES,
5620: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c             DB_CL
5630: 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
5640: 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20 20  DB_COLLATE,.    
5650: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
5660: 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54 5f  DED,  DB_COMMIT_
5670: 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43 4f  HOOK,      DB_CO
5680: 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f 43  MPLETE,.    DB_C
5690: 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  OPY,            
56a0: 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44    DB_ENABLE_LOAD
56b0: 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f 45 52  _EXTENSION,DB_ER
56c0: 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44 42 5f  RORCODE,.    DB_
56d0: 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20  EVAL,           
56e0: 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20 20 20     DB_EXISTS,   
56f0: 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43 54          DB_FUNCT
5700: 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 4c 41 53 54  ION,.    DB_LAST
5710: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20 44  _INSERT_ROWID, D
5720: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
5730: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
5740: 2c 0a 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45  ,.    DB_PROFILE
5750: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 50  ,           DB_P
5760: 52 4f 47 52 45 53 53 2c 20 20 20 20 20 20 20 20  ROGRESS,        
5770: 20 44 42 5f 52 45 4b 45 59 2c 0a 20 20 20 20 44   DB_REKEY,.    D
5780: 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c  B_ROLLBACK_HOOK,
5790: 20 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c       DB_TIMEOUT,
57a0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54            DB_TOT
57b0: 41 4c 5f 43 48 41 4e 47 45 53 2c 0a 20 20 20 20  AL_CHANGES,.    
57c0: 44 42 5f 54 52 41 43 45 2c 20 20 20 20 20 20 20  DB_TRACE,       
57d0: 20 20 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43        DB_TRANSAC
57e0: 54 49 4f 4e 2c 20 20 20 20 20 20 44 42 5f 55 50  TION,      DB_UP
57f0: 44 41 54 45 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44  DATE_HOOK,.    D
5800: 42 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20  B_VERSION,      
5810: 20 20 20 20 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64      .  };.  /* d
5820: 6f 6e 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c  on't leave trail
5830: 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42  ing commas on DB
5840: 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73  _enum, it confus
5850: 65 73 20 74 68 65 20 41 49 58 20 78 6c 63 20 63  es the AIX xlc c
5860: 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66  ompiler */..  if
5870: 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20  ( objc<2 ){.    
5880: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
5890: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
58a0: 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e  , "SUBCOMMAND ..
58b0: 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
58c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
58d0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65   if( Tcl_GetInde
58e0: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
58f0: 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72   objv[1], DB_str
5900: 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20  s, "option", 0, 
5910: 26 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20  &choice) ){.    
5920: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5930: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
5940: 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63   (enum DB_enum)c
5950: 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20  hoice ){..  /*  
5960: 20 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72    $db authorizer
5970: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
5980: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
5990: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
59a0: 74 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63  to authorize eac
59b0: 68 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20  h SQL operation 
59c0: 61 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f  as it is.  ** co
59d0: 6d 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d  mpiled.  5 argum
59e0: 65 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64 65  ents are appende
59f0: 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  d to the callbac
5a00: 6b 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20  k before it is. 
5a10: 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a   ** invoked:.  *
5a20: 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65  *.  **   (1) The
5a30: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
5a40: 79 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f  ype (ex: SQLITE_
5a50: 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51  CREATE_TABLE, SQ
5a60: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e  LITE_INSERT, ...
5a70: 29 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72  ).  **   (2) Fir
5a80: 73 74 20 64 65 73 63 72 69 70 74 69 76 65 20 6e  st descriptive n
5a90: 61 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20  ame (depends on 
5aa0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79  authorization ty
5ab0: 70 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53  pe).  **   (3) S
5ac0: 65 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76  econd descriptiv
5ad0: 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34  e name.  **   (4
5ae0: 29 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  ) Name of the da
5af0: 74 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69  tabase (ex: "mai
5b00: 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a  n", "temp").  **
5b10: 20 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74     (5) Name of t
5b20: 72 69 67 67 65 72 20 74 68 61 74 20 69 73 20 64  rigger that is d
5b30: 6f 69 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a  oing the access.
5b40: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61    **.  ** The ca
5b50: 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65  llback should re
5b60: 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66  turn on of the f
5b70: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73  ollowing strings
5b80: 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a  : SQLITE_OK,.  *
5b90: 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c  * SQLITE_IGNORE,
5ba0: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e   or SQLITE_DENY.
5bb0: 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
5bc0: 72 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65  rn value is an e
5bd0: 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rror..  **.  ** 
5be0: 49 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69  If this method i
5bf0: 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e  s invoked with n
5c00: 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65  o arguments, the
5c10: 20 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69   current authori
5c20: 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c  zation.  ** call
5c30: 62 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72  back string is r
5c40: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  eturned..  */.  
5c50: 63 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a  case DB_AUTHORIZ
5c60: 45 52 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c  ER: {.#ifdef SQL
5c70: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
5c80: 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41  ZATION.    Tcl_A
5c90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
5ca0: 72 70 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69  rp, "authorizati
5cb0: 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  on not available
5cc0: 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c   in this build",
5cd0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
5ce0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
5cf0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
5d00: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
5d10: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
5d20: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
5d30: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
5d40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5d50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5d60: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
5d70: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
5d80: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
5d90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
5da0: 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20  rp, pDb->zAuth, 
5db0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
5dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
5dd0: 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20  r *zAuth;.      
5de0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
5df0: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
5e00: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
5e10: 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20  e(pDb->zAuth);. 
5e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75       }.      zAu
5e30: 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  th = Tcl_GetStri
5e40: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
5e50: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
5e60: 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e  if( zAuth && len
5e70: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
5e80: 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41  b->zAuth = Tcl_A
5e90: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
5ea0: 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
5eb0: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74  pDb->zAuth, zAut
5ec0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  h);.      }else{
5ed0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
5ee0: 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  uth = 0;.      }
5ef0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
5f00: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
5f10: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
5f20: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
5f30: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
5f40: 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 61  rizer(pDb->db, a
5f50: 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44  uth_callback, pD
5f60: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
5f70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5f80: 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
5f90: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
5fa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
5fb0: 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
5fc0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
5fd0: 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f   busy ?CALLBACK?
5fe0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
5ff0: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
6000: 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73  back if an SQL s
6010: 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74  tatement attempt
6020: 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  s to open.  ** a
6030: 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65   locked database
6040: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61   file..  */.  ca
6050: 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20  se DB_BUSY: {.  
6060: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
6070: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6080: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6090: 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43  , objv, "CALLBAC
60a0: 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
60b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
60c0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
60d0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
60e0: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
60f0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
6100: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
6110: 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20  Db->zBusy, 0);. 
6120: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
6130: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  {.      char *zB
6140: 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  usy;.      int l
6150: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
6160: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
6170: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
6180: 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20  ->zBusy);.      
6190: 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20  }.      zBusy = 
61a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
61b0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
61c0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
61d0: 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Busy && len>0 ){
61e0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
61f0: 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  usy = Tcl_Alloc(
6200: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
6210: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
6220: 7a 42 75 73 79 2c 20 7a 42 75 73 79 29 3b 0a 20  zBusy, zBusy);. 
6230: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6240: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
6250: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6260: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
6270: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
6280: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
6290: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
62a0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
62b0: 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61  Db->db, DbBusyHa
62c0: 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
62d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
62e0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
62f0: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
6300: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
6310: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
6320: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
6330: 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20  b cache flush.  
6340: 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65  **     $db cache
6350: 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a   size n.  **.  *
6360: 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72 65 70  * Flush the prep
6370: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63  ared statement c
6380: 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68 65  ache, or set the
6390: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
63a0: 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20 73  of.  ** cached s
63b0: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
63c0: 20 20 63 61 73 65 20 44 42 5f 43 41 43 48 45 3a    case DB_CACHE:
63d0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75 62   {.    char *sub
63e0: 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  Cmd;.    int n;.
63f0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32  .    if( objc<=2
6400: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
6410: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
6420: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63  p, 1, objv, "cac
6430: 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22  he option ?arg?"
6440: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6450: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6460: 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54 63  .    subCmd = Tc
6470: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
6480: 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29  bj( objv[2], 0 )
6490: 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43 6d  ;.    if( *subCm
64a0: 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d 70  d=='f' && strcmp
64b0: 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22 29  (subCmd,"flush")
64c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
64d0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
64e0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
64f0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
6500: 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a  objv, "flush");.
6510: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
6520: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
6530: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
6540: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
6550: 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Db );.      }.  
6560: 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75 62    }else if( *sub
6570: 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72 63  Cmd=='s' && strc
6580: 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65 22  mp(subCmd,"size"
6590: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
65a0: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
65b0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
65c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
65d0: 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29   objv, "size n")
65e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
65f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6610: 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d   if( TCL_ERROR==
6620: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
6630: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
6640: 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  ], &n) ){.      
6650: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
6660: 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 63  sult( interp, "c
6670: 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22  annot convert \"
6680: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
6690: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
66a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
66b0: 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67  0), "\" to integ
66c0: 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  er", 0);.       
66d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
66e0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
66f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
6700: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( n<0 ){.       
6710: 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61       flushStmtCa
6720: 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20  che( pDb );.    
6730: 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20          n = 0;. 
6740: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
6750: 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45  f( n>MAX_PREPARE
6760: 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20  D_STMTS ){.     
6770: 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50         n = MAX_P
6780: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
6790: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
67a0: 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d       pDb->maxStm
67b0: 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d  t = n;.        }
67c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
67d0: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
67e0: 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65  pendResult( inte
67f0: 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20  rp, "bad option 
6800: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
6810: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6820: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 30 29 2c  mObj(objv[0],0),
6830: 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 66 6c   "\": must be fl
6840: 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 20 30 29  ush or size", 0)
6850: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
6860: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6880: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61    /*     $db cha
6890: 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  nges.  **.  ** R
68a0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
68b0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65   of rows that we
68c0: 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73  re modified, ins
68d0: 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65  erted, or delete
68e0: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f  d by.  ** the mo
68f0: 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54  st recent INSERT
6900: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
6910: 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f  TE statement, no
6920: 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a  t including .  *
6930: 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  * any changes ma
6940: 64 65 20 62 79 20 74 72 69 67 67 65 72 20 70 72  de by trigger pr
6950: 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63  ograms..  */.  c
6960: 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a 20  ase DB_CHANGES: 
6970: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
6980: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
6990: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
69a0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
69b0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
69c0: 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
69d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
69e0: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
69f0: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
6a00: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
6a10: 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
6a20: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
6a30: 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
6a40: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
6a50: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
6a60: 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  close.  **.  ** 
6a70: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61 74  Shutdown the dat
6a80: 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73  abase.  */.  cas
6a90: 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20  e DB_CLOSE: {.  
6aa0: 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d    Tcl_DeleteComm
6ab0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  and(interp, Tcl_
6ac0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
6ad0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20  (objv[0], 0));. 
6ae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6af0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
6b00: 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43   collate NAME SC
6b10: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
6b20: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
6b30: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
6b40: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
6b50: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
6b60: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
6b70: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
6b80: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
6b90: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
6ba0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
6bb0: 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53 71  OLLATE: {.    Sq
6bc0: 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61  lCollate *pColla
6bd0: 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  te;.    char *zN
6be0: 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ame;.    char *z
6bf0: 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20  Script;.    int 
6c00: 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28  nScript;.    if(
6c10: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
6c20: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6c30: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
6c40: 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54  jv, "NAME SCRIPT
6c50: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6c60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6c70: 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
6c80: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
6c90: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
6ca0: 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63      zScript = Tc
6cb0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
6cc0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63  bj(objv[3], &nSc
6cd0: 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ript);.    pColl
6ce0: 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74  ate = (SqlCollat
6cf0: 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  e*)Tcl_Alloc( si
6d00: 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20  zeof(*pCollate) 
6d10: 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20 29 3b  + nScript + 1 );
6d20: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 61 74  .    if( pCollat
6d30: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  e==0 ) return TC
6d40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f  L_ERROR;.    pCo
6d50: 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20  llate->interp = 
6d60: 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c  interp;.    pCol
6d70: 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44  late->pNext = pD
6d80: 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  b->pCollate;.   
6d90: 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69   pCollate->zScri
6da0: 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  pt = (char*)&pCo
6db0: 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44  llate[1];.    pD
6dc0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43  b->pCollate = pC
6dd0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 73 74 72 63  ollate;.    strc
6de0: 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63  py(pCollate->zSc
6df0: 72 69 70 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a  ript, zScript);.
6e00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
6e10: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
6e20: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
6e30: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
6e40: 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
6e50: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
6e60: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
6e70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
6e80: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
6e90: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
6ea0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
6eb0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6ec0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6ed0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6ee0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
6ef0: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
6f00: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
6f10: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
6f20: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
6f30: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
6f40: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
6f50: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
6f60: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
6f70: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
6f80: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
6f90: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
6fa0: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
6fb0: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
6fc0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
6fd0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6fe0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
6ff0: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
7000: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7010: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
7020: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
7030: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
7040: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
7050: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
7060: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
7070: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
7080: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
7090: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
70a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
70b0: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
70c0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
70d0: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
70e0: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
70f0: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
7100: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
7110: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
7120: 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
7130: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
7140: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
7150: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
7160: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
7170: 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
7180: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
7190: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
71a0: 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
71b0: 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
71c0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
71d0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
71e0: 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
71f0: 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
7200: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
7210: 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
7220: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
7230: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
7240: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
7250: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
7260: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
7270: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
7280: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
7290: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
72a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
72b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
72c0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
72d0: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
72e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
72f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7300: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
7310: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
7320: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7330: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20  char *zCommit;. 
7340: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
7350: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
7360: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
7370: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43  Tcl_Free(pDb->zC
7380: 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ommit);.      }.
7390: 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
73a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
73b0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
73c0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
73d0: 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20  Commit && len>0 
73e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
73f0: 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c  zCommit = Tcl_Al
7400: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
7410: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
7420: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f  Db->zCommit, zCo
7430: 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  mmit);.      }el
7440: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
7450: 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20  >zCommit = 0;.  
7460: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7470: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
7480: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
7490: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
74a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
74b0: 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  mmit_hook(pDb->d
74c0: 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c  b, DbCommitHandl
74d0: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
74e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
74f0: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
7500: 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  ok(pDb->db, 0, 0
7510: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7520: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7530: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d  .  /*    $db com
7540: 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20  plete SQL.  **. 
7550: 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20   ** Return TRUE 
7560: 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70  if SQL is a comp
7570: 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
7580: 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  nt.  Return FALS
7590: 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69  E if.  ** additi
75a0: 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e  onal lines of in
75b0: 70 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20  put are needed. 
75c0: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
75d0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69   to the.  ** bui
75e0: 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70  lt-in "info comp
75f0: 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66  lete" command of
7600: 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   Tcl..  */.  cas
7610: 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b  e DB_COMPLETE: {
7620: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7630: 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20  OMIT_COMPLETE.  
7640: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
7650: 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f  lt;.    int isCo
7660: 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20  mplete;.    if( 
7670: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
7680: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
7690: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
76a0: 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20  v, "SQL");.     
76b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
76c0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43  R;.    }.    isC
76d0: 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65  omplete = sqlite
76e0: 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f  3_complete( Tcl_
76f0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
7700: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a  (objv[2], 0) );.
7710: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
7720: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
7730: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
7740: 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52  SetBooleanObj(pR
7750: 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74  esult, isComplet
7760: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62  e);.#endif.    b
7770: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
7780: 20 20 20 24 64 62 20 63 6f 70 79 20 63 6f 6e 66     $db copy conf
7790: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74  lict-algorithm t
77a0: 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53  able filename ?S
77b0: 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49  EPARATOR? ?NULLI
77c0: 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20  NDICATOR?.  **. 
77d0: 20 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 69 6e   ** Copy data in
77e0: 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20 66 69  to table from fi
77f0: 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c  lename, optional
7800: 6c 79 20 75 73 69 6e 67 20 53 45 50 41 52 41 54  ly using SEPARAT
7810: 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d  OR.  ** as colum
7820: 6e 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 49  n separators.  I
7830: 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  f a column conta
7840: 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e  ins a null strin
7850: 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76  g, or the.  ** v
7860: 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49  alue of NULLINDI
7870: 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73  CATOR, a NULL is
7880: 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68   inserted for th
7890: 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63  e column..  ** c
78a0: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
78b0: 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  m is one of the 
78c0: 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74 20  sqlite conflict 
78d0: 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a  algorithms:.  **
78e0: 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62      rollback, ab
78f0: 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72  ort, fail, ignor
7900: 65 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  e, replace.  ** 
7910: 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
7920: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
7930: 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64   lines processed
7940: 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  , not necessaril
7950: 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27  y same.  ** as '
7960: 64 62 20 63 68 61 6e 67 65 73 27 20 64 75 65 20  db changes' due 
7970: 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  to conflict-algo
7980: 72 69 74 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a  rithm selected..
7990: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
79a0: 6f 64 65 20 69 73 20 62 61 73 69 63 61 6c 6c 79  ode is basically
79b0: 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
79c0: 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f  on/enhancement o
79d0: 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
79e0: 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70  e3 shell.c ".imp
79f0: 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20  ort" command..  
7a00: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d  **.  ** This com
7a10: 6d 61 6e 64 20 75 73 61 67 65 20 69 73 20 65 71  mand usage is eq
7a20: 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20  uivalent to the 
7a30: 73 71 6c 69 74 65 32 2e 78 20 43 4f 50 59 20 73  sqlite2.x COPY s
7a40: 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77  tatement,.  ** w
7a50: 68 69 63 68 20 69 6d 70 6f 72 74 73 20 66 69 6c  hich imports fil
7a60: 65 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61  e data into a ta
7a70: 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 50 6f  ble using the Po
7a80: 73 74 67 72 65 53 51 4c 20 43 4f 50 59 20 66 69  stgreSQL COPY fi
7a90: 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20  le format:.  ** 
7aa0: 20 20 24 64 62 20 63 6f 70 79 20 24 63 6f 6e 66    $db copy $conf
7ab0: 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f  lit_algo $table_
7ac0: 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c  name $filename \
7ad0: 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73  t \\N.  */.  cas
7ae0: 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20  e DB_COPY: {.   
7af0: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20   char *zTable;  
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b10: 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
7b20: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
7b30: 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20     char *zFile; 
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b50: 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20  * The file from 
7b60: 77 68 69 63 68 20 74 6f 20 65 78 74 72 61 63 74  which to extract
7b70: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 63 68 61   data */.    cha
7b80: 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20  r *zConflict;   
7b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7ba0: 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  conflict algorit
7bb0: 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  hm to use */.   
7bc0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
7bd0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  Stmt;        /* 
7be0: 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  A statement */. 
7bf0: 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7c10: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
7c20: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
7c50: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
7c60: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
7c70: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
7c80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7c90: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53  of bytes in an S
7ca0: 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  QL string */.   
7cb0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7cd0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
7ce0: 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20  .    int nSep;  
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
7d10: 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f  tes in zSep[] */
7d20: 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20  .    int nNull; 
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
7d50: 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a  tes in zNull[] *
7d60: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  /.    char *zSql
7d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d80: 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74    /* An SQL stat
7d90: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  ement */.    cha
7da0: 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20  r *zLine;       
7db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
7dc0: 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70  ngle line of inp
7dd0: 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ut from the file
7de0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   */.    char **a
7df0: 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zCol;           
7e00: 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62      /* zLine[] b
7e10: 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f  roken up into co
7e20: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61  lumns */.    cha
7e30: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20  r *zCommit;     
7e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
7e50: 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65  to commit change
7e60: 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69  s */.    FILE *i
7e70: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
7e80: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75       /* The inpu
7e90: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  t file */.    in
7ea0: 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20  t lineno = 0;   
7eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
7ec0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  e number of inpu
7ed0: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68  t file */.    ch
7ee0: 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b  ar zLineNum[80];
7ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
7f00: 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62  e number print b
7f10: 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c  uffer */.    Tcl
7f20: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20  _Obj *pResult;  
7f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65           /* inte
7f40: 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  rp result */..  
7f50: 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20    char *zSep;.  
7f60: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20    char *zNull;. 
7f70: 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c     if( objc<5 ||
7f80: 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20   objc>7 ){.     
7f90: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
7fa0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
7fb0: 76 2c 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f  v, .         "CO
7fc0: 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d  NFLICT-ALGORITHM
7fd0: 20 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20   TABLE FILENAME 
7fe0: 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c  ?SEPARATOR? ?NUL
7ff0: 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20  LINDICATOR?");. 
8000: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8010: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8020: 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a   if( objc>=6 ){.
8030: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c        zSep = Tcl
8040: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8050: 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20  j(objv[5], 0);. 
8060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8070: 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20  zSep = "\t";.   
8080: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   }.    if( objc>
8090: 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  =7 ){.      zNul
80a0: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
80b0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d  gFromObj(objv[6]
80c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
80d0: 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22  .      zNull = "
80e0: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  ";.    }.    zCo
80f0: 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74  nflict = Tcl_Get
8100: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
8110: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
8120: 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  Table = Tcl_GetS
8130: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8140: 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46  v[3], 0);.    zF
8150: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
8160: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8170: 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70  4], 0);.    nSep
8180: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65 70 29 3b   = strlen(zSep);
8190: 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72  .    nNull = str
81a0: 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20  len(zNull);.    
81b0: 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20  if( nSep==0 ){. 
81c0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
81d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
81e0: 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73  rror: non-null s
81f0: 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
8200: 64 20 66 6f 72 20 63 6f 70 79 22 2c 20 30 29 3b  d for copy", 0);
8210: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8220: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8230: 20 20 20 69 66 28 73 71 6c 69 74 65 33 53 74 72     if(sqlite3Str
8240: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
8250: 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30  "rollback") != 0
8260: 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74   &&.       sqlit
8270: 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c  e3StrICmp(zConfl
8280: 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20 29  ict, "abort"   )
8290: 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
82a0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
82b0: 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c 22  Conflict, "fail"
82c0: 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20      ) != 0 &&.  
82d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
82e0: 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  Cmp(zConflict, "
82f0: 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30 20  ignore"  ) != 0 
8300: 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  &&.       sqlite
8310: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
8320: 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20  ct, "replace" ) 
8330: 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54  != 0 ) {.      T
8340: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8350: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
8360: 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20  \"", zConflict, 
8370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
8380: 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  , conflict-algor
8390: 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65  ithm must be one
83a0: 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22   of: rollback, "
83b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 62  .            "ab
83c0: 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72  ort, fail, ignor
83d0: 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20  e, or replace", 
83e0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
83f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8400: 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  }.    zSql = sql
8410: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
8420: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27  LECT * FROM '%q'
8430: 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
8440: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
8450: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
8460: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
8470: 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61  rror: no such ta
8480: 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20  ble: ", zTable, 
8490: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
84a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
84b0: 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74  }.    nByte = st
84c0: 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20  rlen(zSql);.    
84d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
84e0: 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
84f0: 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20 30  ql, 0, &pStmt, 0
8500: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
8510: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
8520: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
8530: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8540: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
8550: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
8560: 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
8570: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a        nCol = 0;.
8580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8590: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
85a0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
85b0: 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  mt);.    }.    s
85c0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
85d0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
85e0: 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  nCol==0 ) {.    
85f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8600: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  OR;.    }.    zS
8610: 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  ql = malloc( nBy
8620: 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32  te + 50 + nCol*2
8630: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
8640: 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
8650: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8660: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
8670: 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
8680: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
8690: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
86a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
86b0: 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c  printf(nByte+50,
86c0: 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f   zSql, "INSERT O
86d0: 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56  R %q INTO '%q' V
86e0: 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20  ALUES(?",.      
86f0: 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54     zConflict, zT
8700: 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73  able);.    j = s
8710: 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20  trlen(zSql);.   
8720: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c   for(i=1; i<nCol
8730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53  ; i++){.      zS
8740: 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  ql[j++] = ',';. 
8750: 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
8760: 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   '?';.    }.    
8770: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b  zSql[j++] = ')';
8780: 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30  .    zSql[j] = 0
8790: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
87a0: 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e  e3_prepare(pDb->
87b0: 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53  db, zSql, 0, &pS
87c0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  tmt, 0);.    fre
87d0: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
87e0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
87f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8800: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c  terp, "Error: ",
8810: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
8820: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
8830: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
8840: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
8850: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8860: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
8870: 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
8880: 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
8890: 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  in==0 ){.      T
88a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
88b0: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
88c0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
88d0: 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c  : ", zFile, NULL
88e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
88f0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
8900: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8910: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8920: 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c      azCol = mall
8930: 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c  oc( sizeof(azCol
8940: 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b  [0])*(nCol+1) );
8950: 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  .    if( azCol==
8960: 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
8970: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8980: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
8990: 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29  't malloc()", 0)
89a0: 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  ;.      fclose(i
89b0: 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
89c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
89d0: 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  }.    (void)sqli
89e0: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
89f0: 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
8a00: 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74   0);.    zCommit
8a10: 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20   = "COMMIT";.   
8a20: 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d   while( (zLine =
8a30: 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30   local_getline(0
8a40: 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20  , in))!=0 ){.   
8a50: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
8a60: 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c    i = 0;.      l
8a70: 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61  ineno++;.      a
8a80: 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b  zCol[0] = zLine;
8a90: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
8aa0: 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b  z=zLine; *z; z++
8ab0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  ){.        if( *
8ac0: 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74  z==zSep[0] && st
8ad0: 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e  rncmp(z, zSep, n
8ae0: 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sep)==0 ){.     
8af0: 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20       *z = 0;.   
8b00: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
8b10: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c        if( i<nCol
8b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8b30: 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53  azCol[i] = &z[nS
8b40: 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ep];.           
8b50: 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20   z += nSep-1;.  
8b60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8b70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8b80: 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20    if( i+1!=nCol 
8b90: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8ba0: 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 7a  *zErr;.        z
8bb0: 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 32 30 30  Err = malloc(200
8bc0: 20 2b 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29   + strlen(zFile)
8bd0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
8be0: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Err ){.         
8bf0: 20 73 70 72 69 6e 74 66 28 7a 45 72 72 2c 0a 20   sprintf(zErr,. 
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72              "Err
8c10: 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20  or: %s line %d: 
8c20: 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
8c30: 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74 20  mns of data but 
8c40: 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20  found %d",.     
8c50: 20 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c          zFile, l
8c60: 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31  ineno, nCol, i+1
8c70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  );.          Tcl
8c80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8c90: 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a  terp, zErr, 0);.
8ca0: 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a            free(z
8cb0: 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Err);.        }.
8cc0: 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
8cd0: 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
8ce0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8cf0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
8d00: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
8d10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65  {.        /* che
8d20: 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61  ck for null data
8d30: 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73  , if so, bind as
8d40: 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   null */.       
8d50: 20 69 66 20 28 28 6e 4e 75 6c 6c 3e 30 20 26 26   if ((nNull>0 &&
8d60: 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d   strcmp(azCol[i]
8d70: 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20 7c 7c 20  , zNull)==0) || 
8d80: 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29  strlen(azCol[i])
8d90: 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ==0) {.         
8da0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
8db0: 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a  ll(pStmt, i+1);.
8dc0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8dd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8de0: 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
8df0: 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  , i+1, azCol[i],
8e00: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
8e10: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
8e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8e30: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
8e40: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
8e50: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
8e60: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c  );.      free(zL
8e70: 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
8e80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8e90: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
8ea0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8eb0: 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69  ,"Error: ", sqli
8ec0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
8ed0: 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  db), 0);.       
8ee0: 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c   zCommit = "ROLL
8ef0: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62  BACK";.        b
8f00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8f10: 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43    }.    free(azC
8f20: 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28  ol);.    fclose(
8f30: 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  in);.    sqlite3
8f40: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
8f50: 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  ;.    (void)sqli
8f60: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
8f70: 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c  , zCommit, 0, 0,
8f80: 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43   0);..    if( zC
8f90: 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20  ommit[0] == 'C' 
8fa0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63  ){.      /* succ
8fb0: 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20  ess, set result 
8fc0: 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  as number of lin
8fd0: 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  es processed */.
8fe0: 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20        pResult = 
8ff0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
9000: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  (interp);.      
9010: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
9020: 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  esult, lineno);.
9030: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
9040: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
9050: 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20      /* failure, 
9060: 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68  append lineno wh
9070: 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ere failed */.  
9080: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
9090: 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f  eNum,"%d",lineno
90a0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  );.      Tcl_App
90b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
90c0: 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65  ,", failed while
90d0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65   processing line
90e0: 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b  : ",zLineNum,0);
90f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
9100: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9110: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
9120: 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e  *.  **    $db en
9130: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
9140: 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a  ion BOOLEAN.  **
9150: 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65  .  ** Turn the e
9160: 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67  xtension loading
9170: 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f   feature on or o
9180: 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62  ff.  It if off b
9190: 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a  y.  ** default..
91a0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
91b0: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
91c0: 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20  SION: {.    int 
91d0: 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28 20 6f  onoff;.    if( o
91e0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
91f0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
9200: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
9210: 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  , "BOOLEAN");.  
9220: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9230: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
9240: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
9250: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
9260: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66  , objv[2], &onof
9270: 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
9280: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9290: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
92a0: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
92b0: 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 6f  nsion(pDb->db, o
92c0: 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65 61 6b  noff);.    break
92d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
92e0: 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64      $db errorcod
92f0: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  e.  **.  ** Retu
9300: 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65  rn the numeric e
9310: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77  rror code that w
9320: 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  as returned by t
9330: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20  he most recent. 
9340: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
9350: 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f  te3_exec()..  */
9360: 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52  .  case DB_ERROR
9370: 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  CODE: {.    Tcl_
9380: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
9390: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
93a0: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  bj(sqlite3_errco
93b0: 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  de(pDb->db)));. 
93c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
93d0: 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24   .  /*.  **    $
93e0: 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72  db eval $sql ?ar
93f0: 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65  ray? ?{  ...code
9400: 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24  ... }?.  **    $
9410: 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71  db onecolumn $sq
9420: 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  l.  **.  ** The 
9430: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
9440: 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74   $sql is evaluat
9450: 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f  ed.  For each ro
9460: 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  w, the values ar
9470: 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e  e.  ** placed in
9480: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
9490: 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72   array named "ar
94a0: 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65  ray" and ...code
94b0: 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e  ... is executed.
94c0: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
94d0: 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20   and "code" are 
94e0: 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f  omitted, then no
94f0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65   callback is eve
9500: 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a  ry invoked..  **
9510: 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61   If "array" is a
9520: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
9530: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20  then the values 
9540: 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61  are placed in va
9550: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61  riables.  ** tha
9560: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
9570: 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c  name as the fiel
9580: 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ds extracted by 
9590: 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  the query..  **.
95a0: 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75    ** The onecolu
95b0: 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65  mn method is the
95c0: 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a   equivalent of:.
95d0: 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20    **     lindex 
95e0: 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20  [$db eval $sql] 
95f0: 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  0.  */.  case DB
9600: 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61  _ONECOLUMN:.  ca
9610: 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20 63 61  se DB_EVAL:.  ca
9620: 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20 7b 0a  se DB_EXISTS: {.
9630: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
9640: 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65  zSql;      /* Ne
9650: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
9660: 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20   to execute */. 
9670: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
9680: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57 68 61  Left;     /* Wha
9690: 74 20 69 73 20 6c 65 66 74 20 61 66 74 65 72 20  t is left after 
96a0: 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20 7a 53  first stmt in zS
96b0: 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ql */.    sqlite
96c0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
96d0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c   /* Compiled SQL
96e0: 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20   statment */.   
96f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
9700: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
9710: 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20 77 68  of array into wh
9720: 69 63 68 20 72 65 73 75 6c 74 73 20 61 72 65 20  ich results are 
9730: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54  written */.    T
9740: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
9750: 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20        /* Script 
9760: 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20  to run for each 
9770: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
9780: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61    Tcl_Obj **apPa
9790: 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 61  rm;      /* Para
97a0: 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65 65 64  meters that need
97b0: 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   a Tcl_DecrRefCo
97c0: 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  unt() */.    int
97d0: 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20   nParm;         
97e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
97f0: 20 65 6e 74 72 69 65 73 20 75 73 65 64 20 69 6e   entries used in
9800: 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20   apParm[] */.   
9810: 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b   Tcl_Obj *aParm[
9820: 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74 69  10];    /* Stati
9830: 63 20 73 70 61 63 65 20 66 6f 72 20 61 70 50 61  c space for apPa
9840: 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d  rm[] in the comm
9850: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 54  on case */.    T
9860: 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20  cl_Obj *pRet;   
9870: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
9880: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f  o be returned */
9890: 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64  .    SqlPrepared
98a0: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20  Stmt *pPreStmt; 
98b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
98c0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
98d0: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ent */.    int r
98e0: 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63 68 6f  c2;..    if( cho
98f0: 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29 7b 0a  ice==DB_EVAL ){.
9900: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33        if( objc<3
9910: 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20   || objc>5 ){.  
9920: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9930: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9940: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52  , objv, "SQL ?AR
9950: 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50  RAY-NAME? ?SCRIP
9960: 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  T?");.        re
9970: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
9990: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
99a0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
99b0: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
99c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
99d0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
99e0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
99f0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
9a00: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22  , 2, objv, "SQL"
9a10: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
9a20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9a30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
9a40: 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53  hoice==DB_EXISTS
9a50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74   ){.        pRet
9a60: 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61   = Tcl_NewBoolea
9a70: 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20 20 20  nObj(0);.       
9a80: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
9a90: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d  t(pRet);.      }
9aa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 52  else{.        pR
9ab0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
9ac0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
9ad0: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70  jc==3 ){.      p
9ae0: 41 72 72 61 79 20 3d 20 70 53 63 72 69 70 74 20  Array = pScript 
9af0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
9b00: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
9b10: 20 20 20 20 70 41 72 72 61 79 20 3d 20 30 3b 0a      pArray = 0;.
9b20: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
9b30: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c  objv[3];.    }el
9b40: 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79  se{.      pArray
9b50: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
9b60: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53 74 72    if( Tcl_GetStr
9b70: 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d 3d 3d  ing(pArray)[0]==
9b80: 30 20 29 20 70 41 72 72 61 79 20 3d 20 30 3b 0a  0 ) pArray = 0;.
9b90: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
9ba0: 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a  objv[4];.    }..
9bb0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
9bc0: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ount(objv[2]);. 
9bd0: 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65     zSql = Tcl_Ge
9be0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9bf0: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
9c00: 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f  while( rc==TCL_O
9c10: 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a  K && zSql[0] ){.
9c20: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
9c50: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
9c60: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
9c70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9c80: 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72  f bind parameter
9c90: 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74 20 2a  s in the pStmt *
9ca0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  /.      int nCol
9cb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9cc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9cd0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
9ce0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
9cf0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
9d00: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 2f 2a  olName = 0;   /*
9d10: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
9d20: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20   names */.      
9d30: 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  int len;        
9d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
9d50: 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66 20 7a  ring length of z
9d60: 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20  Sql */.  .      
9d70: 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
9d80: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
9d90: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
9da0: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 6e  been compiled an
9db0: 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68  d.      ** which
9dc0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 65 78   matches the nex
9dd0: 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20 53 51  t sequence of SQ
9de0: 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  L..      */.    
9df0: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
9e00: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44     pPreStmt = pD
9e10: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20  b->stmtList;.   
9e20: 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28     len = strlen(
9e30: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  zSql);.      if(
9e40: 20 70 50 72 65 53 74 6d 74 20 26 26 20 73 71 6c   pPreStmt && sql
9e50: 69 74 65 33 5f 65 78 70 69 72 65 64 28 70 50 72  ite3_expired(pPr
9e60: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 20 29 7b  eStmt->pStmt) ){
9e70: 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74  .        flushSt
9e80: 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20  mtCache(pDb);.  
9e90: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d        pPreStmt =
9ea0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
9eb0: 20 20 66 6f 72 28 3b 20 70 50 72 65 53 74 6d 74    for(; pPreStmt
9ec0: 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65 53  ; pPreStmt=pPreS
9ed0: 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  tmt->pNext){.   
9ee0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72       int n = pPr
9ef0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20  eStmt->nSql;.   
9f00: 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 20       if( len>=n 
9f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
9f20: 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d  memcmp(pPreStmt-
9f30: 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d  >zSql, zSql, n)=
9f40: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  =0.            &
9f50: 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c  & (zSql[n]==0 ||
9f60: 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29   zSql[n-1]==';')
9f70: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
9f80: 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50        pStmt = pP
9f90: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20  reStmt->pStmt;. 
9fa0: 20 20 20 20 20 20 20 20 20 7a 4c 65 66 74 20 3d           zLeft =
9fb0: 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d   &zSql[pPreStmt-
9fc0: 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 20  >nSql];..       
9fd0: 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72 65     /* When a pre
9fe0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
9ff0: 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b  is found, unlink
a000: 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20 20   it from the.   
a010: 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20         ** cache 
a020: 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c  list.  It will l
a030: 61 74 65 72 20 62 65 20 61 64 64 65 64 20 62 61  ater be added ba
a040: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
a050: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
a060: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
a070: 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  st in order to i
a080: 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70  mplement LRU rep
a090: 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  lacement..      
a0a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
a0b0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70   if( pPreStmt->p
a0c0: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
a0d0: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50      pPreStmt->pP
a0e0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72  rev->pNext = pPr
a0f0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
a100: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a110: 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e             pDb->
a120: 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53  stmtList = pPreS
a130: 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  tmt->pNext;.    
a140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a150: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e    if( pPreStmt->
a160: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
a170: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
a180: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50  Next->pPrev = pP
a190: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20  reStmt->pPrev;. 
a1a0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d              pDb-
a1c0: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
a1d0: 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Stmt->pPrev;.   
a1e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a1f0: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b     pDb->nStmt--;
a200: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
a210: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a220: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
a230: 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73  If no prepared s
a240: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75  tatement was fou
a250: 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20 74 68 65  nd.  Compile the
a260: 20 53 51 4c 20 74 65 78 74 0a 20 20 20 20 20 20   SQL text.      
a270: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  */.      if( pSt
a280: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt==0 ){.       
a290: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
a2a0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
a2b0: 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  pDb->db, zSql, -
a2c0: 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66  1, &pStmt, &zLef
a2d0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
a2e0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
a2f0: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
a300: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  oObj(sqlite3_err
a310: 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  msg(pDb->db)));.
a320: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
a330: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
a340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a350: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
a360: 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   pStmt==0 ){.   
a370: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
a380: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
a390: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29  rcode(pDb->db) )
a3a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
a3b0: 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20   A compile-time 
a3c0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61  error in the sta
a3d0: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20  tement.         
a3e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
a3f0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
a400: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
a410: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  tToObj(sqlite3_e
a420: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29  rrmsg(pDb->db)))
a430: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
a440: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
a450: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a460: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
a470: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
a480: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   The statement w
a490: 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e  as a no-op.  Con
a4a0: 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78  tinue to the nex
a4b0: 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
a4c0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
a4d0: 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20  e SQL string..  
a4e0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
a4f0: 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20           zSql = 
a500: 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  zLeft;.         
a510: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
a520: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a530: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
a540: 74 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  t( pPreStmt==0 )
a550: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
a560: 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20   /* Bind values 
a570: 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  to parameters th
a580: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24 20  at begin with $ 
a590: 6f 72 20 3a 0a 20 20 20 20 20 20 2a 2f 20 20 0a  or :.      */  .
a5a0: 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c        nVar = sql
a5b0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
a5c0: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
a5d0: 3b 0a 20 20 20 20 20 20 6e 50 61 72 6d 20 3d 20  ;.      nParm = 
a5e0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 56 61  0;.      if( nVa
a5f0: 72 3e 73 69 7a 65 6f 66 28 61 50 61 72 6d 29 2f  r>sizeof(aParm)/
a600: 73 69 7a 65 6f 66 28 61 50 61 72 6d 5b 30 5d 29  sizeof(aParm[0])
a610: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61   ){.        apPa
a620: 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29  rm = (Tcl_Obj**)
a630: 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a 73  Tcl_Alloc(nVar*s
a640: 69 7a 65 6f 66 28 61 70 50 61 72 6d 5b 30 5d 29  izeof(apParm[0])
a650: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a660: 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d          apParm =
a670: 20 61 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   aParm;.      }.
a680: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
a690: 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <=nVar; i++){.  
a6a0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
a6b0: 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65 33   *zVar = sqlite3
a6c0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
a6d0: 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  name(pStmt, i);.
a6e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 56 61 72          if( zVar
a6f0: 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d  !=0 && (zVar[0]=
a700: 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d  ='$' || zVar[0]=
a710: 3d 27 3a 27 29 20 29 7b 0a 20 20 20 20 20 20 20  =':') ){.       
a720: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72     Tcl_Obj *pVar
a730: 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78   = Tcl_GetVar2Ex
a740: 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31  (interp, &zVar[1
a750: 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], 0, 0);.      
a760: 20 20 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a      if( pVar ){.
a770: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
a780: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  n;.            u
a790: 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20  8 *data;.       
a7a0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65       char *zType
a7b0: 20 3d 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   = pVar->typePtr
a7c0: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
a7d0: 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20  ->name : "";.   
a7e0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20           char c 
a7f0: 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20  = zType[0];.    
a800: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
a810: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
a820: 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d  pe,"bytearray")=
a830: 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65  =0 && pVar->byte
a840: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
a850: 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6c 6f        /* Only lo
a860: 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69  ad a BLOB type i
a870: 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62  f the Tcl variab
a880: 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61  le is a bytearra
a890: 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  y and.          
a8a0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74      ** has no st
a8b0: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
a8c0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
a8d0: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
a8e0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
a8f0: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
a910: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
a920: 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20  pStmt, i, data, 
a930: 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
a940: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a950: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a960: 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20  t(pVar);.       
a970: 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50         apParm[nP
a980: 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20  arm++] = pVar;. 
a990: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
a9a0: 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20   if( (c=='b' && 
a9b0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
a9c0: 6f 6c 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20  olean")==0) ||. 
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63   (c=='i' && strc
a9f0: 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d  mp(zType,"int")=
aa00: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
aa10: 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46       Tcl_GetIntF
aa20: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  romObj(interp, p
aa30: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
aa40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
aa50: 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
aa60: 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  i, n);.         
aa70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
aa80: 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'd' && strcmp(zT
aa90: 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30  ype,"double")==0
aaa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
aab0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
aac0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
aad0: 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69  tDoubleFromObj(i
aae0: 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29  nterp, pVar, &r)
aaf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ab00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
ab10: 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20 72 29  ble(pStmt, i, r)
ab20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
ab30: 6c 73 65 20 69 66 28 20 63 3d 3d 27 77 27 20 26  lse if( c=='w' &
ab40: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
ab50: 77 69 64 65 49 6e 74 22 29 3d 3d 30 20 29 7b 0a  wideInt")==0 ){.
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
ab70: 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20  l_WideInt v;.   
ab80: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
ab90: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
aba0: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26  (interp, pVar, &
abb0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
abc0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
abd0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76  nt64(pStmt, i, v
abe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
abf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ac00: 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69      data = (unsi
ac10: 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f  gned char *)Tcl_
ac20: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ac30: 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20  (pVar, &n);.    
ac40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ac50: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
ac60: 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29 64 61  t, i, (char *)da
ac70: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54  ta, n, SQLITE_ST
ac80: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
ac90: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
aca0: 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20  Count(pVar);.   
acb0: 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61 72             apPar
acc0: 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61  m[nParm++] = pVa
acd0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  r;.            }
ace0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
acf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
ad00: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
ad10: 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a 20 20 20   pStmt, i );.   
ad20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ad30: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
ad40: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
ad50: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
ad60: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
ad70: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
ad80: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
ad90: 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20   pScript ){.    
ada0: 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20      apColName = 
adb0: 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41  (Tcl_Obj**)Tcl_A
adc0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c  lloc( sizeof(Tcl
add0: 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20  _Obj*)*nCol );. 
ade0: 20 20 20 20 20 20 20 69 66 28 20 61 70 43 6f 6c         if( apCol
adf0: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
ae00: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
ae10: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
ae20: 20 20 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e            apColN
ae30: 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78 74 54  ame[i] = dbTextT
ae40: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  oObj(sqlite3_col
ae50: 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  umn_name(pStmt,i
ae60: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  ));.          Tc
ae70: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61  l_IncrRefCount(a
ae80: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
ae90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
aea0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 73  .      /* If res
aeb0: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
aec0: 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61  tored in an arra
aed0: 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e  y variable, then
aee0: 20 63 72 65 61 74 65 0a 20 20 20 20 20 20 2a 2a   create.      **
aef0: 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e   the array(*) en
af00: 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72 72  try for that arr
af10: 61 79 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ay.      */.    
af20: 20 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a    if( pArray ){.
af30: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
af40: 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f  *pColList = Tcl_
af50: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
af60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72    Tcl_Obj *pStar
af70: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
af80: 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 20 20  Obj("*", -1);.  
af90: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
afa0: 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29  fCount(pColList)
afb0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
afc0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
afd0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  .          Tcl_L
afe0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
aff0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
b000: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
b010: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
b020: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
b030: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41  tVar2(interp, pA
b040: 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f  rray, pStar, pCo
b050: 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20  lList,0);.      
b060: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
b070: 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20  nt(pColList);.  
b080: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
b090: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
b0a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
b0b0: 20 45 78 65 63 75 74 65 20 74 68 65 20 53 51 4c   Execute the SQL
b0c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b0d0: 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f  while( rc==TCL_O
b0e0: 4b 20 26 26 20 70 53 74 6d 74 20 26 26 20 53 51  K && pStmt && SQ
b0f0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
b100: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
b110: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
b120: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
b130: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
b140: 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20  j *pVal;.       
b150: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a     .          /*
b160: 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e   Set pVal to con
b170: 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f  tain the i'th co
b180: 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77  lumn of this row
b190: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
b1a0: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
b1b0: 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
b1c0: 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , i) ){.        
b1d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1e0: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
b1f0: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
b200: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
b210: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 29  _bytes(pStmt, i)
b220: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b230: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pVal = Tcl_NewBy
b240: 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74  teArrayObj(sqlit
b250: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
b260: 53 74 6d 74 2c 20 69 29 2c 20 62 79 74 65 73 29  Stmt, i), bytes)
b270: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b280: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b290: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b2a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
b2b0: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGER: {.        
b2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74        sqlite_int
b2d0: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63  64 v = sqlite3_c
b2e0: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
b2f0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
b300: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
b310: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
b320: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
b330: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
b340: 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a   = Tcl_NewIntObj
b350: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
b360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b370: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
b380: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
b390: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
b3a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b3b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b3d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b3e0: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
b3f0: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
b400: 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
b410: 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
b420: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
b430: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
b440: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
b460: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
b470: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  }.            ca
b480: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
b490: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b4a0: 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f  pVal = dbTextToO
b4b0: 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  bj(pDb->zNull);.
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
b4d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
b4e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   }.            d
b4f0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
b500: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64          pVal = d
b510: 62 54 65 78 74 54 6f 4f 62 6a 28 28 63 68 61 72  bTextToObj((char
b520: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
b530: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29  n_text(pStmt, i)
b540: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b560: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b570: 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 69  }.  .          i
b580: 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20  f( pScript ){.  
b590: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
b5a0: 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rray==0 ){.     
b5b0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a           Tcl_Obj
b5c0: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
b5d0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c  apColName[i], 0,
b5e0: 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20   pVal, 0);.     
b5f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b600: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
b610: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
b620: 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43 6f 6c  p, pArray, apCol
b630: 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20 30  Name[i], pVal, 0
b640: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
b650: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
b660: 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
b670: 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  ONECOLUMN ){.   
b680: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
b690: 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20   pRet==0 );.    
b6a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 74          if( pRet
b6b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
b6c0: 20 20 20 20 20 70 52 65 74 20 3d 20 70 56 61 6c       pRet = pVal
b6d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b6e0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
b6f0: 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  (pRet);.        
b700: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b710: 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b    rc = TCL_BREAK
b720: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 20  ;.            i 
b730: 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = nCol;.        
b740: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69    }else if( choi
b750: 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20 29 7b  ce==DB_EXISTS ){
b760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
b770: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
b780: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
b790: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42   pRet = Tcl_NewB
b7a0: 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 3b 0a 20 20  ooleanObj(1);.  
b7b0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
b7c0: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
b7d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
b7e0: 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20   = TCL_BREAK;.  
b7f0: 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43            i = nC
b800: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ol;.          }e
b810: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
b820: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b830: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
b840: 2c 20 70 52 65 74 2c 20 70 56 61 6c 29 3b 0a 20  , pRet, pVal);. 
b850: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b860: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
b870: 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20  if( pScript ){. 
b880: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 63           rc = Tc
b890: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
b8a0: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
b8b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
b8c0: 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 20  c==TCL_CONTINUE 
b8d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
b8e0: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
b8f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b900: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b910: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
b920: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
b930: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20  = TCL_OK;.      
b940: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  }..      /* Free
b950: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
b960: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20   objects */.    
b970: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
b980: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
b990: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
b9a0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65            Tcl_De
b9b0: 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c  crRefCount(apCol
b9c0: 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Name[i]);.      
b9d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f    }.        Tcl_
b9e0: 46 72 65 65 28 28 63 68 61 72 2a 29 61 70 43 6f  Free((char*)apCo
b9f0: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  lName);.      }.
ba00: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74  .      /* Free t
ba10: 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20  he bound string 
ba20: 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74  and blob paramet
ba30: 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  ers */.      for
ba40: 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b 20 69  (i=0; i<nParm; i
ba50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  ++){.        Tcl
ba60: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _DecrRefCount(ap
ba70: 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Parm[i]);.      
ba80: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70 50 61  }.      if( apPa
ba90: 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20 20 20  rm!=aParm ){.   
baa0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
bab0: 68 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a 20 20  har*)apParm);.  
bac0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
bad0: 52 65 73 65 74 20 74 68 65 20 73 74 61 74 65 6d  Reset the statem
bae0: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72 65 73  ent.  If the res
baf0: 75 6c 74 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ult code is SQLI
bb00: 54 45 5f 53 43 48 45 4d 41 2c 20 74 68 65 6e 0a  TE_SCHEMA, then.
bb10: 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74        ** flush t
bb20: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63  he statement cac
bb30: 68 65 20 61 6e 64 20 74 72 79 20 74 68 65 20 73  he and try the s
bb40: 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 2e 0a  tatement again..
bb50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
bb60: 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  c2 = sqlite3_res
bb70: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
bb80: 20 69 66 28 20 53 51 4c 49 54 45 5f 53 43 48 45   if( SQLITE_SCHE
bb90: 4d 41 3d 3d 72 63 32 20 29 7b 0a 20 20 20 20 20  MA==rc2 ){.     
bba0: 20 20 20 2f 2a 20 41 66 74 65 72 20 61 20 73 63     /* After a sc
bbb0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 66 6c 75  hema change, flu
bbc0: 73 68 20 74 68 65 20 63 61 63 68 65 20 61 6e 64  sh the cache and
bbd0: 20 74 72 79 20 74 6f 20 72 75 6e 20 74 68 65 0a   try to run the.
bbe0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
bbf0: 6d 65 6e 74 20 61 67 61 69 6e 0a 20 20 20 20 20  ment again.     
bc00: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c     */.        fl
bc10: 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44  ushStmtCache( pD
bc20: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b );.        sql
bc30: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
bc40: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  tmt);.        if
bc50: 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c  ( pPreStmt ) Tcl
bc60: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72  _Free((char*)pPr
bc70: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  eStmt);.        
bc80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
bc90: 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45  }else if( SQLITE
bca0: 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20 20 20  _OK!=rc2 ){.    
bcb0: 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75 6e 2d      /* If a run-
bcc0: 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72  time error occur
bcd0: 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65 72  s, report the er
bce0: 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72 65 61  ror and stop rea
bcf0: 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
bd00: 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20 20 20  the SQL.        
bd10: 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  */.        Tcl_S
bd20: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
bd30: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
bd40: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
bd50: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20  Db->db)));.     
bd60: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
bd70: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
bd80: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
bd90: 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OR;.        if( 
bda0: 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46  pPreStmt ) Tcl_F
bdb0: 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65 53  ree((char*)pPreS
bdc0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  tmt);.        br
bdd0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
bde0: 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74 6d   if( pDb->maxStm
bdf0: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t<=0 ){.        
be00: 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
be10: 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64  is turned off, d
be20: 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73  eallocated the s
be30: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
be40: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
be50: 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61   ) Tcl_Free((cha
be60: 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  r*)pPreStmt);.  
be70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
be80: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
be90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bea0: 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68 69 6e      /* Everythin
beb0: 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74 68 65  g worked and the
bec0: 20 63 61 63 68 65 20 69 73 20 6f 70 65 72 61 74   cache is operat
bed0: 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a  ional..        *
bee0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
bef0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 73  qlPreparedStmt s
bf00: 74 72 75 63 74 75 72 65 20 69 66 20 77 65 20 6e  tructure if we n
bf10: 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20 20 20  eed one..       
bf20: 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72 65 61   ** (If we alrea
bf30: 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65 20 63  dy have one we c
bf40: 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20 69 74  an just reuse it
bf50: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .).        */.  
bf60: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
bf70: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt==0 ){.       
bf80: 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74 20 2d     len = zLeft -
bf90: 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 20   zSql;.         
bfa0: 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c   pPreStmt = (Sql
bfb0: 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63  PreparedStmt*)Tc
bfc0: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
bfd0: 2a 70 50 72 65 53 74 6d 74 29 20 2b 20 6c 65 6e  *pPreStmt) + len
bfe0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
bff0: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 20  ( pPreStmt==0 ) 
c000: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c010: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
c020: 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53  Stmt->pStmt = pS
c030: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  tmt;.          p
c040: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20  PreStmt->nSql = 
c050: 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  len;.          m
c060: 65 6d 63 70 79 28 70 50 72 65 53 74 6d 74 2d 3e  emcpy(pPreStmt->
c070: 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e 29  zSql, zSql, len)
c080: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
c090: 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65 6e 5d 20  Stmt->zSql[len] 
c0a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
c0b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
c0c0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
c0d0: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65 67  ement to the beg
c0e0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 61  inning of the ca
c0f0: 63 68 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20  che list.       
c100: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 72 65   */.        pPre
c110: 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44  Stmt->pNext = pD
c120: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20  b->stmtList;.   
c130: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
c140: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
c150: 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c    if( pDb->stmtL
c160: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
c170: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
c180: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b  Prev = pPreStmt;
c190: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c1a0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
c1b0: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
c1c0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74       if( pDb->st
c1d0: 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20  mtLast==0 ){.   
c1e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c1f0: 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a  Db->nStmt==0 );.
c200: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
c210: 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74  tmtLast = pPreSt
c220: 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  mt;.        }els
c230: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
c240: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e  ert( pDb->nStmt>
c250: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  0 );.        }. 
c260: 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d         pDb->nStm
c270: 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20 20 20  t++;.   .       
c280: 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 74   /* If we have t
c290: 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e  oo many statemen
c2a0: 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f  t in cache, remo
c2b0: 76 65 20 74 68 65 20 73 75 72 70 6c 75 73 20 66  ve the surplus f
c2c0: 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20  rom the.        
c2d0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61  ** end of the ca
c2e0: 63 68 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  che list..      
c2f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69    */.        whi
c300: 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70  le( pDb->nStmt>p
c310: 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20  Db->maxStmt ){. 
c320: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c330: 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73  _finalize(pDb->s
c340: 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b  tmtLast->pStmt);
c350: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
c360: 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e  stmtLast = pDb->
c370: 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b  stmtLast->pPrev;
c380: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 46  .          Tcl_F
c390: 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 2d 3e  ree((char*)pDb->
c3a0: 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29  stmtLast->pNext)
c3b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
c3c0: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74  >stmtLast->pNext
c3d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
c3e0: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
c3f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c400: 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 65  .      /* Procee
c410: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74  d to the next st
c420: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
c430: 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20   zSql = zLeft;. 
c440: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
c450: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32  rRefCount(objv[2
c460: 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65  ]);..    if( pRe
c470: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  t ){.      if( r
c480: 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
c490: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
c4a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
c4b0: 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
c4c0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
c4d0: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d  unt(pRet);.    }
c4e0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
c4f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
c500: 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45  db function NAME
c510: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
c520: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
c530: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  QL function call
c540: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
c550: 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  er that function
c560: 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c   is.  ** called,
c570: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
c580: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
c590: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
c5a0: 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e  case DB_FUNCTION
c5b0: 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20  : {.    SqlFunc 
c5c0: 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f  *pFunc;.    Tcl_
c5d0: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20  Obj *pScript;.  
c5e0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
c5f0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
c600: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
c610: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c620: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
c630: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
c640: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
c660: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
c670: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
c680: 2c 20 30 29 3b 0a 20 20 20 20 70 53 63 72 69 70  , 0);.    pScrip
c690: 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  t = objv[3];.   
c6a0: 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c   pFunc = findSql
c6b0: 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29  Func(pDb, zName)
c6c0: 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d  ;.    if( pFunc=
c6d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
c6e0: 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70  ERROR;.    if( p
c6f0: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b  Func->pScript ){
c700: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
c710: 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70  efCount(pFunc->p
c720: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20  Script);.    }. 
c730: 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70     pFunc->pScrip
c740: 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20  t = pScript;.   
c750: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
c760: 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  t(pScript);.    
c770: 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62  pFunc->useEvalOb
c780: 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76  jv = safeToUseEv
c790: 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70  alObjv(interp, p
c7a0: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20  Script);.    rc 
c7b0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c7c0: 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64  _function(pDb->d
c7d0: 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
c7e0: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
c7f0: 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c     pFunc, tclSql
c800: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Func, 0, 0);.   
c810: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c820: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
c830: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c840: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
c850: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
c860: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
c870: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
c880: 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65 6c 73  ATILE);.    }els
c890: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75 73 74  e{.      /* Must
c8a0: 20 66 6c 75 73 68 20 61 6e 79 20 63 61 63 68 65   flush any cache
c8b0: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  d statements */.
c8c0: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
c8d0: 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20  ache( pDb );.   
c8e0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
c8f0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
c900: 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f   $db nullvalue ?
c910: 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a  STRING?.  **.  *
c920: 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20 75 73  * Change text us
c930: 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  ed when a NULL c
c940: 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74  omes back from t
c950: 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
c960: 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73  ?STRING?.  ** is
c970: 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
c980: 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  en the current s
c990: 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e  tring used for N
c9a0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
c9b0: 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20  .  ** If STRING 
c9c0: 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
c9d0: 20 53 54 52 49 4e 47 20 69 73 20 72 65 74 75 72   STRING is retur
c9e0: 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20  ned..  **.  */. 
c9f0: 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c   case DB_NULLVAL
ca00: 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  UE: {.    if( ob
ca10: 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
ca20: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
ca30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ca40: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c  p, 2, objv, "NUL
ca50: 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20  LVALUE");.      
ca60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ca70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ca80: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
ca90: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
caa0: 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63  char *zNull = Tc
cab0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
cac0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
cad0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
cae0: 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  ->zNull ){.     
caf0: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
cb00: 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  >zNull);.      }
cb10: 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c  .      if( zNull
cb20: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
cb30: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20       pDb->zNull 
cb40: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
cb50: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
cb60: 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75  strncpy(pDb->zNu
cb70: 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b  ll, zNull, len);
cb80: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
cb90: 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ull[len] = '\0';
cba0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cbb0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
cbc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
cbd0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
cbe0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
cbf0: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62   dbTextToObj(pDb
cc00: 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62  ->zNull));.    b
cc10: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
cc20: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73    **     $db las
cc30: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a  t_insert_rowid .
cc40: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
cc50: 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
cc60: 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66  h is the ROWID f
cc70: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
cc80: 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a  nt insert..  */.
cc90: 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49    case DB_LAST_I
cca0: 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20  NSERT_ROWID: {. 
ccb0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
ccc0: 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  ult;.    Tcl_Wid
ccd0: 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20  eInt rowid;.    
cce0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
ccf0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
cd00: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
cd10: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
cd20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
cd30: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f  OR;.    }.    ro
cd40: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61  wid = sqlite3_la
cd50: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
cd60: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52  pDb->db);.    pR
cd70: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
cd80: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
cd90: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64  ;.    Tcl_SetWid
cda0: 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  eIntObj(pResult,
cdb0: 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65   rowid);.    bre
cdc0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
cdd0: 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c  ** The DB_ONECOL
cde0: 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d  UMN method is im
cdf0: 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68  plemented togeth
ce00: 65 72 20 77 69 74 68 20 44 42 5f 45 56 41 4c 2e  er with DB_EVAL.
ce10: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24  .  */..  /*    $
ce20: 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43  db progress ?N C
ce30: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20  ALLBACK?.  ** . 
ce40: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
ce50: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76  iven callback ev
ce60: 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61  ery N virtual ma
ce70: 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68  chine opcodes wh
ce80: 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20  ile executing.  
ce90: 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
cea0: 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52  .  case DB_PROGR
ceb0: 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ESS: {.    if( o
cec0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
ced0: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
cee0: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
cef0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
cf00: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
cf10: 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20  gress, 0);.     
cf20: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
cf30: 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
cf40: 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73    char *zProgres
cf50: 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  s;.      int len
cf60: 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20  ;.      int N;. 
cf70: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21       if( TCL_OK!
cf80: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
cf90: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
cfa0: 32 5d 2c 20 26 4e 29 20 29 7b 0a 09 72 65 74 75  2], &N) ){..retu
cfb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cfc0: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28      };.      if(
cfd0: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
cfe0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
cff0: 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65  ree(pDb->zProgre
d000: 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ss);.      }.   
d010: 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54     zProgress = T
d020: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
d030: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65  Obj(objv[3], &le
d040: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  n);.      if( zP
d050: 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30  rogress && len>0
d060: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
d070: 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c  >zProgress = Tcl
d080: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
d090: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  );.        strcp
d0a0: 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  y(pDb->zProgress
d0b0: 2c 20 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  , zProgress);.  
d0c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d0d0: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
d0e0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  s = 0;.      }.#
d0f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d100: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
d110: 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70  BACK.      if( p
d120: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
d130: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
d140: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
d150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
d160: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
d170: 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72  pDb->db, N, DbPr
d180: 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70  ogressHandler, p
d190: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
d1a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d1b0: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
d1c0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
d1d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
d1e0: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
d1f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
d200: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
d210: 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42  , objv, "N CALLB
d220: 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
d230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d240: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
d250: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
d260: 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41   profile ?CALLBA
d270: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61  CK?.  **.  ** Ma
d280: 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20  ke arrangements 
d290: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41  to invoke the CA
d2a0: 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61  LLBACK routine a
d2b0: 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73 74  fter each SQL st
d2c0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61  atement.  ** tha
d2d0: 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20  t has run.  The 
d2e0: 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
d2f0: 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  and the amount o
d300: 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72  f elapse time ar
d310: 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20  e.  ** appended 
d320: 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f  to CALLBACK befo
d330: 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69 73  re the script is
d340: 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   run..  */.  cas
d350: 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a  e DB_PROFILE: {.
d360: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
d370: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
d380: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d390: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
d3a0: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
d3b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d3c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
d3d0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
d3e0: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
d3f0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
d400: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d410: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66  terp, pDb->zProf
d420: 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ile, 0);.      }
d430: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d440: 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65    char *zProfile
d450: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
d460: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
d470: 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
d480: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
d490: 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20  ->zProfile);.   
d4a0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66     }.      zProf
d4b0: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
d4c0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
d4d0: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
d4e0: 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26   if( zProfile &&
d4f0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
d500: 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20    pDb->zProfile 
d510: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
d520: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
d530: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  strcpy(pDb->zPro
d540: 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 29 3b  file, zProfile);
d550: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d560: 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66        pDb->zProf
d570: 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ile = 0;.      }
d580: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d590: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20  OMIT_TRACE.     
d5a0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
d5b0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  le ){.        pD
d5c0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
d5d0: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
d5e0: 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d  te3_profile(pDb-
d5f0: 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48 61  >db, DbProfileHa
d600: 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
d610: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d620: 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
d630: 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  e(pDb->db, 0, 0)
d640: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
d650: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
d660: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
d670: 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b       $db rekey K
d680: 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  EY.  **.  ** Cha
d690: 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74 69  nge the encrypti
d6a0: 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75  on key on the cu
d6b0: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74  rrently open dat
d6c0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
d6d0: 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20  se DB_REKEY: {. 
d6e0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
d6f0: 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20   void *pKey;.   
d700: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
d710: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
d720: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
d730: 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a  , objv, "KEY");.
d740: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
d750: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
d760: 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
d770: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
d780: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29  (objv[2], &nKey)
d790: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d7a0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72 63  HAS_CODEC.    rc
d7b0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79   = sqlite3_rekey
d7c0: 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  (pDb->db, pKey, 
d7d0: 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72  nKey);.    if( r
d7e0: 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
d7f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d800: 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  rp, sqlite3ErrSt
d810: 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20  r(rc), 0);.     
d820: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
d830: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d840: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
d850: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
d860: 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43  timeout MILLESEC
d870: 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ONDS.  **.  ** D
d880: 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d  elay for the num
d890: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
d8a0: 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68  nds specified wh
d8b0: 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63  en a file is loc
d8c0: 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ked..  */.  case
d8d0: 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20   DB_TIMEOUT: {. 
d8e0: 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69     int ms;.    i
d8f0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
d900: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
d910: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
d920: 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f  objv, "MILLISECO
d930: 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74  NDS");.      ret
d940: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d950: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
d960: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
d970: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
d980: 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  &ms) ) return TC
d990: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  L_ERROR;.    sql
d9a0: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
d9b0: 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a  t(pDb->db, ms);.
d9c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
d9d0: 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20   .  /*.  **     
d9e0: 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  $db total_change
d9f0: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  s.  **.  ** Retu
da00: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
da10: 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
da20: 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74  modified, insert
da30: 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a  ed, or deleted .
da40: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64    ** since the d
da50: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
da60: 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  as created..  */
da70: 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c  .  case DB_TOTAL
da80: 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
da90: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
daa0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
dab0: 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
dac0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
dad0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
dae0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
daf0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
db00: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
db10: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
db20: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
db30: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
db40: 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  t, sqlite3_total
db50: 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
db60: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
db70: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
db80: 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
db90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
dba0: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
dbb0: 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
dbc0: 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
dbd0: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
dbe0: 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
dbf0: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
dc00: 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
dc10: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
dc20: 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
dc30: 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
dc40: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
dc50: 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
dc60: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
dc70: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
dc80: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
dc90: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
dca0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
dcb0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
dcc0: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
dcd0: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
dce0: 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
dcf0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
dd00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
dd10: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a  Db->zTrace, 0);.
dd20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
dd30: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
dd40: 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74  Trace;.      int
dd50: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
dd60: 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
dd70: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
dd80: 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
dd90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61      }.      zTra
dda0: 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ce = Tcl_GetStri
ddb0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
ddc0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
ddd0: 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65  if( zTrace && le
dde0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
ddf0: 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c  Db->zTrace = Tcl
de00: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
de10: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  );.        strcp
de20: 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a  y(pDb->zTrace, z
de30: 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 65  Trace);.      }e
de40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
de50: 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  ->zTrace = 0;.  
de60: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
de70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
de80: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
de90: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
dea0: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
deb0: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
dec0: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62  qlite3_trace(pDb
ded0: 2d 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e  ->db, DbTraceHan
dee0: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
def0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
df00: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70   sqlite3_trace(p
df10: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
df20: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
df30: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
df40: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
df50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65  transaction [-de
df60: 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74  ferred|-immediat
df70: 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43  e|-exclusive] SC
df80: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  RIPT.  **.  ** S
df90: 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
dfa0: 61 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72  action (if we ar
dfb0: 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  e not already in
dfc0: 20 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a   the midst of a.
dfd0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
dfe0: 29 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68  ) and execute th
dff0: 65 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52  e TCL script SCR
e000: 49 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49  IPT.  After SCRI
e010: 50 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  PT.  ** complete
e020: 73 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74  s, either commit
e030: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e040: 20 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   or roll it back
e050: 20 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20   if SCRIPT.  ** 
e060: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
e070: 69 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e  ion.  Or if no n
e080: 65 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61  ew transation wa
e090: 73 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f  s started, do no
e0a0: 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73  thing..  ** pass
e0b0: 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f   the exception o
e0c0: 6e 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a  n up the stack..
e0d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
e0e0: 6f 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69  ommand was inspi
e0f0: 72 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d  red by Dave Thom
e100: 61 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62  as's talk on Rub
e110: 79 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30  y at the.  ** 20
e120: 30 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e  05 O'Reilly Open
e130: 20 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69   Source Conventi
e140: 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f  on (OSCON)..  */
e150: 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53  .  case DB_TRANS
e160: 41 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e  ACTION: {.    in
e170: 74 20 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54  t inTrans;.    T
e180: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
e190: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e1a0: 2a 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e  *zBegin = "BEGIN
e1b0: 22 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  ";.    if( objc!
e1c0: 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =3 && objc!=4 ){
e1d0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
e1e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e1f0: 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d  2, objv, "[TYPE]
e200: 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
e210: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e220: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
e230: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
e240: 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
e250: 5b 32 5d 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  [2];.    } else 
e260: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
e270: 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50 45  onst char *TTYPE
e280: 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  _strs[] = {.    
e290: 20 20 20 20 22 64 65 66 65 72 72 65 64 22 2c 20      "deferred", 
e2a0: 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20    "exclusive",  
e2b0: 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20  "immediate", 0. 
e2c0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e       };.      en
e2d0: 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a  um TTYPE_enum {.
e2e0: 20 20 20 20 20 20 20 20 54 54 59 50 45 5f 44 45          TTYPE_DE
e2f0: 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58  FERRED, TTYPE_EX
e300: 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49  CLUSIVE, TTYPE_I
e310: 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d  MMEDIATE.      }
e320: 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74 79 70  ;.      int ttyp
e330: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  e;.      if( Tcl
e340: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
e350: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
e360: 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74  , TTYPE_strs, "t
e370: 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22  ransaction type"
e380: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20  0, &ttype) ){.  
e3b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e3c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
e3d0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 28 65        switch( (e
e3e0: 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74  num TTYPE_enum)t
e3f0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20  type ){.        
e400: 63 61 73 65 20 54 54 59 50 45 5f 44 45 46 45 52  case TTYPE_DEFER
e410: 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  RED:    /* no-op
e420: 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20   */;            
e430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e440: 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 45      case TTYPE_E
e450: 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67  XCLUSIVE:   zBeg
e460: 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c  in = "BEGIN EXCL
e470: 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a  USIVE";  break;.
e480: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
e490: 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20  PE_IMMEDIATE:   
e4a0: 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20  zBegin = "BEGIN 
e4b0: 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65  IMMEDIATE";  bre
e4c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e4d0: 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
e4e0: 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [3];.    }.    i
e4f0: 6e 54 72 61 6e 73 20 3d 20 21 73 71 6c 69 74 65  nTrans = !sqlite
e500: 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
e510: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69  (pDb->db);.    i
e520: 66 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20  f( !inTrans ){. 
e530: 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
e540: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
e550: 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30   zBegin, 0, 0, 0
e560: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
e570: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
e580: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
e590: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e   0);.    if( !in
e5a0: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 63  Trans ){.      c
e5b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b  onst char *zEnd;
e5c0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54  .      if( rc==T
e5d0: 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  CL_ERROR ){.    
e5e0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c      zEnd = "ROLL
e5f0: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65  BACK";.      } e
e600: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 45  lse {.        zE
e610: 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20  nd = "COMMIT";. 
e620: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 28 76 6f       }.      (vo
e630: 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
e640: 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30  pDb->db, zEnd, 0
e650: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
e660: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
e670: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
e680: 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72  update_hook ?scr
e690: 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62  ipt?.  **    $db
e6a0: 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f   rollback_hook ?
e6b0: 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63  script?.  */.  c
e6c0: 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f  ase DB_UPDATE_HO
e6d0: 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 52  OK: .  case DB_R
e6e0: 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a  OLLBACK_HOOK: {.
e6f0: 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f  .    /* set ppHo
e700: 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70  ok to point at p
e710: 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52  UpdateHook or pR
e720: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70  ollbackHook, dep
e730: 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a  ending on .    *
e740: 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62 20 75  * whether [$db u
e750: 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b  pdate_hook] or [
e760: 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  $db rollback_hoo
e770: 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a  k] was invoked..
e780: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f      */.    Tcl_O
e790: 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20  bj **ppHook; .  
e7a0: 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
e7b0: 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a  _UPDATE_HOOK ){.
e7c0: 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26        ppHook = &
e7d0: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
e7e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e7f0: 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62     ppHook = &pDb
e800: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b  ->pRollbackHook;
e810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
e820: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
e830: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c  =3 ){.       Tcl
e840: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e850: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
e860: 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
e870: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e880: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
e890: 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20  f( *ppHook ){.  
e8a0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
e8b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70  sult(interp, *pp
e8c0: 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  Hook);.      if(
e8d0: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
e8e0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
e8f0: 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20  ount(*ppHook);. 
e900: 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d         *ppHook =
e910: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
e920: 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
e930: 33 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  3 ){.      asser
e940: 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b  t( !(*ppHook) );
e950: 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
e960: 65 74 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a  etCharLength(obj
e970: 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20  v[2])>0 ){.     
e980: 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a     *ppHook = obj
e990: 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63  v[2];.        Tc
e9a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a  l_IncrRefCount(*
e9b0: 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d  ppHook);.      }
e9c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
e9d0: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
e9e0: 70 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70  pDb->db, (pDb->p
e9f0: 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64  UpdateHook?DbUpd
ea00: 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70  ateHandler:0), p
ea10: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
ea20: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70  _rollback_hook(p
ea30: 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f  Db->db,(pDb->pRo
ea40: 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c  llbackHook?DbRol
ea50: 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c  lbackHandler:0),
ea60: 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b  pDb);..    break
ea70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
ea80: 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  db version.  **.
ea90: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
eaa0: 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
eab0: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
eac0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
ead0: 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20  _VERSION: {.    
eae0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
eaf0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
eb00: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
eb10: 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  (), TCL_STATIC);
eb20: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
eb30: 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
eb40: 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65  the SWITCH state
eb50: 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ment */.  return
eb60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20   rc;.}../*.**   
eb70: 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46  sqlite3 DBNAME F
eb80: 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20 3f  ILENAME ?MODE? ?
eb90: 2d 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20  -key KEY?.**.** 
eba0: 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  This is the main
ebb0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57   Tcl command.  W
ebc0: 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22  hen the "sqlite"
ebd0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a   Tcl command is.
ebe0: 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73  ** invoked, this
ebf0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f   routine runs to
ec00: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f   process that co
ec10: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mmand..**.** The
ec20: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
ec30: 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61   DBNAME, is an a
ec40: 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f  rbitrary name fo
ec50: 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62  r a new.** datab
ec60: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
ec70: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72   This command cr
ec80: 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d  eates a new comm
ec90: 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e  and named.** DBN
eca0: 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64  AME that is used
ecb0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74   to control that
ecc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
ecd0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
ece0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65  nnection is dele
ecf0: 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e  ted when the DBN
ed00: 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  AME command is d
ed10: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
ed20: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
ed30: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
ed40: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
ed50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
ed60: 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 62  the sqlite datab
ed70: 61 73 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ase that is to b
ed80: 65 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a 0a 2a  e accessed..**.*
ed90: 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 70 75  * For testing pu
eda0: 72 70 6f 73 65 73 2c 20 77 65 20 61 6c 73 6f 20  rposes, we also 
edb0: 73 75 70 70 6f 72 74 20 74 68 65 20 66 6f 6c 6c  support the foll
edc0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73 71  owing:.**.**  sq
edd0: 6c 69 74 65 33 20 2d 65 6e 63 6f 64 69 6e 67 0a  lite3 -encoding.
ede0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75  **.**       Retu
edf0: 72 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  rn the encoding 
ee00: 75 73 65 64 20 62 79 20 4c 49 4b 45 20 61 6e 64  used by LIKE and
ee10: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e   GLOB operators.
ee20: 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20 20    Choices.**    
ee30: 20 20 20 61 72 65 20 55 54 46 2d 38 20 61 6e 64     are UTF-8 and
ee40: 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20   iso8859..**.** 
ee50: 20 73 71 6c 69 74 65 33 20 2d 76 65 72 73 69 6f   sqlite3 -versio
ee60: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65  n.**.**       Re
ee70: 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e  turn the version
ee80: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 53   number of the S
ee90: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a  QLite library..*
eea0: 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 74  *.**  sqlite3 -t
eeb0: 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a 2a 0a 2a  cl-uses-utf.**.*
eec0: 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 22  *       Return "
eed0: 31 22 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77  1" if compiled w
eee0: 69 74 68 20 61 20 54 63 6c 20 75 73 65 73 20 55  ith a Tcl uses U
eef0: 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 22 30  TF-8.  Return "0
ef00: 22 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 6e 6f  " if.**       no
ef10: 74 2e 20 20 55 73 65 64 20 62 79 20 74 65 73 74  t.  Used by test
ef20: 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  s to make sure t
ef30: 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  he library was c
ef40: 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20 20 20 20  ompiled .**     
ef50: 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a    correctly..*/.
ef60: 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69  static int DbMai
ef70: 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  n(void *cd, Tcl_
ef80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
ef90: 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
efa0: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
efb0: 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20   SqliteDb *p;.  
efc0: 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a  void *pKey = 0;.
efd0: 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a    int nKey = 0;.
efe0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
eff0: 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rg;.  char *zErr
f000: 4d 73 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Msg;.  const cha
f010: 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 69 66 28 20  r *zFile;.  if( 
f020: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  objc==2 ){.    z
f030: 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
f040: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f050: 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  1], 0);.    if( 
f060: 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65  strcmp(zArg,"-ve
f070: 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  rsion")==0 ){.  
f080: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f090: 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69  sult(interp,sqli
f0a0: 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a  te3_version,0);.
f0b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f0c0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
f0d0: 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
f0e0: 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20  -has-codec")==0 
f0f0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
f100: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
f110: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f120: 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b  t(interp,"1",0);
f130: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c  .#else.      Tcl
f140: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f150: 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e  terp,"0",0);.#en
f160: 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
f170: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
f180: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
f190: 72 67 2c 22 2d 74 63 6c 2d 75 73 65 73 2d 75 74  rg,"-tcl-uses-ut
f1a0: 66 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  f")==0 ){.#ifdef
f1b0: 20 54 43 4c 5f 55 54 46 5f 4d 41 58 0a 20 20 20   TCL_UTF_MAX.   
f1c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f1d0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30  ult(interp,"1",0
f1e0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54  );.#else.      T
f1f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f200: 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23  interp,"0",0);.#
f210: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
f220: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
f230: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
f240: 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29 7b  =5 || objc==6 ){
f250: 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
f260: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
f270: 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20 30  (objv[objc-2], 0
f280: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
f290: 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d  p(zArg,"-key")==
f2a0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20  0 ){.      pKey 
f2b0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
f2c0: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f  ayFromObj(objv[o
f2d0: 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a  bjc-1], &nKey);.
f2e0: 20 20 20 20 20 20 6f 62 6a 63 20 2d 3d 20 32 3b        objc -= 2;
f2f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f300: 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
f310: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
f320: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f330: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 23 69  rp, 1, objv, .#i
f340: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
f350: 43 4f 44 45 43 0a 20 20 20 20 20 20 22 48 41 4e  CODEC.      "HAN
f360: 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 6b  DLE FILENAME ?-k
f370: 65 79 20 43 4f 44 45 43 2d 4b 45 59 3f 22 0a 23  ey CODEC-KEY?".#
f380: 65 6c 73 65 0a 20 20 20 20 20 20 22 48 41 4e 44  else.      "HAND
f390: 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44  LE FILENAME ?MOD
f3a0: 45 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  E?".#endif.    )
f3b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f3c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45  _ERROR;.  }.  zE
f3d0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d  rrMsg = 0;.  p =
f3e0: 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f   (SqliteDb*)Tcl_
f3f0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
f400: 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
f410: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
f420: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61  sult(interp, "ma
f430: 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43  lloc failed", TC
f440: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
f450: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f460: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
f470: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
f480: 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
f490: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f4a0: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 73  objv[2], 0);.  s
f4b0: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c  qlite3_open(zFil
f4c0: 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 69 66  e, &p->db);.  if
f4d0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
f4e0: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e  ite3_errcode(p->
f4f0: 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d  db) ){.    zErrM
f500: 73 67 20 3d 20 73 74 72 64 75 70 28 73 71 6c 69  sg = strdup(sqli
f510: 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
f520: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
f530: 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20  close(p->db);.  
f540: 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d    p->db = 0;.  }
f550: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
f560: 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69 74  AS_CODEC.  sqlit
f570: 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b  e3_key(p->db, pK
f580: 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69  ey, nKey);.#endi
f590: 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  f.  if( p->db==0
f5a0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
f5b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
f5c0: 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54  rrMsg, TCL_VOLAT
f5d0: 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72  ILE);.    Tcl_Fr
f5e0: 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20  ee((char*)p);.  
f5f0: 20 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b    free(zErrMsg);
f600: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
f610: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ERROR;.  }.  p->
f620: 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52  maxStmt = NUM_PR
f630: 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20  EPARED_STMTS;.  
f640: 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
f650: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f660: 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  [1], 0);.  Tcl_C
f670: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
f680: 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62  interp, zArg, Db
f690: 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70  ObjCmd, (char*)p
f6a0: 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a  , DbDeleteCmd);.
f6b0: 0a 20 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65  .  /* If compile
f6c0: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45  d with SQLITE_TE
f6d0: 53 54 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68  ST turned on, th
f6e0: 65 6e 20 72 65 67 69 73 74 65 72 20 74 68 65 20  en register the 
f6f0: 22 6d 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51  "md5sum".  ** SQ
f700: 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  L function..  */
f710: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
f720: 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65  EST.  {.    exte
f730: 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69  rn void Md5_Regi
f740: 73 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a  ster(sqlite3*);.
f750: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45  #ifdef SQLITE_ME
f760: 4d 44 45 42 55 47 0a 20 20 20 20 69 6e 74 20 6d  MDEBUG.    int m
f770: 61 6c 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c 69  allocfail = sqli
f780: 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b  te3_iMallocFail;
f790: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61  .    sqlite3_iMa
f7a0: 6c 6c 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23 65  llocFail = 0;.#e
f7b0: 6e 64 69 66 0a 20 20 20 20 4d 64 35 5f 52 65 67  ndif.    Md5_Reg
f7c0: 69 73 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23 69  ister(p->db);.#i
f7d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44  fdef SQLITE_MEMD
f7e0: 45 42 55 47 0a 20 20 20 20 73 71 6c 69 74 65 33  EBUG.    sqlite3
f7f0: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6d  _iMallocFail = m
f800: 61 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64 69  allocfail;.#endi
f810: 66 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a 20  f.  }.#endif  . 
f820: 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74   p->interp = int
f830: 65 72 70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  erp;.  return TC
f840: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  L_OK;.}../*.** P
f850: 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54  rovide a dummy T
f860: 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20  cl_InitStubs if 
f870: 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  we are using thi
f880: 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a  s as a static.**
f890: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
f8a0: 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  ndef USE_TCL_STU
f8b0: 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f  BS.# undef  Tcl_
f8c0: 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69  InitStubs.# defi
f8d0: 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  ne Tcl_InitStubs
f8e0: 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
f8f0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
f900: 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47  we have a PACKAG
f910: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20  E_VERSION macro 
f920: 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77  defined.  This w
f930: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65  ill be.** define
f940: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
f950: 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66  by the TEA makef
f960: 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20  ile.  But other 
f970: 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20  makefiles.** do 
f980: 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a  not define it..*
f990: 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47  /.#ifndef PACKAG
f9a0: 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69  E_VERSION.# defi
f9b0: 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ne PACKAGE_VERSI
f9c0: 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  ON SQLITE_VERSIO
f9d0: 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
f9e0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
f9f0: 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  module..**.** Th
fa00: 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f  is Tcl module co
fa10: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69  ntains only a si
fa20: 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d  ngle new Tcl com
fa30: 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69  mand named "sqli
fa40: 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74  te"..** (Hence t
fa50: 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73  here is no names
fa60: 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20  pace.  There is 
fa70: 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e  no point in usin
fa80: 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  g a namespace.**
fa90: 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f   if the extensio
faa0: 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20  n only supplies 
fab0: 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20  one new name!)  
fac0: 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
fad0: 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20  mand is.** used 
fae0: 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51  to open a new SQ
faf0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
fb00: 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29  See the DbMain()
fb10: 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a   routine above.*
fb20: 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
fb30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
fb40: 0a 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69  .extern int Sqli
fb50: 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
fb60: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
fb70: 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
fb80: 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b  terp, "8.4", 0);
fb90: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
fba0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
fbb0: 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f  "sqlite3", (Tcl_
fbc0: 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
fbd0: 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
fbe0: 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
fbf0: 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50  rp, "sqlite3", P
fc00: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
fc10: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
fc20: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
fc30: 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f  "sqlite", (Tcl_O
fc40: 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
fc50: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  n, 0, 0);.  Tcl_
fc60: 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
fc70: 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43  p, "sqlite", PAC
fc80: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
fc90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
fca0: 7d 0a 65 78 74 65 72 6e 20 69 6e 74 20 54 63 6c  }.extern int Tcl
fcb0: 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c  sqlite3_Init(Tcl
fcc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
fcd0: 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
fce0: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
fcf0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69  .extern int Sqli
fd00: 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  te3_SafeInit(Tcl
fd10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
fd20: 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
fd30: 20 7d 0a 65 78 74 65 72 6e 20 69 6e 74 20 54 63   }.extern int Tc
fd40: 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69  lsqlite3_SafeIni
fd50: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
fd60: 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
fd70: 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66  L_OK; }..#ifndef
fd80: 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58   SQLITE_3_SUFFIX
fd90: 5f 4f 4e 4c 59 0a 65 78 74 65 72 6e 20 69 6e 74  _ONLY.extern int
fda0: 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c   Sqlite_Init(Tcl
fdb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
fdc0: 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
fdd0: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
fde0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 54 63 6c 73  .extern int Tcls
fdf0: 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
fe00: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
fe10: 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
fe20: 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 65  nit(interp); }.e
fe30: 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
fe40: 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
fe50: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
fe60: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
fe70: 65 78 74 65 72 6e 20 69 6e 74 20 54 63 6c 73 71  extern int Tclsq
fe80: 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63  lite_SafeInit(Tc
fe90: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
fea0: 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
feb0: 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ; }.#endif..#ifd
fec0: 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a  ef TCLSH./******
fed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff10: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63  *******.** The c
ff20: 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ode that follows
ff30: 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
ff40: 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c  d standalone TCL
ff50: 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2f   interpreters.*/
ff60: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ../*.** If the m
ff70: 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e  acro TCLSH is on
ff80: 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63  e, then put in c
ff90: 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68 65  ode this for the
ffa0: 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69  .** "main" routi
ffb0: 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69  ne that will ini
ffc0: 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20  tialize Tcl and 
ffd0: 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a  take input from.
ffe0: 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  ** standard inpu
fff0: 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d  t..*/.#if TCLSH=
10000 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  =1.static char z
10010 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22  Mainloop[] =.  "
10020 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
10030 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73   "while {![eof s
10040 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  tdin]} {\n".    
10050 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22  "if {$line!=\"\"
10060 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75  } {\n".      "pu
10070 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
10080 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65  > \"\n".    "} e
10090 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
100a0 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
100b0 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d  \"% \"\n".    "}
100c0 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73  \n".    "flush s
100d0 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70  tdout\n".    "ap
100e0 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20  pend line [gets 
100f0 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69  stdin]\n".    "i
10100 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  f {[info complet
10110 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20  e $line]} {\n". 
10120 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68       "if {[catch
10130 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69   {uplevel #0 $li
10140 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e  ne} result]} {\n
10150 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20  ".        "puts 
10160 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20  stderr \"Error: 
10170 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20  $result\"\n".   
10180 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72     "} elseif {$r
10190 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  esult!=\"\"} {\n
101a0 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20  ".        "puts 
101b0 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20  $result\n".     
101c0 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65   "}\n".      "se
101d0 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20  t line {}\n".   
101e0 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
101f0 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65      "append line
10200 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e   \\n\n".    "}\n
10210 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64  ".  "}\n".;.#end
10220 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
10230 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
10240 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20 74 68  two, then get th
10250 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64 65  e main loop code
10260 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 73   out of.** the s
10270 65 70 61 72 61 74 65 20 66 69 6c 65 20 22 73 70  eparate file "sp
10280 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a  aceanal_tcl.h"..
10290 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a  */.#if TCLSH==2.
102a0 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69  static char zMai
102b0 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c  nloop[] = .#incl
102c0 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74  ude "spaceanal_t
102d0 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a  cl.h".;.#endif..
102e0 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41  #define TCLSH_MA
102f0 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65  IN main   /* Nee
10300 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20  ded to fake out 
10310 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20  mktclapp */.int 
10320 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61  TCLSH_MAIN(int a
10330 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
10340 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
10350 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46  *interp;.  Tcl_F
10360 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61 72  indExecutable(ar
10370 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70  gv[0]);.  interp
10380 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74   = Tcl_CreateInt
10390 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74 65 33  erp();.  Sqlite3
103a0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
103b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
103c0 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  T.  {.    extern
103d0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
103e0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
103f0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10400 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_I
10410 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10420 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10430 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
10440 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10450 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10460 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
10470 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10480 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
10490 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
104a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
104b0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
104c0 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f  etest6_Init(Tcl_
104d0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
104e0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
104f0 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est7_Init(Tcl_In
10500 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
10510 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
10520 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t8_Init(Tcl_Inte
10530 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
10540 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63   int Md5_Init(Tc
10550 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10560 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10570 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63  etestsse_Init(Tc
10580 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10590 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
105a0 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
105b0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
105c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
105d0 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e  itetesttclvar_In
105e0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
105f0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
10600 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61  Sqlitetestschema
10610 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10620 2a 29 3b 0a 0a 20 20 20 20 53 71 6c 69 74 65 74  *);..    Sqlitet
10630 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70  est1_Init(interp
10640 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
10650 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t2_Init(interp);
10660 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33  .    Sqlitetest3
10670 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
10680 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49     Sqlitetest4_I
10690 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
106a0 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
106b0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
106c0 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28  qlitetest6_Init(
106d0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
106e0 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e  itetest7_Init(in
106f0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
10700 65 74 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65  etest8_Init(inte
10710 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
10720 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e  estasync_Init(in
10730 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
10740 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
10750 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
10760 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49  litetestschema_I
10770 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
10780 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70   Md5_Init(interp
10790 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
107a0 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74  _SSE.    Sqlitet
107b0 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65  estsse_Init(inte
107c0 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  rp);.#endif.  }.
107d0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67  #endif.  if( arg
107e0 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32  c>=2 || TCLSH==2
107f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10800 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
10810 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67  terp,"argv0",arg
10820 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f  v[1],TCL_GLOBAL_
10830 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
10840 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
10850 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f  gv", "", TCL_GLO
10860 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66  BAL_ONLY);.    f
10870 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c  or(i=3-TCLSH; i<
10880 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
10890 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
108a0 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67  erp, "argv", arg
108b0 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[i],.          
108c0 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20  TCL_GLOBAL_ONLY 
108d0 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  | TCL_LIST_ELEME
108e0 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f  NT | TCL_APPEND_
108f0 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20  VALUE);.    }.  
10900 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26    if( TCLSH==1 &
10910 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69  & Tcl_EvalFile(i
10920 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21  nterp, argv[1])!
10930 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
10940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
10950 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28  fo = Tcl_GetVar(
10960 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e  interp, "errorIn
10970 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  fo", TCL_GLOBAL_
10980 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28  ONLY);.      if(
10990 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66   zInfo==0 ) zInf
109a0 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75  o = interp->resu
109b0 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  lt;.      fprint
109c0 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73  f(stderr,"%s: %s
109d0 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66  \n", *argv, zInf
109e0 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
109f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
10a00 69 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54  if( argc<=1 || T
10a10 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54  CLSH==2 ){.    T
10a20 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e  cl_GlobalEval(in
10a30 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29  terp, zMainloop)
10a40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
10a50 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43  ;.}.#endif /* TC
10a60 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  LSH */..#endif /
10a70 2a 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 43  * !defined(NO_TC
10a80 4c 29 20 2a 2f 0a                                L) */.