/ Hex Artifact Content
Login

Artifact 32d9e0147077f2e2c127c5f214fb3fe03ef97d18:


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 31 20 32 30 30 36 2f 30 36 2f 32 31 20 31 39  61 2006/06/21 19
01c0: 3a 33 30 3a 33 34 20 64 72 68 20 45 78 70 20 24  :30:34 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 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20  "errorcode",    
5450: 20 20 20 20 20 22 65 76 61 6c 22 2c 0a 20 20 20       "eval",.   
5460: 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20 20   "exists",      
5470: 20 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e         "function
5480: 22 2c 20 20 20 20 20 20 20 20 20 20 22 6c 61 73  ",          "las
5490: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
54a0: 0a 20 20 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22  .    "nullvalue"
54b0: 2c 20 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63  ,          "onec
54c0: 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20  olumn",         
54d0: 22 70 72 6f 66 69 6c 65 22 2c 0a 20 20 20 20 22  "profile",.    "
54e0: 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20  progress",      
54f0: 20 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20       "rekey",   
5500: 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c 62            "rollb
5510: 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22  ack_hook",.    "
5520: 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
5530: 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e       "total_chan
5540: 67 65 73 22 2c 20 20 20 20 20 22 74 72 61 63 65  ges",     "trace
5550: 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61 63 74  ",.    "transact
5560: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22 75 70  ion",        "up
5570: 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  date_hook",     
5580: 20 20 22 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20    "version",.   
5590: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
55a0: 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e        .  };.  en
55b0: 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20  um DB_enum {.   
55c0: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20   DB_AUTHORIZER, 
55d0: 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 20         DB_BUSY, 
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
55f0: 41 43 48 45 2c 0a 20 20 20 20 44 42 5f 43 48 41  ACHE,.    DB_CHA
5600: 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 20  NGES,           
5610: 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 20  DB_CLOSE,       
5620: 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c       DB_COLLATE,
5630: 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  .    DB_COLLATIO
5640: 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42 5f 43 4f  N_NEEDED,  DB_CO
5650: 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20  MMIT_HOOK,      
5660: 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20  DB_COMPLETE,.   
5670: 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20   DB_COPY,       
5680: 20 20 20 20 20 20 20 44 42 5f 45 52 52 4f 52 43         DB_ERRORC
5690: 4f 44 45 2c 20 20 20 20 20 20 20 20 44 42 5f 45  ODE,        DB_E
56a0: 56 41 4c 2c 0a 20 20 20 20 44 42 5f 45 58 49 53  VAL,.    DB_EXIS
56b0: 54 53 2c 20 20 20 20 20 20 20 20 20 20 20 20 44  TS,            D
56c0: 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20  B_FUNCTION,     
56d0: 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45      DB_LAST_INSE
56e0: 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44 42  RT_ROWID,.    DB
56f0: 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20 20  _NULLVALUE,     
5700: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
5710: 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f 46  ,        DB_PROF
5720: 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f 47  ILE,.    DB_PROG
5730: 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 20 44  RESS,          D
5740: 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20 20  B_REKEY,        
5750: 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f      DB_ROLLBACK_
5760: 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54 49 4d  HOOK,.    DB_TIM
5770: 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 20  EOUT,           
5780: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
5790: 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a 20  ,    DB_TRACE,. 
57a0: 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f     DB_TRANSACTIO
57b0: 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50 44 41  N,       DB_UPDA
57c0: 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42  TE_HOOK,      DB
57d0: 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20 20  _VERSION.  };.  
57e0: 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74  /* don't leave t
57f0: 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f  railing commas o
5800: 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f  n DB_enum, it co
5810: 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78  nfuses the AIX x
5820: 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a  lc compiler */..
5830: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
5840: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
5850: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
5860: 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e  objv, "SUBCOMMAN
5870: 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74  D ...");.    ret
5880: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5890: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
58a0: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
58b0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42  erp, objv[1], DB
58c0: 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  _strs, "option",
58d0: 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a   0, &choice) ){.
58e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
58f0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  RROR;.  }..  swi
5900: 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e  tch( (enum DB_en
5910: 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20  um)choice ){..  
5920: 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72  /*    $db author
5930: 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  izer ?CALLBACK?.
5940: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
5950: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
5960: 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65  ack to authorize
5970: 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74   each SQL operat
5980: 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a  ion as it is.  *
5990: 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61  * compiled.  5 a
59a0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70  rguments are app
59b0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c  ended to the cal
59c0: 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20  lback before it 
59d0: 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a  is.  ** invoked:
59e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29  .  **.  **   (1)
59f0: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
5a00: 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c  on type (ex: SQL
5a10: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5a20: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
5a30: 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29   ...).  **   (2)
5a40: 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69   First descripti
5a50: 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73  ve name (depends
5a60: 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   on authorizatio
5a70: 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28  n type).  **   (
5a80: 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69  3) Second descri
5a90: 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20  ptive name.  ** 
5aa0: 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68    (4) Name of th
5ab0: 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20  e database (ex: 
5ac0: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a  "main", "temp").
5ad0: 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20    **   (5) Name 
5ae0: 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20  of trigger that 
5af0: 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63  is doing the acc
5b00: 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ess.  **.  ** Th
5b10: 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c  e callback shoul
5b20: 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74  d return on of t
5b30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5b40: 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c  ings: SQLITE_OK,
5b50: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e  .  ** SQLITE_IGN
5b60: 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44  ORE, or SQLITE_D
5b70: 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ENY.  Any other 
5b80: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
5b90: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20  an error..  **. 
5ba0: 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68   ** If this meth
5bb0: 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  od is invoked wi
5bc0: 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c  th no arguments,
5bd0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74   the current aut
5be0: 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  horization.  ** 
5bf0: 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20  callback string 
5c00: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
5c10: 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48  /.  case DB_AUTH
5c20: 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66  ORIZER: {.#ifdef
5c30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5c40: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54  HORIZATION.    T
5c50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5c60: 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69  interp, "authori
5c70: 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c  zation not avail
5c80: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
5c90: 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ld", 0);.    ret
5ca0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
5cb0: 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a  else.    if( obj
5cc0: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
5cd0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
5ce0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
5cf0: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
5d00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5d10: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
5d20: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
5d30: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
5d40: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
5d50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5d60: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75  interp, pDb->zAu
5d70: 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  th, 0);.      }.
5d80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d90: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20   char *zAuth;.  
5da0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
5db0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
5dc0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
5dd0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
5de0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5df0: 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74   zAuth = Tcl_Get
5e00: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
5e10: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
5e20: 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26      if( zAuth &&
5e30: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
5e40: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54    pDb->zAuth = T
5e50: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
5e60: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
5e70: 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20  cpy(pDb->zAuth, 
5e80: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 65  zAuth);.      }e
5e90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
5ea0: 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->zAuth = 0;.   
5eb0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5ec0: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
5ed0: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
5ee0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
5ef0: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
5f00: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
5f10: 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  b, auth_callback
5f20: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
5f30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5f40: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
5f50: 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  zer(pDb->db, 0, 
5f60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
5f70: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
5f80: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
5f90: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
5fa0: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
5fb0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
5fc0: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
5fd0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
5fe0: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
5ff0: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
6000: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
6010: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
6020: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
6030: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
6040: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
6050: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
6060: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
6070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6080: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
6090: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
60a0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
60b0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
60c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
60d0: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30  p, pDb->zBusy, 0
60e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
60f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
6100: 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69   *zBusy;.      i
6110: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
6120: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
6130: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
6140: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
6150: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73      }.      zBus
6160: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
6170: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
6180: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
6190: 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e  f( zBusy && len>
61a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
61b0: 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c  ->zBusy = Tcl_Al
61c0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
61d0: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
61e0: 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79  Db->zBusy, zBusy
61f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6200: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
6210: 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sy = 0;.      }.
6220: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
6230: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
6240: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
6250: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
6260: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
6270: 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75  er(pDb->db, DbBu
6280: 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  syHandler, pDb);
6290: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
62a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
62b0: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
62c0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
62d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
62e0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
62f0: 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73    $db cache flus
6300: 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  h.  **     $db c
6310: 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a  ache size n.  **
6320: 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  .  ** Flush the 
6330: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
6340: 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74  nt cache, or set
6350: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
6360: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68  ber of.  ** cach
6370: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
6380: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41   */.  case DB_CA
6390: 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  CHE: {.    char 
63a0: 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74  *subCmd;.    int
63b0: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   n;..    if( obj
63c0: 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c<=2 ){.      Tc
63d0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
63e0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
63f0: 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61  "cache option ?a
6400: 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  rg?");.      ret
6410: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6420: 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20     }.    subCmd 
6430: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6440: 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c  romObj( objv[2],
6450: 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73   0 );.    if( *s
6460: 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74  ubCmd=='f' && st
6470: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75  rcmp(subCmd,"flu
6480: 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sh")==0 ){.     
6490: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
64a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
64b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
64c0: 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68   2, objv, "flush
64d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
64e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
64f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6500: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
6510: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
6520: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
6530: 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20  *subCmd=='s' && 
6540: 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73  strcmp(subCmd,"s
6550: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
6560: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
6570: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
6580: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6590: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65  , 2, objv, "size
65a0: 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65   n");.        re
65b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
65c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
65d0: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52       if( TCL_ERR
65e0: 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OR==Tcl_GetIntFr
65f0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
6600: 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20  jv[3], &n) ){.  
6610: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
6620: 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
6630: 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72  , "cannot conver
6640: 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  t \"", .        
6650: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
6660: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
6670: 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69  [3],0), "\" to i
6680: 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20  nteger", 0);.   
6690: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
66a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
66b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
66c0: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
66d0: 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74           flushSt
66e0: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
6700: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
6710: 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45  se if( n>MAX_PRE
6720: 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20  PARED_STMTS ){. 
6730: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d             n = M
6740: 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
6750: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  S;.          }. 
6760: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61           pDb->ma
6770: 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20  xStmt = n;.     
6780: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
67a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
67b0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74  interp, "bad opt
67c0: 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20  ion \"", .      
67d0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
67e0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
67f0: 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62  ,0), "\": must b
6800: 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22  e flush or size"
6810: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
6820: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6830: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
6840: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62   }..  /*     $db
6850: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20   changes.  **.  
6860: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
6870: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
6880: 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
6890: 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
68a0: 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68  leted by.  ** th
68b0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e  e most recent IN
68c0: 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
68d0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
68e0: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  , not including 
68f0: 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65  .  ** any change
6900: 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65  s made by trigge
6910: 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f  r programs..  */
6920: 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47  .  case DB_CHANG
6930: 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
6940: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
6950: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
6960: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
6970: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
6980: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
6990: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
69a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
69b0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
69c0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
69d0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
69e0: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
69f0: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62  ite3_changes(pDb
6a00: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
6a10: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
6a20: 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20  $db close.  **. 
6a30: 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65   ** Shutdown the
6a40: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20   database.  */. 
6a50: 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20   case DB_CLOSE: 
6a60: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  {.    Tcl_Delete
6a70: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
6a80: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6a90: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
6aa0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
6ab0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
6ac0: 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d   $db collate NAM
6ad0: 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
6ae0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
6af0: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
6b00: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
6b10: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
6b20: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
6b30: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
6b40: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
6b50: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
6b60: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
6b70: 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  DB_COLLATE: {.  
6b80: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
6b90: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72  ollate;.    char
6ba0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
6bb0: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
6bc0: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
6bd0: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
6be0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6bf0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6c00: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
6c10: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
6c20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6c30: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
6c40: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6c50: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
6c60: 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
6c70: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6c80: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
6c90: 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
6ca0: 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f  Collate = (SqlCo
6cb0: 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63  llate*)Tcl_Alloc
6cc0: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61  ( sizeof(*pColla
6cd0: 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20  te) + nScript + 
6ce0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  1 );.    if( pCo
6cf0: 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72  llate==0 ) retur
6d00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6d10: 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72   pCollate->inter
6d20: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
6d30: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20  pCollate->pNext 
6d40: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
6d50: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a  .    pCollate->z
6d60: 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29  Script = (char*)
6d70: 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20  &pCollate[1];.  
6d80: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
6d90: 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  = pCollate;.    
6da0: 73 74 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d  strcpy(pCollate-
6db0: 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70  >zScript, zScrip
6dc0: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  t);.    if( sqli
6dd0: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
6de0: 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
6df0: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
6e00: 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  , .        pColl
6e10: 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61  ate, tclSqlColla
6e20: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  te) ){.      Tcl
6e30: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
6e40: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
6e50: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
6e60: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
6e70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6e80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6e90: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6ea0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
6eb0: 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  db collation_nee
6ec0: 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ded SCRIPT.  **.
6ed0: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
6ee0: 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
6ef0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
6f00: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
6f10: 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
6f20: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
6f30: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
6f40: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
6f50: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
6f60: 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e  e DB_COLLATION_N
6f70: 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28  EEDED: {.    if(
6f80: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
6f90: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6fa0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
6fb0: 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
6fc0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6fd0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6fe0: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
6ff0: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
7000: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
7010: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
7020: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  Needed);.    }. 
7030: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
7040: 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70  Needed = Tcl_Dup
7050: 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32  licateObj(objv[2
7060: 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  ]);.    Tcl_Incr
7070: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
7080: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
7090: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61     sqlite3_colla
70a0: 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d  tion_needed(pDb-
70b0: 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c  >db, pDb, tclCol
70c0: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
70d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
70e0: 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f  *    $db commit_
70f0: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  hook ?CALLBACK?.
7100: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
7110: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
7120: 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ack just before 
7130: 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79  committing every
7140: 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   SQL transaction
7150: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
7160: 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e  llback throws an
7170: 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65   exception or re
7180: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
7190: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72  then the.  ** tr
71a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f  ansaction is abo
71b0: 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41  rted.  If CALLBA
71c0: 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  CK is an empty s
71d0: 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62  tring, the callb
71e0: 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ack.  ** is disa
71f0: 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  bled..  */.  cas
7200: 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b  e DB_COMMIT_HOOK
7210: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
7220: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
7230: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7240: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
7250: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
7260: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7270: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
7280: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
7290: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
72a0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
72b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
72c0: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  (interp, pDb->zC
72d0: 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  ommit, 0);.     
72e0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
72f0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
7300: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
7310: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
7320: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
7330: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
7340: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
7350: 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
7360: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
7370: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
7380: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
7390: 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
73a0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
73b0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
73c0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
73d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
73e0: 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
73f0: 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   zCommit);.     
7400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7410: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
7420: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7430: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
7440: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
7450: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
7460: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7470: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
7480: 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
7490: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
74a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
74b0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
74c0: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
74d0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
74e0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
74f0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
7500: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
7510: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
7520: 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
7530: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
7540: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
7550: 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
7560: 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
7570: 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
7580: 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
7590: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
75a0: 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
75b0: 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
75c0: 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
75d0: 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
75e0: 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
75f0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
7600: 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
7610: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
7620: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
7630: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
7640: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
7650: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
7660: 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
7670: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
7680: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
7690: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
76a0: 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
76b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
76c0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
76d0: 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
76e0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
76f0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
7700: 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
7710: 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
7720: 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
7730: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
7740: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
7750: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
7760: 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
7770: 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
7780: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
7790: 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
77a0: 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
77b0: 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
77c0: 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
77d0: 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
77e0: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
77f0: 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
7800: 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
7810: 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
7820: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
7830: 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
7840: 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
7850: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
7860: 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
7870: 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
7880: 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
7890: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
78a0: 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
78b0: 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
78c0: 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
78d0: 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
78e0: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
78f0: 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
7900: 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
7910: 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
7920: 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
7930: 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
7940: 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
7950: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
7960: 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
7970: 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
7980: 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
7990: 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
79a0: 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
79b0: 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
79c0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
79d0: 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
79e0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
79f0: 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
7a00: 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
7a10: 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
7a20: 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
7a30: 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
7a40: 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
7a50: 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
7a60: 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
7a70: 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
7a80: 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
7a90: 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
7aa0: 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
7ab0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
7ac0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7ad0: 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
7ae0: 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
7af0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
7b00: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
7b10: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
7b20: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
7b30: 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
7b40: 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
7b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7b60: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
7b70: 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
7b80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
7b90: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
7ba0: 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
7bb0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  */.    int rc;  
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
7be0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  e */.    int nCo
7bf0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7c00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7c10: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
7c20: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
7c30: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
7c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7c50: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
7c60: 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f  an SQL string */
7c70: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  .    int i, j;  
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7ca0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
7cb0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
7cc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7cd0: 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b  f bytes in zSep[
7ce0: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75  ] */.    int nNu
7cf0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7d10: 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c  f bytes in zNull
7d20: 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  [] */.    char *
7d30: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
7d40: 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20        /* An SQL 
7d50: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
7d60: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20   char *zLine;   
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d80: 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  A single line of
7d90: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
7da0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
7db0: 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20   **azCol;       
7dc0: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65          /* zLine
7dd0: 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74  [] broken up int
7de0: 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  o columns */.   
7df0: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e10: 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68  How to commit ch
7e20: 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c  anges */.    FIL
7e30: 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
7e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7e50: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
7e60: 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30    int lineno = 0
7e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7e80: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20   Line number of 
7e90: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
7ea0: 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b    char zLineNum[
7eb0: 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  80];          /*
7ec0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69   Line number pri
7ed0: 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  nt buffer */.   
7ee0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
7ef0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
7f00: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f  interp result */
7f10: 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70  ..    char *zSep
7f20: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c  ;.    char *zNul
7f30: 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  l;.    if( objc<
7f40: 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20  5 || objc>7 ){. 
7f50: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
7f60: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
7f70: 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20   objv, .        
7f80: 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52   "CONFLICT-ALGOR
7f90: 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e  ITHM TABLE FILEN
7fa0: 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  AME ?SEPARATOR? 
7fb0: 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22  ?NULLINDICATOR?"
7fc0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7fd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7fe0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36  .    if( objc>=6
7ff0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d   ){.      zSep =
8000: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8010: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30  omObj(objv[5], 0
8020: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8030: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b      zSep = "\t";
8040: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
8050: 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20  bjc>=7 ){.      
8060: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
8070: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8080: 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[6], 0);.    }e
8090: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  lse{.      zNull
80a0: 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20   = "";.    }.   
80b0: 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c   zConflict = Tcl
80c0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
80d0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
80e0: 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
80f0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8100: 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20  (objv[3], 0);.  
8110: 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
8120: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
8130: 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[4], 0);.    
8140: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53  nSep = strlen(zS
8150: 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d  ep);.    nNull =
8160: 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a   strlen(zNull);.
8170: 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
8180: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
8190: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
81a0: 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75  , "Error: non-nu
81b0: 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  ll separator req
81c0: 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c  uired for copy",
81d0: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
81e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
81f0: 20 7d 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65   }.    if(sqlite
8200: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
8210: 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20  ct, "rollback") 
8220: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
8230: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
8240: 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
8250: 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
8260: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
8270: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66  mp(zConflict, "f
8280: 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26  ail"    ) != 0 &
8290: 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  &.       sqlite3
82a0: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
82b0: 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
82c0: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
82d0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
82e0: 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65  nflict, "replace
82f0: 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20  " ) != 0 ) {.   
8300: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8310: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
8320: 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69  or: \"", zConfli
8330: 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ct, .           
8340: 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61   "\", conflict-a
8350: 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65  lgorithm must be
8360: 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63   one of: rollbac
8370: 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  k, ".           
8380: 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69   "abort, fail, i
8390: 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63  gnore, or replac
83a0: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
83b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
83c0: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
83d0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
83e0: 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
83f0: 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  '%q'", zTable);.
8400: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
8410: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
8420: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8430: 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63  , "Error: no suc
8440: 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62  h table: ", zTab
8450: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  le, 0);.      re
8460: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8470: 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
8480: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
8490: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
84a0: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
84b0: 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d  , zSql, 0, &pStm
84c0: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
84d0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
84e0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
84f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8500: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
8510: 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
8520: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
8530: 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
8540: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
8550: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
8560: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
8570: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
8580: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
8590: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
85a0: 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
85b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
85c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
85d0: 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
85e0: 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
85f0: 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
8600: 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
8610: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8620: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
8630: 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
8640: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  )", 0);.      re
8650: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8660: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8670: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
8680: 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +50, zSql, "INSE
8690: 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25  RT OR %q INTO '%
86a0: 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20  q' VALUES(?",.  
86b0: 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74         zConflict
86c0: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
86d0: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
86e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
86f0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8700: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
8710: 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
8720: 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
8730: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
8740: 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
8750: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
8760: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
8770: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  Db->db, zSql, 0,
8780: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
8790: 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20   free(zSql);.   
87a0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
87b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
87c0: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
87d0: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
87e0: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
87f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8800: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
8810: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8820: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8830: 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46     in = fopen(zF
8840: 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  ile, "rb");.    
8850: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
8860: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8870: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
8880: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
8890: 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20  file: ", zFile, 
88a0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
88b0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
88c0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
88d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
88e0: 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20    }.    azCol = 
88f0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
8900: 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31  zCol[0])*(nCol+1
8910: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43  ) );.    if( azC
8920: 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ol==0 ) {.      
8930: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8940: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
8950: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
8960: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f  , 0);.      fclo
8970: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65  se(in);.      re
8980: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8990: 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29      }.    (void)
89a0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
89b0: 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  ->db, "BEGIN", 0
89c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f  , 0, 0);.    zCo
89d0: 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b  mmit = "COMMIT";
89e0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69  .    while( (zLi
89f0: 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69  ne = local_getli
8a00: 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b  ne(0, in))!=0 ){
8a10: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  .      char *z;.
8a20: 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20        i = 0;.   
8a30: 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
8a40: 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c     azCol[0] = zL
8a50: 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ine;.      for(i
8a60: 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b  =0, z=zLine; *z;
8a70: 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   z++){.        i
8a80: 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26  f( *z==zSep[0] &
8a90: 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65  & strncmp(z, zSe
8aa0: 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20  p, nSep)==0 ){. 
8ab0: 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b           *z = 0;
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
8ad0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
8ae0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
8af0: 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26      azCol[i] = &
8b00: 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20  z[nSep];.       
8b10: 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31       z += nSep-1
8b20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8b40: 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e        if( i+1!=n
8b50: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Col ){.        c
8b60: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
8b70: 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63     zErr = malloc
8b80: 28 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46  (200 + strlen(zF
8b90: 69 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ile));.        i
8ba0: 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
8bb0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72       sprintf(zEr
8bc0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
8bd0: 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20  "Error: %s line 
8be0: 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
8bf0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
8c00: 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20  but found %d",. 
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
8c20: 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c  e, lineno, nCol,
8c30: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
8c40: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8c50: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20  t(interp, zErr, 
8c60: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72  0);.          fr
8c70: 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ee(zErr);.      
8c80: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d    }.        zCom
8c90: 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
8ca0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
8cc0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
8cd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
8ce0: 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20   check for null 
8cf0: 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e  data, if so, bin
8d00: 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  d as null */.   
8d10: 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e       if ((nNull>
8d20: 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f  0 && strcmp(azCo
8d30: 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29  l[i], zNull)==0)
8d40: 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c   || strlen(azCol
8d50: 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20  [i])==0) {.     
8d60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
8d70: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b  d_null(pStmt, i+
8d80: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
8d90: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
8da0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
8db0: 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c  Stmt, i+1, azCol
8dc0: 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
8dd0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
8de0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
8df0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
8e00: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
8e10: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
8e20: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65  Stmt);.      fre
8e30: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
8e40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8e50: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
8e60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8e70: 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20  terp,"Error: ", 
8e80: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
8e90: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
8ea0: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
8eb0: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
8ec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8ed0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
8ee0: 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c  (azCol);.    fcl
8ef0: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c  ose(in);.    sql
8f00: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8f10: 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  tmt);.    (void)
8f20: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
8f30: 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30  ->db, zCommit, 0
8f40: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66  , 0, 0);..    if
8f50: 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20  ( zCommit[0] == 
8f60: 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  'C' ){.      /* 
8f70: 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73  success, set res
8f80: 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66  ult as number of
8f90: 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64   lines processed
8fa0: 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c   */.      pResul
8fb0: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
8fc0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
8fd0: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
8fe0: 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e  j(pResult, linen
8ff0: 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  o);.      rc = T
9000: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
9010: 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75  {.      /* failu
9020: 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e  re, append linen
9030: 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a  o where failed *
9040: 2f 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  /.      sprintf(
9050: 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69  zLineNum,"%d",li
9060: 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c  neno);.      Tcl
9070: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9080: 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77  terp,", failed w
9090: 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  hile processing 
90a0: 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d  line: ",zLineNum
90b0: 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ,0);.      rc = 
90c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
90d0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
90e0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
90f0: 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a  b errorcode.  **
9100: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
9110: 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63   numeric error c
9120: 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65 74  ode that was ret
9130: 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73  urned by the mos
9140: 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61  t recent.  ** ca
9150: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
9160: 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ec()..  */.  cas
9170: 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20  e DB_ERRORCODE: 
9180: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
9190: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
91a0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
91b0: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
91c0: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65  ->db)));.    bre
91d0: 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a  ak;.  }.   .  /*
91e0: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61  .  **    $db eva
91f0: 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f  l $sql ?array? ?
9200: 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f  {  ...code... }?
9210: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65  .  **    $db one
9220: 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a  column $sql.  **
9230: 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 20 73 74  .  ** The SQL st
9240: 61 74 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20  atement in $sql 
9250: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 46  is evaluated.  F
9260: 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 74 68 65  or each row, the
9270: 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a   values are.  **
9280: 20 70 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d 65   placed in eleme
9290: 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72 61 79  nts of the array
92a0: 20 6e 61 6d 65 64 20 22 61 72 72 61 79 22 20 61   named "array" a
92b0: 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73  nd ...code... is
92c0: 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20   executed..  ** 
92d0: 49 66 20 22 61 72 72 61 79 22 20 61 6e 64 20 22  If "array" and "
92e0: 63 6f 64 65 22 20 61 72 65 20 6f 6d 69 74 74 65  code" are omitte
92f0: 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62  d, then no callb
9300: 61 63 6b 20 69 73 20 65 76 65 72 79 20 69 6e 76  ack is every inv
9310: 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  oked..  ** If "a
9320: 72 72 61 79 22 20 69 73 20 61 6e 20 65 6d 70 74  rray" is an empt
9330: 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74  y string, then t
9340: 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 70 6c  he values are pl
9350: 61 63 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65  aced in variable
9360: 73 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 76 65  s.  ** that have
9370: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
9380: 73 20 74 68 65 20 66 69 65 6c 64 73 20 65 78 74  s the fields ext
9390: 72 61 63 74 65 64 20 62 79 20 74 68 65 20 71 75  racted by the qu
93a0: 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ery..  **.  ** T
93b0: 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74  he onecolumn met
93c0: 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69 76  hod is the equiv
93d0: 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20  alent of:.  **  
93e0: 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65     lindex [$db e
93f0: 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f  val $sql] 0.  */
9400: 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f  .  case DB_ONECO
9410: 4c 55 4d 4e 3a 0a 20 20 63 61 73 65 20 44 42 5f  LUMN:.  case DB_
9420: 45 56 41 4c 3a 0a 20 20 63 61 73 65 20 44 42 5f  EVAL:.  case DB_
9430: 45 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 63 68  EXISTS: {.    ch
9440: 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b 20  ar const *zSql; 
9450: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53 51 4c       /* Next SQL
9460: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   statement to ex
9470: 65 63 75 74 65 20 2a 2f 0a 20 20 20 20 63 68 61  ecute */.    cha
9480: 72 20 63 6f 6e 73 74 20 2a 7a 4c 65 66 74 3b 20  r const *zLeft; 
9490: 20 20 20 20 2f 2a 20 57 68 61 74 20 69 73 20 6c      /* What is l
94a0: 65 66 74 20 61 66 74 65 72 20 66 69 72 73 74 20  eft after first 
94b0: 73 74 6d 74 20 69 6e 20 7a 53 71 6c 20 2a 2f 0a  stmt in zSql */.
94c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
94d0: 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 6f   *pStmt;   /* Co
94e0: 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74 6d  mpiled SQL statm
94f0: 65 6e 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  ent */.    Tcl_O
9500: 62 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20  bj *pArray;     
9510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72    /* Name of arr
9520: 61 79 20 69 6e 74 6f 20 77 68 69 63 68 20 72 65  ay into which re
9530: 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65  sults are writte
9540: 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  n */.    Tcl_Obj
9550: 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20 20   *pScript;      
9560: 2f 2a 20 53 63 72 69 70 74 20 74 6f 20 72 75 6e  /* Script to run
9570: 20 66 6f 72 20 65 61 63 68 20 72 65 73 75 6c 74   for each result
9580: 20 73 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   set */.    Tcl_
9590: 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20  Obj **apParm;   
95a0: 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73     /* Parameters
95b0: 20 74 68 61 74 20 6e 65 65 64 20 61 20 54 63 6c   that need a Tcl
95c0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 29 20  _DecrRefCount() 
95d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 6d  */.    int nParm
95e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
95f0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
9600: 65 73 20 75 73 65 64 20 69 6e 20 61 70 50 61 72  es used in apPar
9610: 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  m[] */.    Tcl_O
9620: 62 6a 20 2a 61 50 61 72 6d 5b 31 30 5d 3b 20 20  bj *aParm[10];  
9630: 20 20 2f 2a 20 53 74 61 74 69 63 20 73 70 61 63    /* Static spac
9640: 65 20 66 6f 72 20 61 70 50 61 72 6d 5b 5d 20 69  e for apParm[] i
9650: 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
9660: 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  e */.    Tcl_Obj
9670: 20 2a 70 52 65 74 3b 20 20 20 20 20 20 20 20 20   *pRet;         
9680: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20 72  /* Value to be r
9690: 65 74 75 72 6e 65 64 20 2a 2f 0a 20 20 20 20 53  eturned */.    S
96a0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
96b0: 70 50 72 65 53 74 6d 74 3b 20 20 2f 2a 20 50 6f  pPreStmt;  /* Po
96c0: 69 6e 74 65 72 20 74 6f 20 61 20 70 72 65 70 61  inter to a prepa
96d0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
96e0: 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
96f0: 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
9700: 42 5f 45 56 41 4c 20 29 7b 0a 20 20 20 20 20 20  B_EVAL ){.      
9710: 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62  if( objc<3 || ob
9720: 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20 20 20 20  jc>5 ){.        
9730: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
9740: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
9750: 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41  , "SQL ?ARRAY-NA
9760: 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a  ME? ?SCRIPT?");.
9770: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
9780: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
9790: 7d 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 54  }.      pRet = T
97a0: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
97b0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
97c0: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d  unt(pRet);.    }
97d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
97e0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
97f0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
9800: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
9810: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
9820: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9830: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
9840: 20 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d       if( choice=
9850: 3d 44 42 5f 45 58 49 53 54 53 20 29 7b 0a 20 20  =DB_EXISTS ){.  
9860: 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c        pRet = Tcl
9870: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 30  _NewBooleanObj(0
9880: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  );.        Tcl_I
9890: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
98a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
98b0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
98c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
98d0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
98e0: 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20  ){.      pArray 
98f0: 3d 20 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  = pScript = 0;. 
9900: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
9910: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 70 41  c==4 ){.      pA
9920: 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  rray = 0;.      
9930: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
9940: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
9950: 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a      pArray = obj
9960: 76 5b 33 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  v[3];.      if( 
9970: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 41  Tcl_GetString(pA
9980: 72 72 61 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41  rray)[0]==0 ) pA
9990: 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  rray = 0;.      
99a0: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34  pScript = objv[4
99b0: 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  ];.    }..    Tc
99c0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_IncrRefCount(o
99d0: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71  bjv[2]);.    zSq
99e0: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
99f0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
9a00: 2c 20 30 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  , 0);.    while(
9a10: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a   rc==TCL_OK && z
9a20: 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Sql[0] ){.      
9a30: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
9a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9a50: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9a60: 20 20 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20      int nVar;   
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 69 6e 64  * Number of bind
9a90: 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20 74   parameters in t
9aa0: 68 65 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20  he pStmt */.    
9ab0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ad0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
9ae0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
9af0: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c  set */.      Tcl
9b00: 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65  _Obj **apColName
9b10: 20 3d 20 30 3b 20 20 20 2f 2a 20 41 72 72 61 79   = 0;   /* Array
9b20: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
9b30: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   */.      int le
9b40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
9b50: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c       /* String l
9b60: 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 2a 2f  ength of zSql */
9b70: 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 72 79  .  .      /* Try
9b80: 20 74 6f 20 66 69 6e 64 20 61 20 53 51 4c 20 73   to find a SQL s
9b90: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 68 61  tatement that ha
9ba0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
9bb0: 6f 6d 70 69 6c 65 64 20 61 6e 64 0a 20 20 20 20  ompiled and.    
9bc0: 20 20 2a 2a 20 77 68 69 63 68 20 6d 61 74 63 68    ** which match
9bd0: 65 73 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  es the next sequ
9be0: 65 6e 63 65 20 6f 66 20 53 51 4c 2e 0a 20 20 20  ence of SQL..   
9bf0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 53 74 6d     */.      pStm
9c00: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 72  t = 0;.      pPr
9c10: 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d  eStmt = pDb->stm
9c20: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 6c 65 6e  tList;.      len
9c30: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
9c40: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53  .      if( pPreS
9c50: 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 65  tmt && sqlite3_e
9c60: 78 70 69 72 65 64 28 70 50 72 65 53 74 6d 74 2d  xpired(pPreStmt-
9c70: 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  >pStmt) ){.     
9c80: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
9c90: 65 28 70 44 62 29 3b 0a 20 20 20 20 20 20 20 20  e(pDb);.        
9ca0: 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20  pPreStmt = 0;.  
9cb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
9cc0: 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65  ; pPreStmt; pPre
9cd0: 53 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70  Stmt=pPreStmt->p
9ce0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
9cf0: 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d  nt n = pPreStmt-
9d00: 3e 6e 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69  >nSql;.        i
9d10: 66 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20  f( len>=n .     
9d20: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
9d30: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
9d40: 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20   zSql, n)==0.   
9d50: 20 20 20 20 20 20 20 20 20 26 26 20 28 7a 53 71           && (zSq
9d60: 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b  l[n]==0 || zSql[
9d70: 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20  n-1]==';').     
9d80: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
9d90: 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  pStmt = pPreStmt
9da0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  ->pStmt;.       
9db0: 20 20 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c     zLeft = &zSql
9dc0: 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d  [pPreStmt->nSql]
9dd0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
9de0: 57 68 65 6e 20 61 20 70 72 65 70 61 72 65 64 20  When a prepared 
9df0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75  statement is fou
9e00: 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72  nd, unlink it fr
9e10: 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  om the.         
9e20: 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20   ** cache list. 
9e30: 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62   It will later b
9e40: 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20  e added back to 
9e50: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
9e60: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
9e70: 65 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20  e cache list in 
9e80: 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65  order to impleme
9e90: 6e 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65  nt LRU replaceme
9ea0: 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  nt..          */
9eb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
9ec0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29  PreStmt->pPrev )
9ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
9ee0: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70  reStmt->pPrev->p
9ef0: 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Next = pPreStmt-
9f00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
9f10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9f20: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
9f30: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
9f40: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
9f50: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
9f60: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20  pPreStmt->pNext 
9f70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
9f80: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e  PreStmt->pNext->
9f90: 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74  pPrev = pPreStmt
9fa0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20  ->pPrev;.       
9fb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9fc0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
9fd0: 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ast = pPreStmt->
9fe0: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  pPrev;.         
9ff0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62   }.          pDb
a000: 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20  ->nStmt--;.     
a010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a020: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a030: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  .      /* If no 
a040: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a050: 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 43  nt was found.  C
a060: 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74  ompile the SQL t
a070: 65 78 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ext.      */.   
a080: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
a090: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  ){.        if( S
a0a0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
a0b0: 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
a0c0: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
a0d0: 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a  tmt, &zLeft) ){.
a0e0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65            Tcl_Se
a0f0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
a100: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
a110: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
a120: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
a130: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
a140: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OR;.          br
a150: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a160: 20 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74         if( pStmt
a170: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a180: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
a190: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
a1a0: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
a1b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d          /* A com
a1c0: 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20  pile-time error 
a1d0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
a1e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
a200: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
a210: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
a220: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
a230: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
a240: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
a250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
a260: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a270: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
a290: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
a2a0: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
a2b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
a2c0: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  ement.          
a2d0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20    ** in the SQL 
a2e0: 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  string..        
a2f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
a300: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
a310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
a320: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
a330: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
a340: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
a350: 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  eStmt==0 );.    
a360: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69    }..      /* Bi
a370: 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72  nd values to par
a380: 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67  ameters that beg
a390: 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 0a 20  in with $ or :. 
a3a0: 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20       */  .      
a3b0: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
a3c0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
a3d0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
a3e0: 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20    nParm = 0;.   
a3f0: 20 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a 65     if( nVar>size
a400: 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66  of(aParm)/sizeof
a410: 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20  (aParm[0]) ){.  
a420: 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 28        apParm = (
a430: 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c  Tcl_Obj**)Tcl_Al
a440: 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28  loc(nVar*sizeof(
a450: 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20  apParm[0]));.   
a460: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a470: 20 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72 6d    apParm = aParm
a480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a490: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
a4a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a4b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
a4c0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
a4d0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
a4e0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
a4f0: 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26    if( zVar!=0 &&
a500: 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c   (zVar[0]=='$' |
a510: 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 29 20  | zVar[0]==':') 
a520: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
a530: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
a540: 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
a550: 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20  p, &zVar[1], 0, 
a560: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
a570: 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ( pVar ){.      
a580: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
a590: 20 20 20 20 20 20 20 20 20 75 38 20 2a 64 61 74           u8 *dat
a5a0: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  a;.            c
a5b0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61  har *zType = pVa
a5c0: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
a5d0: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
a5e0: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   : "";.         
a5f0: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70     char c = zTyp
a600: 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[0];.          
a610: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
a620: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
a630: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
a640: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29  pVar->bytes==0 )
a650: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a660: 2f 2a 20 4f 6e 6c 79 20 6c 6f 61 64 20 61 20 42  /* Only load a B
a670: 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20  LOB type if the 
a680: 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  Tcl variable is 
a690: 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a  a bytearray and.
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
a6b0: 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72   has no string r
a6c0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a  epresentation. *
a6d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
a6e0: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79  data = Tcl_GetBy
a6f0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70  teArrayFromObj(p
a700: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
a710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a720: 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
a730: 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c   i, data, n, SQL
a740: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
a750: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
a760: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72  ncrRefCount(pVar
a770: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a780: 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d   apParm[nParm++]
a790: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
a7a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
a7b0: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
a7c0: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
a7d0: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
a7e0: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
a7f0: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
a800: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
a810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
a820: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
a830: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26  (interp, pVar, &
a840: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
a850: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
a860: 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b  nt(pStmt, i, n);
a870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
a880: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
a890: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
a8a0: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
a8c0: 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  le r;.          
a8d0: 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c      Tcl_GetDoubl
a8e0: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
a8f0: 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20   pVar, &r);.    
a900: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a910: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
a920: 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20  tmt, i, r);.    
a930: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
a940: 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63  ( c=='w' && strc
a950: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
a960: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
a970: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65          Tcl_Wide
a980: 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20  Int v;.         
a990: 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65       Tcl_GetWide
a9a0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
a9b0: 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20  p, pVar, &v);.  
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a9d0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
a9e0: 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20  Stmt, i, v);.   
a9f0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
aa10: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
aa20: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
aa30: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
aa40: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
aa50: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
aa60: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20  _text(pStmt, i, 
aa70: 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c  (char *)data, n,
aa80: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
aa90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
aaa0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
aab0: 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pVar);.         
aac0: 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72       apParm[nPar
aad0: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
aae0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aaf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ab00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ab10: 62 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74  bind_null( pStmt
ab20: 2c 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20 20  , i );.         
ab30: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
ab40: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
ab50: 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  ompute column na
ab60: 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f  mes */.      nCo
ab70: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
ab80: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
ab90: 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69  .      if( pScri
aba0: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  pt ){.        ap
abb0: 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f  ColName = (Tcl_O
abc0: 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  bj**)Tcl_Alloc( 
abd0: 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29  sizeof(Tcl_Obj*)
abe0: 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  *nCol );.       
abf0: 20 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d 3d   if( apColName==
ac00: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
ac10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
ac20: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ac30: 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d      apColName[i]
ac40: 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73   = dbTextToObj(s
ac50: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
ac60: 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  me(pStmt,i));.  
ac70: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
ac80: 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61  RefCount(apColNa
ac90: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  me[i]);.        
aca0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
acb0: 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61   /* If results a
acc0: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20  re being stored 
acd0: 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  in an array vari
ace0: 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74  able, then creat
acf0: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 61  e.      ** the a
ad00: 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f  rray(*) entry fo
ad10: 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20  r that array.   
ad20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
ad30: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
ad40: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c    Tcl_Obj *pColL
ad50: 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ist = Tcl_NewObj
ad60: 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ();.        Tcl_
ad70: 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c  Obj *pStar = Tcl
ad80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a  _NewStringObj("*
ad90: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ", -1);.        
ada0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
adb0: 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20  (pColList);.    
adc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
add0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ade0: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
adf0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
ae00: 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20  terp, pColList, 
ae10: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
ae20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ae30: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
ae40: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
ae50: 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c  pStar, pColList,
ae60: 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  0);.        Tcl_
ae70: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f  DecrRefCount(pCo
ae80: 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  lList);.        
ae90: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
aea0: 28 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20 7d  (pStar);.      }
aeb0: 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63 75  ..      /* Execu
aec0: 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20  te the SQL.     
aed0: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
aee0: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70   rc==TCL_OK && p
aef0: 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 52  Stmt && SQLITE_R
af00: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
af10: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
af20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
af30: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
af40: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
af50: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  l;.          .  
af60: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70          /* Set p
af70: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
af80: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
af90: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
afa0: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
afb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
afc0: 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20 29  type(pStmt, i) )
afd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
afe0: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
aff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b000: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
b010: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
b020: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
b030: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
b040: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
b050: 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  yObj(sqlite3_col
b060: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
b070: 69 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  i), bytes);.    
b080: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b0a0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
b0b0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
b0c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b0d0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
b0e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b0f0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b  int64(pStmt, i);
b100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
b110: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
b120: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
b130: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
b140: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
b150: 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  _NewIntObj(v);. 
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
b170: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
b180: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
b190: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
b1a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
b1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
b1c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b1d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b1e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
b1f0: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
b200: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
b210: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
b220: 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ble(pStmt, i);. 
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
b240: 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  l = Tcl_NewDoubl
b250: 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20  eObj(r);.       
b260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b270: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b280: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
b290: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
b2a0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
b2b0: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62   dbTextToObj(pDb
b2c0: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ->zNull);.      
b2d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b2e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b2f0: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
b300: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
b310: 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54    pVal = dbTextT
b320: 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  oObj((char *)sql
b330: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
b340: 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20  (pStmt, i));.   
b350: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b360: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b370: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
b380: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
b390: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
b3a0: 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d      if( pArray==
b3b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
b3c0: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
b3d0: 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e  2(interp, apColN
b3e0: 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c  ame[i], 0, pVal,
b3f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b410: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
b420: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72  Var2(interp, pAr
b430: 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  ray, apColName[i
b440: 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  ], pVal, 0);.   
b450: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b460: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
b470: 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c  hoice==DB_ONECOL
b480: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
b490: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d     assert( pRet=
b4a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
b4b0: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
b4c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b4d0: 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20  Ret = pVal;.    
b4e0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
b4f0: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
b500: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b510: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
b520: 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20   TCL_BREAK;.    
b530: 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c          i = nCol
b540: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
b550: 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42  e if( choice==DB
b560: 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20  _EXISTS ){.     
b570: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
b580: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
b590: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20             pRet 
b5a0: 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  = Tcl_NewBoolean
b5b0: 4f 62 6a 28 31 29 3b 0a 20 20 20 20 20 20 20 20  Obj(1);.        
b5c0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
b5d0: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
b5e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
b5f0: 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20  _BREAK;.        
b600: 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20      i = nCol;.  
b610: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b620: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c             Tcl_L
b630: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b640: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
b650: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , pVal);.       
b660: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
b670: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53   .        if( pS
b680: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
b690: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
b6a0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
b6b0: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 20  cript, 0);.     
b6c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
b6d0: 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20 20  _CONTINUE ){.   
b6e0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
b6f0: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  L_OK;.          
b700: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b710: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
b720: 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
b730: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
b740: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  OK;.      }..   
b750: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63     /* Free the c
b760: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65 63  olumn name objec
b770: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
b780: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
b790: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
b7a0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
b7b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
b7c0: 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69  ount(apColName[i
b7d0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
b7e0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
b7f0: 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29  char*)apColName)
b800: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
b810: 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75   /* Free the bou
b820: 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c  nd string and bl
b830: 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ob parameters */
b840: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b850: 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nParm; i++){. 
b860: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
b870: 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69  efCount(apParm[i
b880: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
b890: 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61 50    if( apParm!=aP
b8a0: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 54  arm ){.        T
b8b0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61  cl_Free((char*)a
b8c0: 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  pParm);.      }.
b8d0: 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20  .      /* Reset 
b8e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
b8f0: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  If the result co
b900: 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43 48  de is SQLITE_SCH
b910: 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  EMA, then.      
b920: 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74 61  ** flush the sta
b930: 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e 64  tement cache and
b940: 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d 65   try the stateme
b950: 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20  nt again..      
b960: 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73  */.      rc2 = s
b970: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
b980: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  mt);.      if( S
b990: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 72 63  QLITE_SCHEMA==rc
b9a0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
b9b0: 41 66 74 65 72 20 61 20 73 63 68 65 6d 61 20 63  After a schema c
b9c0: 68 61 6e 67 65 2c 20 66 6c 75 73 68 20 74 68 65  hange, flush the
b9d0: 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20 74   cache and try t
b9e0: 6f 20 72 75 6e 20 74 68 65 0a 20 20 20 20 20 20  o run the.      
b9f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61    ** statement a
ba00: 67 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  gain.        */.
ba10: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
ba20: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
ba30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
ba40: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
ba50: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
ba60: 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28  Stmt ) Tcl_Free(
ba70: 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29  (char*)pPreStmt)
ba80: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
ba90: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ue;.      }else 
baa0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
bab0: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  c2 ){.        /*
bac0: 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65   If a run-time e
bad0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70  rror occurs, rep
bae0: 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e  ort the error an
baf0: 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20  d stop reading. 
bb00: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
bb10: 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  L.        */.   
bb20: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
bb30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
bb40: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
bb50: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
bb60: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  )));.        sql
bb70: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
bb80: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  tmt);.        rc
bb90: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
bba0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
bbb0: 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63  mt ) Tcl_Free((c
bbc0: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  har*)pPreStmt);.
bbd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bbe0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
bbf0: 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 29  Db->maxStmt<=0 )
bc00: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
bc10: 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72  the cache is tur
bc20: 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63  ned off, dealloc
bc30: 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65  ated the stateme
bc40: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  nt */.        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: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
bc90: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d  (pStmt);.      }
bca0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
bcb0: 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   Everything work
bcc0: 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
bcd0: 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c 2e   is operational.
bce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65 61  .        ** Crea
bcf0: 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70  te a new SqlPrep
bd00: 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75  aredStmt structu
bd10: 72 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f 6e  re if we need on
bd20: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 49  e..        ** (I
bd30: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
bd40: 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75 73  e one we can jus
bd50: 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20 20  t reuse it.).   
bd60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
bd70: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
bd80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
bd90: 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c 3b   = zLeft - zSql;
bda0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
bdb0: 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72  tmt = (SqlPrepar
bdc0: 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f  edStmt*)Tcl_Allo
bdd0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65 53  c( sizeof(*pPreS
bde0: 74 6d 74 29 20 2b 20 6c 65 6e 20 29 3b 0a 20 20  tmt) + len );.  
bdf0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
be00: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
be10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
be20: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
be30: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
be40: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
be50: 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20  t->nSql = len;. 
be60: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
be70: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
be80: 7a 53 71 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  zSql, len);.    
be90: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
bea0: 7a 53 71 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20  zSql[len] = 0;. 
beb0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
bec0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
bed0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
bee0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
bef0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
bf00: 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  st.        */.  
bf10: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
bf20: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
bf30: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70  tList;.        p
bf40: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d  PreStmt->pPrev =
bf50: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
bf60: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
bf70: 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  .         pDb->s
bf80: 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  tmtList->pPrev =
bf90: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
bfa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
bfb0: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
bfc0: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  eStmt;.        i
bfd0: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
bfe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
bff0: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
c000: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
c010: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
c020: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
c030: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c040: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c050: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
c060: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c070: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20   pDb->nStmt++;. 
c080: 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66    .        /* If
c090: 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e   we have too man
c0a0: 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63  y statement in c
c0b0: 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65  ache, remove the
c0c0: 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74 68   surplus from th
c0d0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 64  e.        ** end
c0e0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
c0f0: 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  st..        */. 
c100: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 44         while( pD
c110: 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61  b->nStmt>pDb->ma
c120: 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  xStmt ){.       
c130: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
c140: 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ize(pDb->stmtLas
c150: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
c160: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
c170: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61  st = pDb->stmtLa
c180: 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  st->pPrev;.     
c190: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
c1a0: 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61  har*)pDb->stmtLa
c1b0: 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20  st->pNext);.    
c1c0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
c1d0: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
c1e0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
c1f0: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
c200: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
c210: 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20 74   /* Proceed to t
c220: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
c230: 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20  t */.      zSql 
c240: 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20  = zLeft;.    }. 
c250: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
c260: 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20  unt(objv[2]);.. 
c270: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
c280: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
c290: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
c2a0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
c2b0: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
c2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
c2d0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
c2e0: 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  et);.    }.    b
c2f0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
c300: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e    **     $db fun
c310: 63 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50  ction NAME SCRIP
c320: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
c330: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e  te a new SQL fun
c340: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
c350: 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61  E.  Whenever tha
c360: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  t function is.  
c370: 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  ** called, invok
c380: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
c390: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
c3a0: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
c3b0: 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  B_FUNCTION: {.  
c3c0: 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
c3d0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
c3e0: 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72  Script;.    char
c3f0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28   *zName;.    if(
c400: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
c410: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c420: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
c430: 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54  jv, "NAME SCRIPT
c440: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
c450: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c460: 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
c470: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
c480: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
c490: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
c4a0: 6a 76 5b 33 5d 3b 0a 20 20 20 20 70 46 75 6e 63  jv[3];.    pFunc
c4b0: 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70   = findSqlFunc(p
c4c0: 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db, zName);.    
c4d0: 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72  if( pFunc==0 ) r
c4e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c4f0: 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
c500: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
c510: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
c520: 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  t(pFunc->pScript
c530: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75  );.    }.    pFu
c540: 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53  nc->pScript = pS
c550: 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
c560: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
c570: 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d  ipt);.    pFunc-
c580: 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73  >useEvalObjv = s
c590: 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76  afeToUseEvalObjv
c5a0: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
c5b0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
c5c0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c5d0: 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
c5e0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
c5f0: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75  TF8,.        pFu
c600: 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20  nc, tclSqlFunc, 
c610: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
c620: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c630: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
c640: 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f  RROR;.      Tcl_
c650: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
c660: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
c670: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
c680: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
c690: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c6a0: 20 20 20 2f 2a 20 4d 75 73 74 20 66 6c 75 73 68     /* Must flush
c6b0: 20 61 6e 79 20 63 61 63 68 65 64 20 73 74 61 74   any cached stat
c6c0: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
c6d0: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
c6e0: 70 44 62 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDb );.    }.   
c6f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
c700: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e  *.  **     $db n
c710: 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47  ullvalue ?STRING
c720: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e  ?.  **.  ** Chan
c730: 67 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65  ge text used whe
c740: 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62  n a NULL comes b
c750: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ack from the dat
c760: 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e  abase. If ?STRIN
c770: 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  G?.  ** is not p
c780: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
c790: 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20   current string 
c7a0: 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73  used for NULL is
c7b0: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20   returned..  ** 
c7c0: 49 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65  If STRING is pre
c7d0: 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e  sent, then STRIN
c7e0: 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  G is returned.. 
c7f0: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
c800: 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a  DB_NULLVALUE: {.
c810: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
c820: 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  && objc!=3 ){.  
c830: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
c840: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
c850: 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45  objv, "NULLVALUE
c860: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
c870: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c880: 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
c890: 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  3 ){.      int l
c8a0: 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  en;.      char *
c8b0: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
c8c0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
c8d0: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
c8e0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c     if( pDb->zNul
c8f0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  l ){.        Tcl
c900: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c  _Free(pDb->zNull
c910: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c920: 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65   if( zNull && le
c930: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
c940: 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f  Db->zNull = Tcl_
c950: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
c960: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 70  ;.        strncp
c970: 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e  y(pDb->zNull, zN
c980: 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  ull, len);.     
c990: 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65     pDb->zNull[le
c9a0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  n] = '\0';.     
c9b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c9c0: 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a  pDb->zNull = 0;.
c9d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c9e0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
c9f0: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
ca00: 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c  tToObj(pDb->zNul
ca10: 6c 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  l));.    break;.
ca20: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
ca30: 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65     $db last_inse
ca40: 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20  rt_rowid .  **. 
ca50: 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e   ** Return an in
ca60: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
ca70: 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65  he ROWID for the
ca80: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
ca90: 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ert..  */.  case
caa0: 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f   DB_LAST_INSERT_
cab0: 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c  ROWID: {.    Tcl
cac0: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
cad0: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 72     Tcl_WideInt r
cae0: 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62  owid;.    if( ob
caf0: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
cb00: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
cb10: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
cb20: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
cb30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cb40: 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20    }.    rowid = 
cb50: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
cb60: 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64  ert_rowid(pDb->d
cb70: 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20  b);.    pResult 
cb80: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
cb90: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
cba0: 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f 62  Tcl_SetWideIntOb
cbb0: 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64  j(pResult, rowid
cbc0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
cbd0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  }..  /*.  ** The
cbe0: 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65   DB_ONECOLUMN me
cbf0: 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e  thod is implemen
cc00: 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69 74  ted together wit
cc10: 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a  h DB_EVAL..  */.
cc20: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f  .  /*    $db pro
cc30: 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43  gress ?N CALLBAC
cc40: 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e  K?.  ** .  ** In
cc50: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
cc60: 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20  allback every N 
cc70: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
cc80: 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78  opcodes while ex
cc90: 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65  ecuting.  ** que
cca0: 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ries..  */.  cas
ccb0: 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b  e DB_PROGRESS: {
ccc0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  .    if( objc==2
ccd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
cce0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
ccf0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
cd00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cd10: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c   pDb->zProgress,
cd20: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
cd30: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
cd40: 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =4 ){.      char
cd50: 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20   *zProgress;.   
cd60: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
cd70: 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69    int N;.      i
cd80: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
cd90: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
cda0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e  erp, objv[2], &N
cdb0: 29 20 29 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ) ){..return TCL
cdc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b  _ERROR;.      };
cdd0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
cde0: 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
cdf0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
ce00: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20  b->zProgress);. 
ce10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
ce20: 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74  ogress = Tcl_Get
ce30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
ce40: 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[3], &len);.  
ce50: 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73      if( zProgres
ce60: 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  s && len>0 ){.  
ce70: 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67        pDb->zProg
ce80: 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  ress = Tcl_Alloc
ce90: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
cea0: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
ceb0: 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f  >zProgress, zPro
cec0: 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 65  gress);.      }e
ced0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
cee0: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->zProgress = 0;
cef0: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
cf00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
cf10: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
cf20: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
cf30: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
cf40: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
cf50: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
cf60: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
cf70: 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  s_handler(pDb->d
cf80: 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73  b, N, DbProgress
cf90: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
cfa0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cfb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
cfc0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
cfd0: 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ->db, 0, 0, 0);.
cfe0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
cff0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d000: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
d010: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
d020: 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b  , "N CALLBACK");
d030: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
d040: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
d050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
d060: 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69   /*    $db profi
d070: 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  le ?CALLBACK?.  
d080: 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
d090: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
d0a0: 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
d0b0: 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65   routine after e
d0c0: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
d0d0: 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20  t.  ** that has 
d0e0: 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f  run.  The text o
d0f0: 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68  f the SQL and th
d100: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70  e amount of elap
d110: 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a  se time are.  **
d120: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c   appended to CAL
d130: 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65  LBACK before the
d140: 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a   script is run..
d150: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50    */.  case DB_P
d160: 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66  ROFILE: {.    if
d170: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
d180: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
d190: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
d1a0: 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
d1b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d1c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
d1d0: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
d1e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
d1f0: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
d200: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
d210: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d220: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30  pDb->zProfile, 0
d230: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d240: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
d250: 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20   *zProfile;.    
d260: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
d270: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
d280: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
d290: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
d2a0: 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  file);.      }. 
d2b0: 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20       zProfile = 
d2c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
d2d0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
d2e0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
d2f0: 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30  Profile && len>0
d300: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
d310: 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f  >zProfile = Tcl_
d320: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
d330: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
d340: 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20  (pDb->zProfile, 
d350: 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20  zProfile);.     
d360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d370: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20  pDb->zProfile = 
d380: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
d390: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
d3a0: 52 41 43 45 0a 20 20 20 20 20 20 69 66 28 20 70  RACE.      if( p
d3b0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
d3c0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
d3d0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
d3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
d3f0: 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44  ofile(pDb->db, D
d400: 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c  bProfileHandler,
d410: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
d420: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d430: 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d  te3_profile(pDb-
d440: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
d450: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
d460: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
d470: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
d480: 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a  db rekey KEY.  *
d490: 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68  *.  ** Change th
d4a0: 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79  e encryption key
d4b0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c   on the currentl
d4c0: 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e  y open database.
d4d0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
d4e0: 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74  REKEY: {.    int
d4f0: 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20   nKey;.    void 
d500: 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f  *pKey;.    if( o
d510: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
d520: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
d530: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
d540: 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20  , "KEY");.      
d550: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d560: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
d570: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
d580: 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
d590: 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64  2], &nKey);.#ifd
d5a0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
d5b0: 44 45 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  DEC.    rc = sql
d5c0: 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e  ite3_rekey(pDb->
d5d0: 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, pKey, nKey);
d5e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
d5f0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
d600: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
d610: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
d620: 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
d630: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
d640: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
d650: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
d660: 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75  *     $db timeou
d670: 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20  t MILLESECONDS. 
d680: 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66   **.  ** Delay f
d690: 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
d6a0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70   milliseconds sp
d6b0: 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66  ecified when a f
d6c0: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ile is locked.. 
d6d0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49   */.  case DB_TI
d6e0: 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74  MEOUT: {.    int
d6f0: 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a   ms;.    if( obj
d700: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
d710: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d720: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
d730: 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
d740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
d750: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
d760: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
d770: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
d780: 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29   objv[2], &ms) )
d790: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d7a0: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  R;.    sqlite3_b
d7b0: 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d  usy_timeout(pDb-
d7c0: 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72  >db, ms);.    br
d7d0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  eak;.  }.  .  /*
d7e0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f  .  **     $db to
d7f0: 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a  tal_changes.  **
d800: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
d810: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
d820: 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
d830: 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
d840: 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73   deleted .  ** s
d850: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
d860: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65  e handle was cre
d870: 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ated..  */.  cas
d880: 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47  e DB_TOTAL_CHANG
d890: 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
d8a0: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
d8b0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
d8c0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
d8d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
d8e0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
d8f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d900: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
d910: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
d920: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
d930: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
d940: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
d950: 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
d960: 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
d970: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
d980: 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 20  /*    $db trace 
d990: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
d9a0: 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67    ** Make arrang
d9b0: 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65  ements to invoke
d9c0: 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f   the CALLBACK ro
d9d0: 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53  utine for each S
d9e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
d9f0: 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75 74  * that is execut
da00: 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66  ed.  The text of
da10: 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70 65   the SQL is appe
da20: 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
da30: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20   before.  ** it 
da40: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
da50: 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43  /.  case DB_TRAC
da60: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
da70: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
da80: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
da90: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
daa0: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
dab0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dac0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
dad0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
dae0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
daf0: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
db00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
db10: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54  (interp, pDb->zT
db20: 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  race, 0);.      
db30: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
db40: 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b     char *zTrace;
db50: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
db60: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
db70: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
db80: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
db90: 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Trace);.      }.
dba0: 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54        zTrace = T
dbb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
dbc0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
dbd0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54  n);.      if( zT
dbe0: 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b  race && len>0 ){
dbf0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
dc00: 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  race = Tcl_Alloc
dc10: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
dc20: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
dc30: 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65 29  >zTrace, zTrace)
dc40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dc50: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
dc60: 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ce = 0;.      }.
dc70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dc80: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20  MIT_TRACE.      
dc90: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
dca0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
dcb0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
dcc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dcd0: 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20  _trace(pDb->db, 
dce0: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20  DbTraceHandler, 
dcf0: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
dd00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
dd10: 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62  e3_trace(pDb->db
dd20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
dd30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
dd40: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
dd50: 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73 61  /*    $db transa
dd60: 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64  ction [-deferred
dd70: 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63  |-immediate|-exc
dd80: 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20  lusive] SCRIPT. 
dd90: 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61   **.  ** Start a
dda0: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
ddb0: 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20   (if we are not 
ddc0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d  already in the m
ddd0: 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74  idst of a.  ** t
dde0: 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20  ransaction) and 
ddf0: 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c 20  execute the TCL 
de00: 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 20  script SCRIPT.  
de10: 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a  After SCRIPT.  *
de20: 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74  * completes, eit
de30: 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74  her commit the t
de40: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f  ransaction or ro
de50: 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53 43  ll it back if SC
de60: 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73  RIPT.  ** throws
de70: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20   an exception.  
de80: 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61  Or if no new tra
de90: 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72  nsation was star
dea0: 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ted, do nothing.
deb0: 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65  .  ** pass the e
dec0: 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74  xception on up t
ded0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
dee0: 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64   ** This command
def0: 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62 79   was inspired by
df00: 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74   Dave Thomas's t
df10: 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74  alk on Ruby at t
df20: 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52  he.  ** 2005 O'R
df30: 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63  eilly Open Sourc
df40: 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53  e Convention (OS
df50: 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  CON)..  */.  cas
df60: 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e  e DB_TRANSACTION
df70: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 54 72  : {.    int inTr
df80: 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ans;.    Tcl_Obj
df90: 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
dfa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69  onst char *zBegi
dfb0: 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20 20 20  n = "BEGIN";.   
dfc0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
dfd0: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
dfe0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
dff0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
e000: 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50  v, "[TYPE] SCRIP
e010: 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
e020: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e030: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
e040: 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 53 63 72  =3 ){.      pScr
e050: 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20  ipt = objv[2];. 
e060: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
e070: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
e080: 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b  har *TTYPE_strs[
e090: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64  ] = {.        "d
e0a0: 65 66 65 72 72 65 64 22 2c 20 20 20 22 65 78 63  eferred",   "exc
e0b0: 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64  lusive",  "immed
e0c0: 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d  iate", 0.      }
e0d0: 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59  ;.      enum TTY
e0e0: 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20  PE_enum {.      
e0f0: 20 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44    TTYPE_DEFERRED
e100: 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56  , TTYPE_EXCLUSIV
e110: 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  E, TTYPE_IMMEDIA
e120: 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  TE.      };.    
e130: 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20    int ttype;.   
e140: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
e150: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
e160: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50  p, objv[2], TTYP
e170: 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63  E_strs, "transac
e180: 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20  tion type",.    
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74            0, &tt
e1b0: 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ype) ){.        
e1c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e1d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e1e0: 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54  switch( (enum TT
e1f0: 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29  YPE_enum)ttype )
e200: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  {.        case T
e210: 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20  TYPE_DEFERRED:  
e220: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20    /* no-op */;  
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
e240: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
e250: 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49  se TTYPE_EXCLUSI
e260: 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  VE:   zBegin = "
e270: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22  BEGIN EXCLUSIVE"
e280: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
e290: 20 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d    case TTYPE_IMM
e2a0: 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e  EDIATE:   zBegin
e2b0: 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49   = "BEGIN IMMEDI
e2c0: 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ATE";  break;.  
e2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72      }.      pScr
e2e0: 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ipt = objv[3];. 
e2f0: 20 20 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73     }.    inTrans
e300: 20 3d 20 21 73 71 6c 69 74 65 33 5f 67 65 74 5f   = !sqlite3_get_
e310: 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e  autocommit(pDb->
e320: 64 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e  db);.    if( !in
e330: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 28  Trans ){.      (
e340: 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65  void)sqlite3_exe
e350: 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69  c(pDb->db, zBegi
e360: 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  n, 0, 0, 0);.   
e370: 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f   }.    rc = Tcl_
e380: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
e390: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
e3a0: 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73 20     if( !inTrans 
e3b0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
e3c0: 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 20 20 20  har *zEnd;.     
e3d0: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 45 52 52   if( rc==TCL_ERR
e3e0: 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  OR ){.        zE
e3f0: 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  nd = "ROLLBACK";
e400: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
e410: 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22          zEnd = "
e420: 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 20 20 7d  COMMIT";.      }
e430: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c  .      (void)sql
e440: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
e450: 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30  b, zEnd, 0, 0, 0
e460: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
e470: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
e480: 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74 65  **    $db update
e490: 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
e4a0: 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c 62   **    $db rollb
e4b0: 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74  ack_hook ?script
e4c0: 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ?.  */.  case DB
e4d0: 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20  _UPDATE_HOOK: . 
e4e0: 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43   case DB_ROLLBAC
e4f0: 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f  K_HOOK: {..    /
e500: 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20  * set ppHook to 
e510: 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65  point at pUpdate
e520: 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63  Hook or pRollbac
e530: 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67  kHook, depending
e540: 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74   on .    ** whet
e550: 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f  her [$db update_
e560: 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f  hook] or [$db ro
e570: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73  llback_hook] was
e580: 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f   invoked..    */
e590: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70  .    Tcl_Obj **p
e5a0: 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20  pHook; .    if( 
e5b0: 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54  choice==DB_UPDAT
e5c0: 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  E_HOOK ){.      
e5d0: 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
e5e0: 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20  UpdateHook;.    
e5f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 48  }else{.      ppH
e600: 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c  ook = &pDb->pRol
e610: 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d  lbackHook;.    }
e620: 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ..    if( objc!=
e630: 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
e640: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
e650: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e660: 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
e670: 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74  T?");.       ret
e680: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e690: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70 70     }.    if( *pp
e6a0: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54 63  Hook ){.      Tc
e6b0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
e6c0: 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b  nterp, *ppHook);
e6d0: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  .      if( objc=
e6e0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
e6f0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 2a  l_DecrRefCount(*
e700: 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20  ppHook);.       
e710: 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20   *ppHook = 0;.  
e720: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e730: 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
e740: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 2a       assert( !(*
e750: 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 20  ppHook) );.     
e760: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61 72   if( Tcl_GetChar
e770: 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29 3e  Length(objv[2])>
e780: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  0 ){.        *pp
e790: 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a  Hook = objv[2];.
e7a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
e7b0: 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b  RefCount(*ppHook
e7c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e7d0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 70  ..    sqlite3_up
e7e0: 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  date_hook(pDb->d
e7f0: 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65  b, (pDb->pUpdate
e800: 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e  Hook?DbUpdateHan
e810: 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20  dler:0), pDb);. 
e820: 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62     sqlite3_rollb
e830: 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  ack_hook(pDb->db
e840: 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ,(pDb->pRollback
e850: 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48  Hook?DbRollbackH
e860: 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b 0a  andler:0),pDb);.
e870: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
e880: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72  .  /*    $db ver
e890: 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  sion.  **.  ** R
e8a0: 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f  eturn the versio
e8b0: 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69  n string for thi
e8c0: 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  s database..  */
e8d0: 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53 49  .  case DB_VERSI
e8e0: 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  ON: {.    Tcl_Se
e8f0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
e900: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
e910: 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43  libversion(), TC
e920: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62  L_STATIC);.    b
e930: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20  reak;.  }...  } 
e940: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57  /* End of the SW
e950: 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a  ITCH statement *
e960: 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
e970: 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ../*.**   sqlite
e980: 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d  3 DBNAME FILENAM
e990: 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b  E ?MODE? ?-key K
e9a0: 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  EY?.**.** This i
e9b0: 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63  s the main Tcl c
e9c0: 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68  ommand.  When th
e9d0: 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63  e "sqlite" Tcl c
e9e0: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76  ommand is.** inv
e9f0: 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  oked, this routi
ea00: 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65  ne runs to proce
ea10: 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e  ss that command.
ea20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
ea30: 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d   argument, DBNAM
ea40: 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61  E, is an arbitra
ea50: 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ry name for a ne
ea60: 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  w.** database co
ea70: 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  nnection.  This 
ea80: 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20  command creates 
ea90: 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61  a new command na
eaa0: 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68  med.** DBNAME th
eab0: 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
eac0: 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65  ntrol that conne
ead0: 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61  ction.  The data
eae0: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
eaf0: 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68  on is deleted wh
eb00: 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f  en the DBNAME co
eb10: 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64  mmand is deleted
eb20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
eb30: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
eb40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
eb50: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
eb60: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 73 71  ntains.** the sq
eb70: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 68  lite database th
eb80: 61 74 20 69 73 20 74 6f 20 62 65 20 61 63 63 65  at is to be acce
eb90: 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ssed..**.** For 
eba0: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
ebb0: 2c 20 77 65 20 61 6c 73 6f 20 73 75 70 70 6f 72  , we also suppor
ebc0: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  t the following:
ebd0: 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20  .**.**  sqlite3 
ebe0: 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20  -encoding.**.** 
ebf0: 20 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65        Return the
ec00: 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62   encoding used b
ec10: 79 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20  y LIKE and GLOB 
ec20: 6f 70 65 72 61 74 6f 72 73 2e 20 20 43 68 6f 69  operators.  Choi
ec30: 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  ces.**       are
ec40: 20 55 54 46 2d 38 20 61 6e 64 20 69 73 6f 38 38   UTF-8 and iso88
ec50: 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  59..**.**  sqlit
ec60: 65 33 20 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a  e3 -version.**.*
ec70: 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74  *       Return t
ec80: 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
ec90: 72 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  r of the SQLite 
eca0: 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  library..**.**  
ecb0: 73 71 6c 69 74 65 33 20 2d 74 63 6c 2d 75 73 65  sqlite3 -tcl-use
ecc0: 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20  s-utf.**.**     
ecd0: 20 20 52 65 74 75 72 6e 20 22 31 22 20 69 66 20    Return "1" if 
ece0: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61 20  compiled with a 
ecf0: 54 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e 20  Tcl uses UTF-8. 
ed00: 20 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a 2a   Return "0" if.*
ed10: 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55 73  *       not.  Us
ed20: 65 64 20 62 79 20 74 65 73 74 73 20 74 6f 20 6d  ed by tests to m
ed30: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69 62  ake sure the lib
ed40: 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
ed50: 64 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72 72  d .**       corr
ed60: 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
ed70: 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64   int DbMain(void
ed80: 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70   *cd, Tcl_Interp
ed90: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
eda0: 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  jc,Tcl_Obj *cons
edb0: 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74  t*objv){.  Sqlit
edc0: 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a  eDb *p;.  void *
edd0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pKey = 0;.  int 
ede0: 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  nKey = 0;.  cons
edf0: 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
ee00: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
ee10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
ee20: 6c 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  le;.  if( objc==
ee30: 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  2 ){.    zArg = 
ee40: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ee50: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
ee60: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
ee70: 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22  (zArg,"-version"
ee80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
ee90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
eea0: 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65  nterp,sqlite3_ve
eeb0: 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20  rsion,0);.      
eec0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
eed0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
eee0: 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63  cmp(zArg,"-has-c
eef0: 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66  odec")==0 ){.#if
ef00: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
ef10: 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41  ODEC.      Tcl_A
ef20: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ef30: 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65  rp,"1",0);.#else
ef40: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
ef50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
ef60: 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0",0);.#endif.  
ef70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
ef80: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
ef90: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 74   strcmp(zArg,"-t
efa0: 63 6c 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d 30  cl-uses-utf")==0
efb0: 20 29 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f 55   ){.#ifdef TCL_U
efc0: 54 46 5f 4d 41 58 0a 20 20 20 20 20 20 54 63 6c  TF_MAX.      Tcl
efd0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
efe0: 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c  terp,"1",0);.#el
eff0: 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  se.      Tcl_App
f000: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f010: 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a  ,"0",0);.#endif.
f020: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f030: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
f040: 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20   if( objc==5 || 
f050: 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 7a  objc==6 ){.    z
f060: 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
f070: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f080: 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b 0a 20 20 20  objc-2], 0);.   
f090: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
f0a0: 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20  ,"-key")==0 ){. 
f0b0: 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f       pKey = Tcl_
f0c0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
f0d0: 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d  Obj(objv[objc-1]
f0e0: 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  , &nKey);.      
f0f0: 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20 20 20 20 7d  objc -= 2;.    }
f100: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 21  .  }.  if( objc!
f110: 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =3 && objc!=4 ){
f120: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
f130: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
f140: 20 6f 62 6a 76 2c 20 0a 23 69 66 64 65 66 20 53   objv, .#ifdef S
f150: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
f160: 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49        "HANDLE FI
f170: 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79 20 43 4f 44  LENAME ?-key COD
f180: 45 43 2d 4b 45 59 3f 22 0a 23 65 6c 73 65 0a 20  EC-KEY?".#else. 
f190: 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c       "HANDLE FIL
f1a0: 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23 65  ENAME ?MODE?".#e
f1b0: 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  ndif.    );.    
f1c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f1d0: 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20  ;.  }.  zErrMsg 
f1e0: 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69  = 0;.  p = (Sqli
f1f0: 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  teDb*)Tcl_Alloc(
f200: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
f210: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
f220: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
f230: 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66  nterp, "malloc f
f240: 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54  ailed", TCL_STAT
f250: 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
f260: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
f270: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
f280: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69  zeof(*p));.  zFi
f290: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
f2a0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
f2b0: 5d 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ], 0);.  sqlite3
f2c0: 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 26 70 2d  _open(zFile, &p-
f2d0: 3e 64 62 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  >db);.  if( SQLI
f2e0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
f2f0: 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
f300: 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
f310: 74 72 64 75 70 28 73 71 6c 69 74 65 33 5f 65 72  trdup(sqlite3_er
f320: 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
f330: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
f340: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  p->db);.    p->d
f350: 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  b = 0;.  }.#ifde
f360: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
f370: 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  EC.  sqlite3_key
f380: 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b  (p->db, pKey, nK
f390: 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ey);.#endif.  if
f3a0: 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
f3b0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
f3c0: 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c  interp, zErrMsg,
f3d0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
f3e0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
f3f0: 61 72 2a 29 70 29 3b 0a 20 20 20 20 66 72 65 65  ar*)p);.    free
f400: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72  (zErrMsg);.    r
f410: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f420: 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d  .  }.  p->maxStm
f430: 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  t = NUM_PREPARED
f440: 5f 53 54 4d 54 53 3b 0a 20 20 7a 41 72 67 20 3d  _STMTS;.  zArg =
f450: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f460: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
f470: 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
f480: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
f490: 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64  , zArg, DbObjCmd
f4a0: 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65  , (char*)p, DbDe
f4b0: 6c 65 74 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20  leteCmd);..  /* 
f4c0: 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  If compiled with
f4d0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 74 75 72   SQLITE_TEST tur
f4e0: 6e 65 64 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67  ned on, then reg
f4f0: 69 73 74 65 72 20 74 68 65 20 22 6d 64 35 73 75  ister the "md5su
f500: 6d 22 0a 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63  m".  ** SQL func
f510: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  tion..  */.#ifde
f520: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
f530: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
f540: 64 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73  d Md5_Register(s
f550: 71 6c 69 74 65 33 2a 29 3b 0a 23 69 66 64 65 66  qlite3*);.#ifdef
f560: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
f570: 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 66  .    int mallocf
f580: 61 69 6c 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d  ail = sqlite3_iM
f590: 61 6c 6c 6f 63 46 61 69 6c 3b 0a 20 20 20 20 73  allocFail;.    s
f5a0: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
f5b0: 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  il = 0;.#endif. 
f5c0: 20 20 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28     Md5_Register(
f5d0: 70 2d 3e 64 62 29 3b 0a 23 69 66 64 65 66 20 53  p->db);.#ifdef S
f5e0: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20  QLITE_MEMDEBUG. 
f5f0: 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c     sqlite3_iMall
f600: 6f 63 46 61 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66  ocFail = mallocf
f610: 61 69 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ail;.#endif.  }.
f620: 23 65 6e 64 69 66 20 20 0a 20 20 70 2d 3e 69 6e  #endif  .  p->in
f630: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
f640: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f650: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  }../*.** Provide
f660: 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69   a dummy Tcl_Ini
f670: 74 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65  tStubs if we are
f680: 20 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61   using this as a
f690: 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61   static.** libra
f6a0: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55  ry..*/.#ifndef U
f6b0: 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75  SE_TCL_STUBS.# u
f6c0: 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74  ndef  Tcl_InitSt
f6d0: 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c  ubs.# define Tcl
f6e0: 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63  _InitStubs(a,b,c
f6f0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
f700: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
f710: 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e a PACKAGE_VERS
f720: 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ION macro define
f730: 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
f740: 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f  .** defined auto
f750: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65  matically by the
f760: 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20   TEA makefile.  
f770: 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69  But other makefi
f780: 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65  les.** do not de
f790: 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e  fine it..*/.#ifn
f7a0: 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
f7b0: 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43  ION.# define PAC
f7c0: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c  KAGE_VERSION SQL
f7d0: 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64  ITE_VERSION.#end
f7e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
f7f0: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
f800: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c  ..**.** This Tcl
f810: 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73   module contains
f820: 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e   only a single n
f830: 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  ew Tcl command n
f840: 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a  amed "sqlite"..*
f850: 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69  * (Hence there i
f860: 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20  s no namespace. 
f870: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
f880: 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61  nt in using a na
f890: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68  mespace.** if th
f8a0: 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  e extension only
f8b0: 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65   supplies one ne
f8c0: 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73  w name!)  The "s
f8d0: 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69  qlite" command i
f8e0: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65  s.** used to ope
f8f0: 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64  n a new SQLite d
f900: 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68  atabase.  See th
f910: 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69  e DbMain() routi
f920: 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20  ne above.** for 
f930: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
f940: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 65 78 74 65 72  mation..*/.exter
f950: 6e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e  n int Sqlite3_In
f960: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
f970: 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e  nterp){.  Tcl_In
f980: 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
f990: 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c  "8.4", 0);.  Tcl
f9a0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
f9b0: 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
f9c0: 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64  e3", (Tcl_ObjCmd
f9d0: 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c  Proc*)DbMain, 0,
f9e0: 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72   0);.  Tcl_PkgPr
f9f0: 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73  ovide(interp, "s
fa00: 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45  qlite3", PACKAGE
fa10: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 54 63 6c  _VERSION);.  Tcl
fa20: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
fa30: 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
fa40: 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  e", (Tcl_ObjCmdP
fa50: 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
fa60: 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f  0);.  Tcl_PkgPro
fa70: 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71  vide(interp, "sq
fa80: 6c 69 74 65 22 2c 20 50 41 43 4b 41 47 45 5f 56  lite", PACKAGE_V
fa90: 45 52 53 49 4f 4e 29 3b 0a 20 20 72 65 74 75 72  ERSION);.  retur
faa0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 65 78 74 65  n TCL_OK;.}.exte
fab0: 72 6e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  rn int Tclsqlite
fac0: 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
fad0: 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
fae0: 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
faf0: 69 6e 74 65 72 70 29 3b 20 7d 0a 65 78 74 65 72  interp); }.exter
fb00: 6e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61  n int Sqlite3_Sa
fb10: 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
fb20: 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
fb30: 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 65 78 74  rn TCL_OK; }.ext
fb40: 65 72 6e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74  ern int Tclsqlit
fb50: 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  e3_SafeInit(Tcl_
fb60: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
fb70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
fb80: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fb90: 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a  E_3_SUFFIX_ONLY.
fba0: 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
fbb0: 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
fbc0: 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
fbd0: 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
fbe0: 69 6e 74 65 72 70 29 3b 20 7d 0a 65 78 74 65 72  interp); }.exter
fbf0: 6e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  n int Tclsqlite_
fc00: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
fc10: 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
fc20: 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
fc30: 74 65 72 70 29 3b 20 7d 0a 65 78 74 65 72 6e 20  terp); }.extern 
fc40: 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49  int Sqlite_SafeI
fc50: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
fc60: 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
fc70: 54 43 4c 5f 4f 4b 3b 20 7d 0a 65 78 74 65 72 6e  TCL_OK; }.extern
fc80: 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53   int Tclsqlite_S
fc90: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
fca0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
fcb0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65  urn TCL_OK; }.#e
fcc0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c  ndif..#ifdef TCL
fcd0: 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  SH./************
fce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd20: 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
fd30: 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73  at follows is us
fd40: 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e  ed to build stan
fd50: 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72  dalone TCL inter
fd60: 70 72 65 74 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a  preters.*/../*.*
fd70: 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
fd80: 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65  CLSH is one, the
fd90: 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68  n put in code th
fda0: 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d  is for the.** "m
fdb0: 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61  ain" routine tha
fdc0: 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a  t will initializ
fdd0: 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69  e Tcl and take i
fde0: 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61  nput from.** sta
fdf0: 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a  ndard input..*/.
fe00: 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61  #if TCLSH==1.sta
fe10: 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  tic char zMainlo
fe20: 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69  op[] =.  "set li
fe30: 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c  ne {}\n".  "whil
fe40: 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d  e {![eof stdin]}
fe50: 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24   {\n".    "if {$
fe60: 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  line!=\"\"} {\n"
fe70: 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
fe80: 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e  newline \"> \"\n
fe90: 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c  ".    "} else {\
fea0: 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d  n".      "puts -
feb0: 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22  nonewline \"% \"
fec0: 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20  \n".    "}\n".  
fed0: 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c    "flush stdout\
fee0: 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c  n".    "append l
fef0: 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d  ine [gets stdin]
ff00: 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e  \n".    "if {[in
ff10: 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e  fo complete $lin
ff20: 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  e]} {\n".      "
ff30: 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
ff40: 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65  vel #0 $line} re
ff50: 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  sult]} {\n".    
ff60: 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72      "puts stderr
ff70: 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c   \"Error: $resul
ff80: 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20  t\"\n".      "} 
ff90: 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21  elseif {$result!
ffa0: 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20  =\"\"} {\n".    
ffb0: 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c      "puts $resul
ffc0: 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22  t\n".      "}\n"
ffd0: 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65  .      "set line
ffe0: 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c   {}\n".    "} el
fff0: 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61  se {\n".      "a
10000 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e  ppend line \\n\n
10010 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d  ".    "}\n".  "}
10020 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  \n".;.#endif../*
10030 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f  .** If the macro
10040 20 54 43 4c 53 48 20 69 73 20 74 77 6f 2c 20 74   TCLSH is two, t
10050 68 65 6e 20 67 65 74 20 74 68 65 20 6d 61 69 6e  hen get the main
10060 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f   loop code out o
10070 66 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74  f.** the separat
10080 65 20 66 69 6c 65 20 22 73 70 61 63 65 61 6e 61  e file "spaceana
10090 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66  l_tcl.h"..*/.#if
100a0 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63   TCLSH==2.static
100b0 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b   char zMainloop[
100c0 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73  ] = .#include "s
100d0 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a  paceanal_tcl.h".
100e0 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ;.#endif..#defin
100f0 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69  e TCLSH_MAIN mai
10100 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f  n   /* Needed to
10110 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61   fake out mktcla
10120 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f  pp */.int TCLSH_
10130 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63  MAIN(int argc, c
10140 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54  har **argv){.  T
10150 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10160 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65  p;.  Tcl_FindExe
10170 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29  cutable(argv[0])
10180 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c  ;.  interp = Tcl
10190 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b  _CreateInterp();
101a0 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  .  Sqlite3_Init(
101b0 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20  interp);.#ifdef 
101c0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a  SQLITE_TEST.  {.
101d0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
101e0 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
101f0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10200 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
10210 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63  itetest2_Init(Tc
10220 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10230 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10240 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f  etest3_Init(Tcl_
10250 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
10260 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
10270 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est4_Init(Tcl_In
10280 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
10290 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
102a0 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t5_Init(Tcl_Inte
102b0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
102c0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36   int Sqlitetest6
102d0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
102e0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
102f0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49  nt Sqlitetest7_I
10300 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10310 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10320 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69   Sqlitetest8_Ini
10330 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10340 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 4d      extern int M
10350 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  d5_Init(Tcl_Inte
10360 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
10370 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73   int Sqlitetests
10380 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  se_Init(Tcl_Inte
10390 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
103a0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61   int Sqlitetesta
103b0 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  sync_Init(Tcl_In
103c0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
103d0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
103e0 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c  ttclvar_Init(Tcl
103f0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
10400 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
10410 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28  testschema_Init(
10420 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20  Tcl_Interp*);.. 
10430 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49     Sqlitetest1_I
10440 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
10450 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
10460 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
10470 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
10480 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
10490 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e  itetest4_Init(in
104a0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
104b0 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65  etest5_Init(inte
104c0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
104d0 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70  est6_Init(interp
104e0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
104f0 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t7_Init(interp);
10500 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38  .    Sqlitetest8
10510 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
10520 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73 79     Sqlitetestasy
10530 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  nc_Init(interp);
10540 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 74  .    Sqlitetestt
10550 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65 72  clvar_Init(inter
10560 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
10570 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e  stschema_Init(in
10580 74 65 72 70 29 3b 0a 20 20 20 20 4d 64 35 5f 49  terp);.    Md5_I
10590 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66  nit(interp);.#if
105a0 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20  def SQLITE_SSE. 
105b0 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65     Sqlitetestsse
105c0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
105d0 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
105e0 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 7c  .  if( argc>=2 |
105f0 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20  | TCLSH==2 ){.  
10600 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c    int i;.    Tcl
10610 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
10620 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
10630 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
10640 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
10650 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
10660 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
10670 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  LY);.    for(i=3
10680 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20  -TCLSH; i<argc; 
10690 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
106a0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
106b0 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a  argv", argv[i],.
106c0 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c            TCL_GL
106d0 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
106e0 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
106f0 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
10700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10710 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f  TCLSH==1 && Tcl_
10720 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c  EvalFile(interp,
10730 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f   argv[1])!=TCL_O
10740 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  K ){.      const
10750 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54   char *zInfo = T
10760 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70  cl_GetVar(interp
10770 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54  , "errorInfo", T
10780 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
10790 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f  .      if( zInfo
107a0 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e  ==0 ) zInfo = in
107b0 74 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20  terp->result;.  
107c0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
107d0 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a  rr,"%s: %s\n", *
107e0 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20  argv, zInfo);.  
107f0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
10800 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72    }.  }.  if( ar
10810 67 63 3c 3d 31 20 7c 7c 20 54 43 4c 53 48 3d 3d  gc<=1 || TCLSH==
10820 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f  2 ){.    Tcl_Glo
10830 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  balEval(interp, 
10840 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a  zMainloop);.  }.
10850 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
10860 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f  ndif /* TCLSH */
10870 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ..#endif /* !def
10880 69 6e 65 64 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a  ined(NO_TCL) */.