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

Artifact 607ccf5ade808ed3620544baca42b13e3411bf6d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 74  ite.**.** $Id: t
01a0: 63 6c 73 71 6c 69 74 65 2e 63 2c 76 20 31 2e 31  clsqlite.c,v 1.1
01b0: 35 34 20 32 30 30 36 2f 30 33 2f 30 36 20 32 33  54 2006/03/06 23
01c0: 3a 33 30 3a 35 32 20 64 72 68 20 45 78 70 20 24  :30:52 drh Exp $
01d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54  .*/.#ifndef NO_T
01e0: 43 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74  CL     /* Omit t
01f0: 68 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69  his whole file i
0200: 66 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c  f TCL is unavail
0210: 61 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  able */..#includ
0220: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0230: 23 69 6e 63 6c 75 64 65 20 22 68 61 73 68 2e 68  #include "hash.h
0240: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
0250: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0260: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0270: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0280: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0290: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
02a0: 3e 0a 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f  >...#define NUM_
02b0: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31  PREPARED_STMTS 1
02c0: 30 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 52  0.#define MAX_PR
02d0: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30 30  EPARED_STMTS 100
02e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c 20 75  ../*.** If TCL u
02f0: 73 65 73 20 55 54 46 2d 38 20 61 6e 64 20 53 51  ses UTF-8 and SQ
0300: 4c 69 74 65 20 69 73 20 63 6f 6e 66 69 67 75 72  Lite is configur
0310: 65 64 20 74 6f 20 75 73 65 20 69 73 6f 38 38 35  ed to use iso885
0320: 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20 68 61  9, then we.** ha
0330: 76 65 20 74 6f 20 64 6f 20 61 20 74 72 61 6e 73  ve to do a trans
0340: 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f 69 6e  lation when goin
0350: 67 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  g between the tw
0360: 6f 2e 20 20 53 65 74 20 74 68 65 20 0a 2a 2a 20  o.  Set the .** 
0370: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
0380: 4e 45 45 44 45 44 20 6d 61 63 72 6f 20 74 6f 20  NEEDED macro to 
0390: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65  indicate that we
03a0: 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74   need to do.** t
03b0: 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e  his translation.
03c0: 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65    .*/.#if define
03d0: 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29 20 26  d(TCL_UTF_MAX) &
03e0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
03f0: 45 5f 55 54 46 38 29 0a 23 20 64 65 66 69 6e 65  E_UTF8).# define
0400: 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e   UTF_TRANSLATION
0410: 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e 64 69 66  _NEEDED 1.#endif
0420: 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c 20  ../*.** New SQL 
0430: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65  functions can be
0440: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
0450: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
0460: 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  uch function.** 
0470: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0480: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0490: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
04a0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
04b0: 65 66 20 73 74 72 75 63 74 20 53 71 6c 46 75 6e  ef struct SqlFun
04c0: 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72 75 63  c SqlFunc;.struc
04d0: 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20 54 63  t SqlFunc {.  Tc
04e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
04f0: 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69  ;   /* The TCL i
0500: 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65 63  nterpret to exec
0510: 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ute the function
0520: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
0530: 53 63 72 69 70 74 3b 20 20 20 20 20 2f 2a 20 54  Script;     /* T
0540: 68 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70 72 65  he Tcl_Obj repre
0550: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
0560: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74   script */.  int
0570: 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20   useEvalObjv;   
0580: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74     /* True if it
0590: 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20   is safe to use 
05a0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a  Tcl_EvalObjv */.
05b0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
05c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
05d0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
05e0: 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70   */.  SqlFunc *p
05f0: 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  Next;       /* N
0600: 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  ext function on 
0610: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  the list of them
0620: 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   all */.};../*.*
0630: 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  * New collation 
0640: 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69  sequences functi
0650: 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65  on can be create
0660: 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73  d as TCL scripts
0670: 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20  .  Each such.** 
0680: 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63  function is desc
0690: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
06a0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
06b0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
06c0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
06d0: 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71  ct SqlCollate Sq
06e0: 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74  lCollate;.struct
06f0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20   SqlCollate {.  
0700: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0710: 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  rp;   /* The TCL
0720: 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78   interpret to ex
0730: 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69  ecute the functi
0740: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  on */.  char *zS
0750: 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a  cript;        /*
0760: 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62   The script to b
0770: 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f  e run */.  SqlCo
0780: 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20  llate *pNext;   
0790: 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f   /* Next functio
07a0: 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  n on the list of
07b0: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a   them all */.};.
07c0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20  ./*.** Prepared 
07d0: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63  statements are c
07e0: 61 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72  ached for faster
07f0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63   execution.  Eac
0800: 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  h prepared.** st
0810: 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72  atement is descr
0820: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0830: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0840: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0850: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0860: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0870: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0880: 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65  t;.struct SqlPre
0890: 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71  paredStmt {.  Sq
08a0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
08b0: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
08c0: 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f  n linked list */
08d0: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
08e0: 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50  mt *pPrev;  /* P
08f0: 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c  revious on the l
0900: 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
0910: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
0920: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
0930: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
0940: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
0950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61            /* cha
0960: 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a  rs in zSql[] */.
0970: 20 20 63 68 61 72 20 7a 53 71 6c 5b 31 5d 3b 20    char zSql[1]; 
0980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
0990: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  xt of the SQL st
09a0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f  atement */.};../
09b0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
09c0: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
09d0: 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
09e0: 20 65 61 63 68 20 53 51 4c 69 74 65 20 64 61 74   each SQLite dat
09f0: 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20 68 61  abase.** that ha
0a00: 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
0a10: 20 74 68 65 20 53 51 4c 69 74 65 20 54 43 4c 20   the SQLite TCL 
0a20: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 74 79  interface..*/.ty
0a30: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0a40: 69 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a  iteDb SqliteDb;.
0a50: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
0a60: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0a80: 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74  * The "real" dat
0a90: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
0aa0: 20 4d 55 53 54 20 42 45 20 46 49 52 53 54 20 2a   MUST BE FIRST *
0ab0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
0ac0: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f  interp;        /
0ad0: 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65  * The interprete
0ae0: 72 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  r used for this 
0af0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
0b00: 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20  ar *zBusy;      
0b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0b20: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f  busy callback ro
0b30: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0b40: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
0b50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
0b60: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
0b70: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0b80: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0ba0: 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
0bb0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0bc0: 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20 20 20  r *zProfile;    
0bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0be0: 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20  rofile callback 
0bf0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0c00: 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20  r *zProgress;   
0c10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0c20: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
0c30: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0c40: 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20  ar *zAuth;      
0c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0c60: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
0c70: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0c80: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b  /.  char *zNull;
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0ca0: 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69  * Text to substi
0cb0: 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20  tute for an SQL 
0cc0: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
0cd0: 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20  SqlFunc *pFunc; 
0ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
0cf0: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
0d00: 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ons */.  Tcl_Obj
0d10: 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20   *pUpdateHook;  
0d20: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f      /* Update ho
0d30: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0d40: 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  y) */.  Tcl_Obj 
0d50: 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20  *pRollbackHook; 
0d60: 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68     /* Rollback h
0d70: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
0d80: 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ny) */.  SqlColl
0d90: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20  ate *pCollate;  
0da0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53      /* List of S
0db0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
0dc0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
0dd0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
0de0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
0df0: 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65   code of most re
0e00: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  cent sqlite3_exe
0e10: 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  c() */.  Tcl_Obj
0e20: 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64   *pCollateNeeded
0e30: 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e  ;   /* Collation
0e40: 20 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a   needed script *
0e50: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
0e60: 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f  tmt *stmtList; /
0e70: 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72  * List of prepar
0e80: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a  ed statements*/.
0e90: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0ea0: 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20  t *stmtLast; /* 
0eb0: 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69  Last statement i
0ec0: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0ed0: 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20  int maxStmt;    
0ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0ef0: 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e  e next maximum n
0f00: 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73  umber of stmtLis
0f10: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74  t */.  int nStmt
0f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0f30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
0f40: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d  tatements in stm
0f50: 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  tList */.};../*.
0f60: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73  ** Look at the s
0f70: 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20  cript prefix in 
0f80: 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62  pCmd.  We will b
0f90: 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
0fa0: 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72   script.** after
0fb0: 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67   first appending
0fc0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67   one or more arg
0fd0: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f  uments.  This ro
0fe0: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a  utine analyzes.*
0ff0: 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20  * the script to 
1000: 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66  see if it is saf
1010: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
1020: 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73  lObjv() on the s
1030: 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20  cript.** rather 
1040: 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65  than the more ge
1050: 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78  neral Tcl_EvalEx
1060: 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ().  Tcl_EvalObj
1070: 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66  v() is much.** f
1080: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72  aster..**.** Scr
1090: 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61  ipts that are sa
10a0: 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54  fe to use with T
10b0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f  cl_EvalObjv() co
10c0: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63  nsists of a.** c
10d0: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c  ommand name foll
10e0: 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20  owed by zero or 
10f0: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77  more arguments w
1100: 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20  ith no [...] or 
1110: 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72  $.** or {...} or
1120: 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e   ; to be seen an
1130: 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61  ywhere.  Most ca
1140: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63  llback scripts c
1150: 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73  onsist.** of jus
1160: 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  t a single proce
1170: 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  dure name and th
1180: 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71  ey meet this req
1190: 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  uirement..*/.sta
11a0: 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73  tic int safeToUs
11b0: 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e  eEvalObjv(Tcl_In
11c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
11d0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20  l_Obj *pCmd){.  
11e0: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20  /* We could try 
11f0: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
1200: 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29  with Tcl_Parse()
1210: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69  .  But we will i
1220: 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74  nstead.  ** just
1230: 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
1240: 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61   forbidden chara
1250: 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f  cters.  If any o
1260: 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a  f the forbidden.
1270: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
1280: 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20  appear in pCmd, 
1290: 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  we will report t
12a0: 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73  he string as uns
12b0: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  afe..  */.  cons
12c0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
12d0: 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65   n;.  z = Tcl_Ge
12e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
12f0: 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c  Cmd, &n);.  whil
1300: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
1310: 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29    int c = *(z++)
1320: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27  ;.    if( c=='$'
1330: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
1340: 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b  =';' ) return 0;
1350: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
1370: 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74  n SqlFunc struct
1380: 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ure with the giv
1390: 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65  en name.  Or cre
13a0: 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65  ate a new.** one
13b0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
13c0: 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  one cannot be fo
13d0: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  und.  Return a p
13e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
13f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1400: 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66  tatic SqlFunc *f
1410: 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74  indSqlFunc(Sqlit
1420: 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  eDb *pDb, const 
1430: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1440: 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65  SqlFunc *p, *pNe
1450: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e  w;.  int i;.  pN
1460: 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54  ew = (SqlFunc*)T
1470: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
1480: 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e  (*pNew) + strlen
1490: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20  (zName) + 1 );. 
14a0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28   pNew->zName = (
14b0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
14c0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65    for(i=0; zName
14d0: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d  [i]; i++){ pNew-
14e0: 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f  >zName[i] = tolo
14f0: 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d  wer(zName[i]); }
1500: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69  .  pNew->zName[i
1510: 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70  ] = 0;.  for(p=p
1520: 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d  Db->pFunc; p; p=
1530: 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20  p->pNext){ .    
1540: 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e  if( strcmp(p->zN
1550: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  ame, pNew->zName
1560: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
1570: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e  l_Free((char*)pN
1580: 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ew);.      retur
1590: 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n p;.    }.  }. 
15a0: 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20   pNew->interp = 
15b0: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70  pDb->interp;.  p
15c0: 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30  New->pScript = 0
15d0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
15e0: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
15f0: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65  pDb->pFunc = pNe
1600: 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  w;.  return pNew
1610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
1620: 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c  ize and free a l
1630: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
1640: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  statements.*/.st
1650: 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53  atic void flushS
1660: 74 6d 74 43 61 63 68 65 28 20 53 71 6c 69 74 65  tmtCache( Sqlite
1670: 44 62 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c  Db *pDb ){.  Sql
1680: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
1690: 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65  reStmt;..  while
16a0: 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  (  pDb->stmtList
16b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
16c0: 66 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73  finalize( pDb->s
16d0: 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29  tmtList->pStmt )
16e0: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d  ;.    pPreStmt =
16f0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a   pDb->stmtList;.
1700: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
1710: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
1720: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  t->pNext;.    Tc
1730: 6c 5f 46 72 65 65 28 20 28 63 68 61 72 2a 29 70  l_Free( (char*)p
1740: 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20  PreStmt );.  }. 
1750: 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b   pDb->nStmt = 0;
1760: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  .  pDb->stmtLast
1770: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1780: 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72  CL calls this pr
1790: 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20  ocedure when an 
17a0: 73 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65  sqlite3 database
17b0: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64   command is.** d
17c0: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
17d0: 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43  c void DbDeleteC
17e0: 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20  md(void *db){.  
17f0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
1800: 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20  (SqliteDb*)db;. 
1810: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
1820: 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pDb);.  sqlite3_
1830: 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a  close(pDb->db);.
1840: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46    while( pDb->pF
1850: 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75  unc ){.    SqlFu
1860: 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d  nc *pFunc = pDb-
1870: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d  >pFunc;.    pDb-
1880: 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e  >pFunc = pFunc->
1890: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44  pNext;.    Tcl_D
18a0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
18b0: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
18c0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
18d0: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
18e0: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
18f0: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
1900: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
1910: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
1920: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
1930: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
1940: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
1950: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
1960: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
1970: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
1980: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1990: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
19a0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
19b0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
19c0: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
19d0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
19e0: 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  le ){.    Tcl_Fr
19f0: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
1a00: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
1a10: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
1a20: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
1a30: 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
1a40: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
1a50: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1a60: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Null);.  }.  if(
1a70: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
1a80: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
1a90: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
1aa0: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d  UpdateHook);.  }
1ab0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c  .  if( pDb->pRol
1ac0: 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20  lbackHook ){.   
1ad0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1ae0: 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  t(pDb->pRollback
1af0: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
1b00: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
1b10: 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f  eded ){.    Tcl_
1b20: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
1b30: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
1b40: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65  );.  }.  Tcl_Fre
1b50: 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d  e((char*)pDb);.}
1b60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1b70: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
1b80: 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  hen a database f
1b90: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68  ile is locked wh
1ba0: 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
1bb0: 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f   execute SQL..*/
1bc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75  .static int DbBu
1bd0: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
1be0: 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b  cd, int nTries){
1bf0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1c00: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
1c10: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
1c20: 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20  ar zVal[30];..  
1c30: 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22 25  sprintf(zVal, "%
1c40: 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72  d", nTries);.  r
1c50: 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28  c = Tcl_VarEval(
1c60: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
1c70: 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56  ->zBusy, " ", zV
1c80: 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  al, (char*)0);. 
1c90: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
1ca0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
1cb0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
1cc0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
1cd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1cf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d00: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74   is invoked as t
1d10: 68 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c  he 'progress cal
1d20: 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64  lback' for the d
1d30: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1d40: 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73  ic int DbProgres
1d50: 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  sHandler(void *c
1d60: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
1d70: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
1d80: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
1d90: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a    assert( pDb->z
1da0: 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63  Progress );.  rc
1db0: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
1dc0: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  >interp, pDb->zP
1dd0: 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20  rogress);.  if( 
1de0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
1df0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
1e00: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
1e10: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
1e20: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
1e30: 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 0;.}..#ifndef
1e40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1e50: 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CE./*.** This ro
1e60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1e70: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 74 72  by the SQLite tr
1e80: 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  ace handler when
1e90: 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c  ever a new.** bl
1ea0: 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78  ock of SQL is ex
1eb0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c  ecuted.  The TCL
1ec0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
1ed0: 7a 54 72 61 63 65 20 69 73 20 65 78 65 63 75 74  zTrace is execut
1ee0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1ef0: 69 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  id DbTraceHandle
1f00: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
1f10: 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
1f20: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
1f30: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
1f40: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
1f50: 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r;..  Tcl_DStrin
1f60: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
1f70: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
1f80: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61  (&str, pDb->zTra
1f90: 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  ce, -1);.  Tcl_D
1fa0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1fb0: 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b  ent(&str, zSql);
1fc0: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
1fd0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
1fe0: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
1ff0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2000: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
2010: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
2020: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  ->interp);.}.#en
2030: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
2040: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
2050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2060: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
2070: 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c  he SQLite profil
2080: 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20  e handler after 
2090: 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53  a statement.** S
20a0: 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64 2e  QL has executed.
20b0: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
20c0: 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c   in pDb->zProfil
20d0: 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  e is evaluated..
20e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
20f0: 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28  bProfileHandler(
2100: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
2110: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69  char *zSql, sqli
2120: 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20  te_uint64 tm){. 
2130: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
2140: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
2150: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
2160: 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30  r;.  char zTm[10
2170: 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  0];..  sqlite3_s
2180: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2190: 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c  Tm)-1, zTm, "%ll
21a0: 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44  d", tm);.  Tcl_D
21b0: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
21c0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
21d0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
21e0: 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a  >zProfile, -1);.
21f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
2200: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
2210: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53   zSql);.  Tcl_DS
2220: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
2230: 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20  nt(&str, zTm);. 
2240: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
2250: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
2260: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
2270: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
2280: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
2290: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
22a0: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
22b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
22c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
22d0: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
22e0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
22f0: 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72    The.** TCL scr
2300: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d  ipt in pDb->zCom
2310: 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  mit is executed.
2320: 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20    If it returns 
2330: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69  non-zero or.** i
2340: 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65  f it throws an e
2350: 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72  xception, the tr
2360: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
2370: 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64  led back instead
2380: 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d  .** of being com
2390: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mitted..*/.stati
23a0: 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61  c int DbCommitHa
23b0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
23c0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
23d0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
23e0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
23f0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
2400: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
2410: 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
2420: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
2430: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
2440: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
2450: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
2460: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2470: 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n 0;.}..static v
2480: 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61  oid DbRollbackHa
2490: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65  ndler(void *clie
24a0: 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74  ntData){.  Sqlit
24b0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
24c0: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
24d0: 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e  ;.  assert(pDb->
24e0: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
24f0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
2500: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
2510: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52  >interp, pDb->pR
2520: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20  ollbackHook, 0) 
2530: 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67  ){.    Tcl_Backg
2540: 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e  roundError(pDb->
2550: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  interp);.  }.}..
2560: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70  static void DbUp
2570: 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76  dateHandler(.  v
2580: 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f  oid *p, .  int o
2590: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
25a0: 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *zDb, .  const c
25b0: 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71  har *zTbl, .  sq
25c0: 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64  lite_int64 rowid
25d0: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
25e0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
25f0: 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  *)p;.  Tcl_Obj *
2600: 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pCmd;..  assert(
2610: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
2620: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  k );.  assert( o
2630: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  p==SQLITE_INSERT
2640: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55   || op==SQLITE_U
2650: 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c  PDATE || op==SQL
2660: 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20  ITE_DELETE );.. 
2670: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c   pCmd = Tcl_Dupl
2680: 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55  icateObj(pDb->pU
2690: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63  pdateHook);.  Tc
26a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
26b0: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
26c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
26d0: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
26e0: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20  wStringObj(.    
26f0: 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  ( (op==SQLITE_IN
2700: 53 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28  SERT)?"INSERT":(
2710: 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54  op==SQLITE_UPDAT
2720: 45 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c  E)?"UPDATE":"DEL
2730: 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54  ETE"), -1));.  T
2740: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2750: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
2760: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2770: 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54  j(zDb, -1));.  T
2780: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2790: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
27a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
27b0: 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20  j(zTbl, -1));.  
27c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27d0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
27e0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
27f0: 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54  Obj(rowid));.  T
2800: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
2810: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
2820: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
2830: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2840: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
2850: 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  d(.  void *pCtx,
2860: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
2870: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e    int enc,.  con
2880: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
2890: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
28a0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
28b0: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
28c0: 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  *pScript = Tcl_D
28d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
28e0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
28f0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
2900: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
2910: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2920: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
2930: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
2940: 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31  ingObj(zName, -1
2950: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
2960: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
2970: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
2980: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2990: 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a  (pScript);.}../*
29a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
29c0: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f  aluate an SQL co
29d0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
29e0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
29f0: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
2a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a10: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20  tclSqlCollate(. 
2a20: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
2a30: 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nA,.  const v
2a40: 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
2a50: 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  B,.  const void 
2a60: 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c  *zB.){.  SqlColl
2a70: 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c  ate *p = (SqlCol
2a80: 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54  late *)pCtx;.  T
2a90: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
2aa0: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53   pCmd = Tcl_NewS
2ab0: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72  tringObj(p->zScr
2ac0: 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ipt, -1);.  Tcl_
2ad0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
2ae0: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
2af0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
2b00: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
2b10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2b20: 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c  (zA, nA));.  Tcl
2b30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2b40: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
2b50: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
2b60: 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29  ringObj(zB, nB))
2b70: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
2b80: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
2b90: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
2ba0: 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
2bb0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
2bc0: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
2bd0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
2be0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
2bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2c00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2c10: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
2c20: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
2c30: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
2c40: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
2c50: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
2c60: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
2c70: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2c80: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
2c90: 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b  e3_value**argv){
2ca0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20  .  SqlFunc *p = 
2cb0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
2cc0: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63  a(context);.  Tc
2cd0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69  l_Obj *pCmd;.  i
2ce0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
2cf0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
2d00: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
2d10: 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e  e are no argumen
2d20: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
2d30: 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  on, call Tcl_Eva
2d40: 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20  lObjEx on the.  
2d50: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
2d60: 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ct directly.  Th
2d70: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43  is allows the TC
2d80: 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65  L compiler to ge
2d90: 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79  nerate.    ** by
2da0: 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63  tecode for the c
2db0: 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69  ommand on the fi
2dc0: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
2dd0: 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20  nd thus make.   
2de0: 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69   ** subsequent i
2df0: 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20  nvocations much 
2e00: 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70  faster. */.    p
2e10: 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74  Cmd = p->pScript
2e20: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
2e30: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
2e40: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
2e50: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
2e60: 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63  pCmd, 0);.    Tc
2e70: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
2e80: 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
2e90: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
2ea0: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  re arguments to 
2eb0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  the function, ma
2ec0: 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70  ke a shallow cop
2ed0: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
2ee0: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c  script object, l
2ef0: 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d  append the argum
2f00: 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75  ents, then evalu
2f10: 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ate the copy..  
2f20: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22    **.    ** By "
2f30: 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77  shallow" copy, w
2f40: 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68  e mean a only th
2f50: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
2f60: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
2f70: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
2f80: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
2f90: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
2fa0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
2fb0: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
2fc0: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
2fd0: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
2fe0: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
2ff0: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
3000: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
3010: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
3020: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
3030: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
3040: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
3050: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
3060: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
3070: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
3080: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
3090: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
30a0: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
30b0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
30c0: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
30d0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
30e0: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
30f0: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
3100: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
3110: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
3120: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
3130: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
3140: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
3150: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
3160: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
3170: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
3180: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
3190: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
31a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
31b0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
31c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
31d0: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
31e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
31f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
3200: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
3210: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
3220: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
3230: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
3240: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
3250: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
3260: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
3270: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
3280: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
3290: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
32a0: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
32b0: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
32c0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
32d0: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
32e0: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
32f0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
3300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3310: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
3320: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
3330: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3340: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
3350: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
3360: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
3370: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
3380: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
3390: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
33a0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
33b0: 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  wIntObj(v);.    
33c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33d0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
33e0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
33f0: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
3400: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
3410: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
3420: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
3430: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
3440: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
3450: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
3460: 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  ble(pIn);.      
3470: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
3480: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a  ewDoubleObj(r);.
3490: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
34a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
34c0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
34d0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
34e0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b  tringObj("", 0);
34f0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
3500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3510: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
3520: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
3530: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
3540: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
3550: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
3560: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3570: 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  ((char *)sqlite3
3580: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29  _value_text(pIn)
3590: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
35a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
35b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35c0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74     rc = Tcl_List
35d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
35e0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
35f0: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  , pVal);.      i
3600: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
3610: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3620: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20  t(pCmd);.       
3630: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3640: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
3650: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
3660: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
3670: 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74  1); .        ret
3680: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
3690: 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75   }.    if( !p->u
36a0: 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20  seEvalObjv ){.  
36b0: 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f      /* Tcl_EvalO
36c0: 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f  bjEx() will auto
36d0: 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54  matically call T
36e0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66  cl_EvalObjv() if
36f0: 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69   pCmd.      ** i
3700: 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74  s a list without
3710: 20 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73   a string repres
3720: 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72  entation.  To pr
3730: 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a  event this from.
3740: 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69        ** happeni
3750: 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43  ng, make sure pC
3760: 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73  md has a valid s
3770: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
3780: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63  tion */.      Tc
3790: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64  l_GetString(pCmd
37a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
37b0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
37c0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
37d0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
37e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
37f0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
3800: 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20   }..  if( rc && 
3810: 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29  rc!=TCL_RETURN )
3820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
3830: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
3840: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
3850: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
3860: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73  p), -1); .  }els
3870: 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  e{.    Tcl_Obj *
3880: 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62  pVar = Tcl_GetOb
3890: 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  jResult(p->inter
38a0: 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  p);.    int n;. 
38b0: 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20     u8 *data;.   
38c0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70   char *zType = p
38d0: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
38e0: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
38f0: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61  me : "";.    cha
3900: 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a  r c = zType[0];.
3910: 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26      if( c=='b' &
3920: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
3930: 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26  bytearray")==0 &
3940: 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30  & pVar->bytes==0
3950: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   ){.      /* Onl
3960: 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20  y return a BLOB 
3970: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
3980: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
3990: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
39a0: 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69    ** has no stri
39b0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
39c0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61  n. */.      data
39d0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
39e0: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
39f0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
3a00: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
3a10: 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e  context, data, n
3a20: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
3a30: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
3a40: 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74  f( (c=='b' && st
3a50: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
3a60: 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  ean")==0) ||.   
3a70: 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26         (c=='i' &
3a80: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
3a90: 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20  int")==0) ){.   
3aa0: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
3ab0: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e  mObj(0, pVar, &n
3ac0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3ad0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
3ae0: 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  ext, n);.    }el
3af0: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
3b00: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
3b10: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
3b20: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
3b30: 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c      Tcl_GetDoubl
3b40: 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72  eFromObj(0, pVar
3b50: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &r);.      sql
3b60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
3b70: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a  le(context, r);.
3b80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
3b90: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
3ba0: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
3bb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
3bc0: 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20  WideInt v;.     
3bd0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
3be0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
3bf0: 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &v);.      sqlit
3c00: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
3c10: 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20  context, v);.   
3c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61   }else{.      da
3c30: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
3c40: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
3c50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
3c60: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
3c70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
3c80: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a  context, (char *
3c90: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
3ca0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
3cb0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
3cc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
3cd0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  THORIZATION./*.*
3ce0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75  * This is the au
3cf0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e  thentication fun
3d00: 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e  ction.  It appen
3d10: 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  ds the authentic
3d20: 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f  ation.** type co
3d30: 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61  de and the two a
3d40: 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64  rguments to zCmd
3d50: 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20  [] then invokes 
3d60: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e  the result.** on
3d70: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
3d80: 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20  .  The reply is 
3d90: 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65  examined to dete
3da0: 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20  rmine if the.** 
3db0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
3dc0: 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73  ails or succeeds
3dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3de0: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  auth_callback(. 
3df0: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
3e00: 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74  nt code,.  const
3e10: 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20   char *zArg1,.  
3e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
3e30: 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2,.  const char 
3e40: 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20  *zArg3,.  const 
3e50: 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20  char *zArg4.){. 
3e60: 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20   char *zCode;.  
3e70: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
3e80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
3e90: 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b  st char *zReply;
3ea0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3eb0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41   = (SqliteDb*)pA
3ec0: 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63  rg;..  switch( c
3ed0: 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
3ee0: 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20  SQLITE_COPY     
3ef0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
3f00: 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20  ="SQLITE_COPY"; 
3f10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3f20: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
3f30: 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  DEX      : zCode
3f40: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
3f50: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
3f60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3f70: 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20  REATE_TABLE     
3f80: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3f90: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20  _CREATE_TABLE"; 
3fa0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3fb0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
3fc0: 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65  MP_INDEX : zCode
3fd0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
3fe0: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
3ff0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4000: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
4010: 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53  TABLE : zCode="S
4020: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
4030: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
4040: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4050: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
4060: 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GGER: zCode="SQL
4070: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
4080: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
4090: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
40a0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
40b0: 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  W  : zCode="SQLI
40c0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
40d0: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
40e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
40f0: 41 54 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a  ATE_TRIGGER    :
4100: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
4110: 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20  REATE_TRIGGER"; 
4120: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4130: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
4140: 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  EW       : zCode
4150: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
4160: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
4170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
4180: 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20  LETE            
4190: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
41a0: 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a  DELETE"; break;.
41b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
41c0: 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20  DROP_INDEX      
41d0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
41e0: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62  E_DROP_INDEX"; b
41f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
4200: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
4210: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4220: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42  "SQLITE_DROP_TAB
4230: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
4240: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
4250: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20  _TEMP_INDEX   : 
4260: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
4270: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20  OP_TEMP_INDEX"; 
4280: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4290: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
42a0: 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65  _TABLE   : zCode
42b0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
42c0: 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  MP_TABLE"; break
42d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
42e0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
42f0: 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GER : zCode="SQL
4300: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
4310: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
4320: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
4330: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20  ROP_TEMP_VIEW   
4340: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4350: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22  _DROP_TEMP_VIEW"
4360: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4370: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  e SQLITE_DROP_TR
4380: 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f  IGGER      : zCo
4390: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
43a0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
43b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
43c0: 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20  _DROP_VIEW      
43d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
43e0: 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62  TE_DROP_VIEW"; b
43f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
4400: 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20  QLITE_INSERT    
4410: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4420: 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b  "SQLITE_INSERT";
4430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4440: 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20   SQLITE_PRAGMA  
4450: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4460: 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e="SQLITE_PRAGMA
4470: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4480: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20  se SQLITE_READ  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
44a0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44  ode="SQLITE_READ
44b0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
44c0: 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  se SQLITE_SELECT
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
44e0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45  ode="SQLITE_SELE
44f0: 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CT"; break;.    
4500: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e  case SQLITE_TRAN
4510: 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20  SACTION       : 
4520: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52  zCode="SQLITE_TR
4530: 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61  ANSACTION"; brea
4540: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4550: 54 45 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  TE_UPDATE       
4560: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
4570: 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72  LITE_UPDATE"; br
4580: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4590: 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20 20 20  LITE_ATTACH     
45a0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
45b0: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20  SQLITE_ATTACH"; 
45c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
45d0: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20  SQLITE_DETACH   
45e0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
45f0: 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22  ="SQLITE_DETACH"
4600: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4610: 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  e SQLITE_ALTER_T
4620: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
4630: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52  de="SQLITE_ALTER
4640: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
4650: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4660: 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
4670: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
4680: 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61  E_REINDEX"; brea
4690: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
46a0: 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20  TE_ANALYZE      
46b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
46c0: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62  LITE_ANALYZE"; b
46d0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
46e0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
46f0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4700: 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20  "????"; break;. 
4710: 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67   }.  Tcl_DString
4720: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
4730: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
4740: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68  &str, pDb->zAuth
4750: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
4760: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4770: 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a  t(&str, zCode);.
4780: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4790: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
47a0: 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a   zArg1 ? zArg1 :
47b0: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
47c0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
47d0: 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a  (&str, zArg2 ? z
47e0: 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg2 : "");.  Tc
47f0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
4800: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
4810: 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29  g3 ? zArg3 : "")
4820: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
4830: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
4840: 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34  r, zArg4 ? zArg4
4850: 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54   : "");.  rc = T
4860: 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44  cl_GlobalEval(pD
4870: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
4880: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
4890: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
48a0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a  gFree(&str);.  z
48b0: 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53  Reply = Tcl_GetS
48c0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
48d0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  >interp);.  if( 
48e0: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
48f0: 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b  QLITE_OK")==0 ){
4900: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4910: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
4920: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
4930: 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30  SQLITE_DENY")==0
4940: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
4950: 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73  ITE_DENY;.  }els
4960: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
4970: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f  ply,"SQLITE_IGNO
4980: 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  RE")==0 ){.    r
4990: 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  c = SQLITE_IGNOR
49a0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
49b0: 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20  rc = 999;.  }.  
49c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
49d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
49e0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
49f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74   */../*.** zText
4a00: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4a10: 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76   text obtained v
4a20: 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65  ia an sqlite3_re
4a30: 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f  sult_text().** o
4a40: 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66  r similar interf
4a50: 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ace. This routin
4a60: 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20  e returns a Tcl 
4a70: 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a  string object, .
4a80: 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ** reference cou
4a90: 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e  nt set to 0, con
4aa0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74  taining the text
4ab0: 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69  . If a translati
4ac0: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73  on.** between is
4ad0: 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20  o8859 and UTF-8 
4ae0: 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20  is required, it 
4af0: 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f  is preformed..*/
4b00: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
4b10: 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61  *dbTextToObj(cha
4b20: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b  r const *zText){
4b30: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c  .  Tcl_Obj *pVal
4b40: 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41  ;.#ifdef UTF_TRA
4b50: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a  NSLATION_NEEDED.
4b60: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43    Tcl_DString dC
4b70: 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ol;.  Tcl_DStrin
4b80: 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20  gInit(&dCol);.  
4b90: 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74  Tcl_ExternalToUt
4ba0: 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a  fDString(NULL, z
4bb0: 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29  Text, -1, &dCol)
4bc0: 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e  ;.  pVal = Tcl_N
4bd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
4be0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43  DStringValue(&dC
4bf0: 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ol), -1);.  Tcl_
4c00: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f  DStringFree(&dCo
4c10: 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c  l);.#else.  pVal
4c20: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4c30: 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a  Obj(zText, -1);.
4c40: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
4c50: 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pVal;.}../*.** T
4c60: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
4c70: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
4c80: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
4c90: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
4ca0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
4cb0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
4cc0: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
4cd0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
4ce0: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
4cf0: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
4d00: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
4d10: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
4d20: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ls..**.** The in
4d30: 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20  terface is like 
4d40: 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e  "readline" but n
4d50: 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65  o command-line e
4d60: 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e  diting.** is don
4d70: 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20  e..**.** copied 
4d80: 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f  from shell.c fro
4d90: 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d  m '.import' comm
4da0: 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  and.*/.static ch
4db0: 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  ar *local_getlin
4dc0: 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c  e(char *zPrompt,
4dd0: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
4de0: 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74  ar *zLine;.  int
4df0: 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b   nLine;.  int n;
4e00: 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e  .  int eol;..  n
4e10: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
4e20: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
4e30: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
4e40: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
4e50: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c  ;.  n = 0;.  eol
4e60: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21   = 0;.  while( !
4e70: 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  eol ){.    if( n
4e80: 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20  +100>nLine ){.  
4e90: 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e      nLine = nLin
4ea0: 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20  e*2 + 100;.     
4eb0: 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63   zLine = realloc
4ec0: 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a  (zLine, nLine);.
4ed0: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d        if( zLine=
4ee0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4ef0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65     }.    if( fge
4f00: 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c  ts(&zLine[n], nL
4f10: 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20  ine - n, in)==0 
4f20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  ){.      if( n==
4f30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65  0 ){.        fre
4f40: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
4f50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4f60: 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b    }.      zLine[
4f70: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
4f80: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  l = 1;.      bre
4f90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  ak;.    }.    wh
4fa0: 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b  ile( zLine[n] ){
4fb0: 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   n++; }.    if( 
4fc0: 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31  n>0 && zLine[n-1
4fd0: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
4fe0: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   n--;.      zLin
4ff0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
5000: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  eol = 1;.    }. 
5010: 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61   }.  zLine = rea
5020: 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31  lloc( zLine, n+1
5030: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69   );.  return zLi
5040: 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ne;.}../*.** The
5050: 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
5060: 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20  d below creates 
5070: 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  a new Tcl comman
5080: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
5090: 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e  nnection it open
50a0: 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64  s to an SQLite d
50b0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
50c0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
50d0: 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e  d.** whenever on
50e0: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
50f0: 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63  ction-specific c
5100: 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75  ommands is execu
5110: 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20  ted.** in Tcl.  
5120: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
5130: 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65  you run Tcl code
5140: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
5150: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  *       sqlite3 
5160: 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73  db1  "my_databas
5170: 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20  e".**       db1 
5180: 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  close.**.** The 
5190: 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70  first command op
51a0: 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ens a connection
51b0: 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61   to the "my_data
51c0: 62 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a  base" database.*
51d0: 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74  * and calls that
51e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31   connection "db1
51f0: 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63  ".  The second c
5200: 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68  ommand causes th
5210: 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  is.** subroutine
5220: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a   to be invoked..
5230: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
5240: 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c  ObjCmd(void *cd,
5250: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5260: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
5270: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
5280: 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
5290: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
52a0: 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63  )cd;.  int choic
52b0: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43  e;.  int rc = TC
52c0: 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63  L_OK;.  static c
52d0: 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74  onst char *DB_st
52e0: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75  rs[] = {.    "au
52f0: 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20  thorizer",      
5300: 20 20 20 22 62 75 73 79 22 2c 20 20 20 20 20 20     "busy",      
5310: 20 20 20 20 20 20 20 20 22 63 61 63 68 65 22 2c          "cache",
5320: 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20  .    "changes", 
5330: 20 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73             "clos
5340: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5350: 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20 20 22  "collate",.    "
5360: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
5370: 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f  ",   "commit_hoo
5380: 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d 70 6c  k",       "compl
5390: 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70 79 22  ete",.    "copy"
53a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
53b0: 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20  "errorcode",    
53c0: 20 20 20 20 20 22 65 76 61 6c 22 2c 0a 20 20 20       "eval",.   
53d0: 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20 20   "exists",      
53e0: 20 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e         "function
53f0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 6c 61 73  ",          "las
5400: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
5410: 0a 20 20 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22  .    "nullvalue"
5420: 2c 20 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63  ,          "onec
5430: 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20  olumn",         
5440: 22 70 72 6f 66 69 6c 65 22 2c 0a 20 20 20 20 22  "profile",.    "
5450: 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20  progress",      
5460: 20 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20       "rekey",   
5470: 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c 62            "rollb
5480: 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22  ack_hook",.    "
5490: 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
54a0: 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e       "total_chan
54b0: 67 65 73 22 2c 20 20 20 20 20 22 74 72 61 63 65  ges",     "trace
54c0: 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61 63 74  ",.    "transact
54d0: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22 75 70  ion",        "up
54e0: 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  date_hook",     
54f0: 20 20 22 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20    "version",.   
5500: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5510: 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e        .  };.  en
5520: 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20  um DB_enum {.   
5530: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20   DB_AUTHORIZER, 
5540: 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 20         DB_BUSY, 
5550: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
5560: 41 43 48 45 2c 0a 20 20 20 20 44 42 5f 43 48 41  ACHE,.    DB_CHA
5570: 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 20  NGES,           
5580: 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 20  DB_CLOSE,       
5590: 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c       DB_COLLATE,
55a0: 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  .    DB_COLLATIO
55b0: 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42 5f 43 4f  N_NEEDED,  DB_CO
55c0: 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20  MMIT_HOOK,      
55d0: 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20  DB_COMPLETE,.   
55e0: 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20   DB_COPY,       
55f0: 20 20 20 20 20 20 20 44 42 5f 45 52 52 4f 52 43         DB_ERRORC
5600: 4f 44 45 2c 20 20 20 20 20 20 20 20 44 42 5f 45  ODE,        DB_E
5610: 56 41 4c 2c 0a 20 20 20 20 44 42 5f 45 58 49 53  VAL,.    DB_EXIS
5620: 54 53 2c 20 20 20 20 20 20 20 20 20 20 20 20 44  TS,            D
5630: 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20  B_FUNCTION,     
5640: 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45      DB_LAST_INSE
5650: 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44 42  RT_ROWID,.    DB
5660: 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20 20  _NULLVALUE,     
5670: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
5680: 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f 46  ,        DB_PROF
5690: 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f 47  ILE,.    DB_PROG
56a0: 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 20 44  RESS,          D
56b0: 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20 20  B_REKEY,        
56c0: 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f      DB_ROLLBACK_
56d0: 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54 49 4d  HOOK,.    DB_TIM
56e0: 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 20  EOUT,           
56f0: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
5700: 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a 20  ,    DB_TRACE,. 
5710: 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f     DB_TRANSACTIO
5720: 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50 44 41  N,       DB_UPDA
5730: 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42  TE_HOOK,      DB
5740: 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20 20  _VERSION.  };.  
5750: 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74  /* don't leave t
5760: 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f  railing commas o
5770: 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f  n DB_enum, it co
5780: 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78  nfuses the AIX x
5790: 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a  lc compiler */..
57a0: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
57b0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
57c0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
57d0: 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e  objv, "SUBCOMMAN
57e0: 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74  D ...");.    ret
57f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5800: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
5810: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
5820: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42  erp, objv[1], DB
5830: 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  _strs, "option",
5840: 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a   0, &choice) ){.
5850: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5860: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  RROR;.  }..  swi
5870: 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e  tch( (enum DB_en
5880: 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20  um)choice ){..  
5890: 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72  /*    $db author
58a0: 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  izer ?CALLBACK?.
58b0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
58c0: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
58d0: 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65  ack to authorize
58e0: 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74   each SQL operat
58f0: 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a  ion as it is.  *
5900: 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61  * compiled.  5 a
5910: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70  rguments are app
5920: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c  ended to the cal
5930: 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20  lback before it 
5940: 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a  is.  ** invoked:
5950: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29  .  **.  **   (1)
5960: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
5970: 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c  on type (ex: SQL
5980: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5990: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
59a0: 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29   ...).  **   (2)
59b0: 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69   First descripti
59c0: 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73  ve name (depends
59d0: 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   on authorizatio
59e0: 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28  n type).  **   (
59f0: 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69  3) Second descri
5a00: 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20  ptive name.  ** 
5a10: 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68    (4) Name of th
5a20: 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20  e database (ex: 
5a30: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a  "main", "temp").
5a40: 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20    **   (5) Name 
5a50: 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20  of trigger that 
5a60: 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63  is doing the acc
5a70: 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ess.  **.  ** Th
5a80: 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c  e callback shoul
5a90: 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74  d return on of t
5aa0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5ab0: 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c  ings: SQLITE_OK,
5ac0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e  .  ** SQLITE_IGN
5ad0: 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44  ORE, or SQLITE_D
5ae0: 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ENY.  Any other 
5af0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
5b00: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20  an error..  **. 
5b10: 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68   ** If this meth
5b20: 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  od is invoked wi
5b30: 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c  th no arguments,
5b40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74   the current aut
5b50: 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  horization.  ** 
5b60: 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20  callback string 
5b70: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
5b80: 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48  /.  case DB_AUTH
5b90: 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66  ORIZER: {.#ifdef
5ba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5bb0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54  HORIZATION.    T
5bc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5bd0: 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69  interp, "authori
5be0: 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c  zation not avail
5bf0: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
5c00: 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ld", 0);.    ret
5c10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
5c20: 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a  else.    if( obj
5c30: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
5c40: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
5c50: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
5c60: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
5c70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5c80: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
5c90: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
5ca0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
5cb0: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
5cc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5cd0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75  interp, pDb->zAu
5ce0: 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  th, 0);.      }.
5cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d00: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20   char *zAuth;.  
5d10: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
5d20: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
5d30: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
5d40: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
5d50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5d60: 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74   zAuth = Tcl_Get
5d70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
5d80: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
5d90: 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26      if( zAuth &&
5da0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
5db0: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54    pDb->zAuth = T
5dc0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
5dd0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
5de0: 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20  cpy(pDb->zAuth, 
5df0: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 65  zAuth);.      }e
5e00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
5e10: 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->zAuth = 0;.   
5e20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5e30: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
5e40: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
5e50: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
5e60: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
5e70: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
5e80: 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  b, auth_callback
5e90: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
5ea0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5eb0: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
5ec0: 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  zer(pDb->db, 0, 
5ed0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
5ee0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
5ef0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
5f00: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
5f10: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
5f20: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
5f30: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
5f40: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
5f50: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
5f60: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
5f70: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
5f80: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
5f90: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
5fa0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
5fb0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5fc0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
5fd0: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
5fe0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5ff0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
6000: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
6010: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
6020: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
6030: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6040: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30  p, pDb->zBusy, 0
6050: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
6070: 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69   *zBusy;.      i
6080: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
6090: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
60a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
60b0: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
60c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73      }.      zBus
60d0: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
60e0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
60f0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
6100: 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e  f( zBusy && len>
6110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
6120: 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c  ->zBusy = Tcl_Al
6130: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
6140: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
6150: 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79  Db->zBusy, zBusy
6160: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6170: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
6180: 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sy = 0;.      }.
6190: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
61a0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
61b0: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
61c0: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
61d0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
61e0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75  er(pDb->db, DbBu
61f0: 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  syHandler, pDb);
6200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
6220: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
6230: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
6240: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
6250: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
6260: 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73    $db cache flus
6270: 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  h.  **     $db c
6280: 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a  ache size n.  **
6290: 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  .  ** Flush the 
62a0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
62b0: 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74  nt cache, or set
62c0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
62d0: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68  ber of.  ** cach
62e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
62f0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41   */.  case DB_CA
6300: 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  CHE: {.    char 
6310: 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74  *subCmd;.    int
6320: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   n;..    if( obj
6330: 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c<=2 ){.      Tc
6340: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6350: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
6360: 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61  "cache option ?a
6370: 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  rg?");.      ret
6380: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6390: 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20     }.    subCmd 
63a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
63b0: 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c  romObj( objv[2],
63c0: 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73   0 );.    if( *s
63d0: 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74  ubCmd=='f' && st
63e0: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75  rcmp(subCmd,"flu
63f0: 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sh")==0 ){.     
6400: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
6410: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
6420: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6430: 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68   2, objv, "flush
6440: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
6450: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6470: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
6480: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
6490: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
64a0: 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20  *subCmd=='s' && 
64b0: 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73  strcmp(subCmd,"s
64c0: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
64d0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
64e0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
64f0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6500: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65  , 2, objv, "size
6510: 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65   n");.        re
6520: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6530: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6540: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52       if( TCL_ERR
6550: 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OR==Tcl_GetIntFr
6560: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
6570: 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20  jv[3], &n) ){.  
6580: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
6590: 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
65a0: 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72  , "cannot conver
65b0: 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  t \"", .        
65c0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
65d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
65e0: 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69  [3],0), "\" to i
65f0: 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20  nteger", 0);.   
6600: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
6610: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
6620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6630: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
6640: 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74           flushSt
6650: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
6660: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
6670: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
6680: 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45  se if( n>MAX_PRE
6690: 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20  PARED_STMTS ){. 
66a0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d             n = M
66b0: 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
66c0: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  S;.          }. 
66d0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61           pDb->ma
66e0: 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20  xStmt = n;.     
66f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
6710: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
6720: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74  interp, "bad opt
6730: 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20  ion \"", .      
6740: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
6750: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
6760: 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62  ,0), "\": must b
6770: 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22  e flush or size"
6780: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
6790: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
67a0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
67b0: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62   }..  /*     $db
67c0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20   changes.  **.  
67d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
67e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
67f0: 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
6800: 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
6810: 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68  leted by.  ** th
6820: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e  e most recent IN
6830: 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
6840: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
6850: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  , not including 
6860: 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65  .  ** any change
6870: 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65  s made by trigge
6880: 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f  r programs..  */
6890: 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47  .  case DB_CHANG
68a0: 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
68b0: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
68c0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
68d0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
68e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
68f0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
6900: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6910: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
6920: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
6930: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
6940: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
6950: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
6960: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62  ite3_changes(pDb
6970: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
6980: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
6990: 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20  $db close.  **. 
69a0: 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65   ** Shutdown the
69b0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20   database.  */. 
69c0: 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20   case DB_CLOSE: 
69d0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  {.    Tcl_Delete
69e0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
69f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6a00: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
6a10: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
6a20: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
6a30: 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d   $db collate NAM
6a40: 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
6a50: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
6a60: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
6a70: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
6a80: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
6a90: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
6aa0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
6ab0: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
6ac0: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
6ad0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
6ae0: 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  DB_COLLATE: {.  
6af0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
6b00: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72  ollate;.    char
6b10: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
6b20: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
6b30: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
6b40: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
6b50: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6b60: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6b70: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
6b80: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
6b90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6ba0: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
6bb0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6bc0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
6bd0: 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
6be0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6bf0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
6c00: 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
6c10: 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f  Collate = (SqlCo
6c20: 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63  llate*)Tcl_Alloc
6c30: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61  ( sizeof(*pColla
6c40: 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20  te) + nScript + 
6c50: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  1 );.    if( pCo
6c60: 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72  llate==0 ) retur
6c70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6c80: 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72   pCollate->inter
6c90: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
6ca0: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20  pCollate->pNext 
6cb0: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
6cc0: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a  .    pCollate->z
6cd0: 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29  Script = (char*)
6ce0: 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20  &pCollate[1];.  
6cf0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
6d00: 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  = pCollate;.    
6d10: 73 74 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d  strcpy(pCollate-
6d20: 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70  >zScript, zScrip
6d30: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  t);.    if( sqli
6d40: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
6d50: 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
6d60: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
6d70: 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  , .        pColl
6d80: 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61  ate, tclSqlColla
6d90: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  te) ){.      Tcl
6da0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
6db0: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
6dc0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
6dd0: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
6de0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6df0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6e00: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6e10: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
6e20: 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  db collation_nee
6e30: 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ded SCRIPT.  **.
6e40: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
6e50: 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
6e60: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
6e70: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
6e80: 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
6e90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
6ea0: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
6eb0: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
6ec0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
6ed0: 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e  e DB_COLLATION_N
6ee0: 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28  EEDED: {.    if(
6ef0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
6f00: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6f10: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
6f20: 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
6f30: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6f40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6f50: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
6f60: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
6f70: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6f80: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
6f90: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  Needed);.    }. 
6fa0: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
6fb0: 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70  Needed = Tcl_Dup
6fc0: 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32  licateObj(objv[2
6fd0: 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  ]);.    Tcl_Incr
6fe0: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
6ff0: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
7000: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61     sqlite3_colla
7010: 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d  tion_needed(pDb-
7020: 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c  >db, pDb, tclCol
7030: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
7040: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
7050: 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f  *    $db commit_
7060: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  hook ?CALLBACK?.
7070: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
7080: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
7090: 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ack just before 
70a0: 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79  committing every
70b0: 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   SQL transaction
70c0: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
70d0: 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e  llback throws an
70e0: 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65   exception or re
70f0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
7100: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72  then the.  ** tr
7110: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f  ansaction is abo
7120: 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41  rted.  If CALLBA
7130: 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  CK is an empty s
7140: 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62  tring, the callb
7150: 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ack.  ** is disa
7160: 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  bled..  */.  cas
7170: 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b  e DB_COMMIT_HOOK
7180: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
7190: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
71a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
71b0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
71c0: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
71d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
71e0: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
71f0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
7200: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
7210: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
7220: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7230: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  (interp, pDb->zC
7240: 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  ommit, 0);.     
7250: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
7260: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
7270: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
7280: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
7290: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
72a0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
72b0: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
72c0: 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
72d0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
72e0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
72f0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
7300: 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
7310: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
7320: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
7330: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
7340: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
7350: 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
7360: 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   zCommit);.     
7370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7380: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
7390: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
73a0: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
73b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
73c0: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
73d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
73e0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
73f0: 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
7400: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
7410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7420: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
7430: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
7440: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
7450: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
7460: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
7470: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
7480: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
7490: 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
74a0: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
74b0: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
74c0: 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
74d0: 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
74e0: 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
74f0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
7500: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
7510: 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
7520: 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
7530: 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
7540: 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
7550: 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
7560: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
7570: 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
7580: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
7590: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
75a0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
75b0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
75c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
75d0: 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
75e0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
75f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
7600: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
7610: 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
7620: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7630: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
7640: 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
7650: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
7660: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
7670: 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
7680: 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
7690: 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
76a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
76b0: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
76c0: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
76d0: 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
76e0: 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
76f0: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
7700: 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
7710: 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
7720: 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
7730: 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
7740: 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
7750: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
7760: 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
7770: 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
7780: 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
7790: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
77a0: 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
77b0: 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
77c0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
77d0: 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
77e0: 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
77f0: 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
7800: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
7810: 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
7820: 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
7830: 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
7840: 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
7850: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
7860: 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
7870: 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
7880: 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
7890: 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
78a0: 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
78b0: 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
78c0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
78d0: 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
78e0: 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
78f0: 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
7900: 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
7910: 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
7920: 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
7930: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
7940: 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
7950: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
7960: 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
7970: 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
7980: 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
7990: 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
79a0: 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
79b0: 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
79c0: 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
79d0: 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
79e0: 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
79f0: 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
7a00: 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
7a10: 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
7a20: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
7a30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7a40: 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
7a50: 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
7a60: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
7a70: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
7a80: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
7a90: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
7aa0: 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
7ab0: 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
7ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7ad0: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
7ae0: 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
7af0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
7b00: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
7b10: 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
7b20: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  */.    int rc;  
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
7b50: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  e */.    int nCo
7b60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7b70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7b80: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
7b90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
7ba0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
7bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7bc0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
7bd0: 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f  an SQL string */
7be0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  .    int i, j;  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7c10: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
7c20: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
7c30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7c40: 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b  f bytes in zSep[
7c50: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75  ] */.    int nNu
7c60: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7c70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7c80: 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c  f bytes in zNull
7c90: 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  [] */.    char *
7ca0: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
7cb0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20        /* An SQL 
7cc0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
7cd0: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20   char *zLine;   
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7cf0: 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  A single line of
7d00: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
7d10: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
7d20: 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20   **azCol;       
7d30: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65          /* zLine
7d40: 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74  [] broken up int
7d50: 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  o columns */.   
7d60: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d80: 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68  How to commit ch
7d90: 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c  anges */.    FIL
7da0: 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
7db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7dc0: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
7dd0: 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30    int lineno = 0
7de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7df0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20   Line number of 
7e00: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
7e10: 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b    char zLineNum[
7e20: 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  80];          /*
7e30: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69   Line number pri
7e40: 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  nt buffer */.   
7e50: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
7e60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
7e70: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f  interp result */
7e80: 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70  ..    char *zSep
7e90: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c  ;.    char *zNul
7ea0: 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  l;.    if( objc<
7eb0: 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20  5 || objc>7 ){. 
7ec0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
7ed0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
7ee0: 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20   objv, .        
7ef0: 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52   "CONFLICT-ALGOR
7f00: 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e  ITHM TABLE FILEN
7f10: 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  AME ?SEPARATOR? 
7f20: 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22  ?NULLINDICATOR?"
7f30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7f40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7f50: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36  .    if( objc>=6
7f60: 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d   ){.      zSep =
7f70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
7f80: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30  omObj(objv[5], 0
7f90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7fa0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b      zSep = "\t";
7fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
7fc0: 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20  bjc>=7 ){.      
7fd0: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
7fe0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
7ff0: 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[6], 0);.    }e
8000: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  lse{.      zNull
8010: 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20   = "";.    }.   
8020: 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c   zConflict = Tcl
8030: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8040: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
8050: 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
8060: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8070: 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20  (objv[3], 0);.  
8080: 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
8090: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
80a0: 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[4], 0);.    
80b0: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53  nSep = strlen(zS
80c0: 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d  ep);.    nNull =
80d0: 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a   strlen(zNull);.
80e0: 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
80f0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
8100: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8110: 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75  , "Error: non-nu
8120: 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  ll separator req
8130: 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c  uired for copy",
8140: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
8150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8160: 20 7d 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65   }.    if(sqlite
8170: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
8180: 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20  ct, "rollback") 
8190: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
81a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
81b0: 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
81c0: 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
81d0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
81e0: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66  mp(zConflict, "f
81f0: 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26  ail"    ) != 0 &
8200: 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  &.       sqlite3
8210: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
8220: 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
8230: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
8240: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
8250: 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65  nflict, "replace
8260: 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20  " ) != 0 ) {.   
8270: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8280: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
8290: 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69  or: \"", zConfli
82a0: 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ct, .           
82b0: 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61   "\", conflict-a
82c0: 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65  lgorithm must be
82d0: 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63   one of: rollbac
82e0: 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  k, ".           
82f0: 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69   "abort, fail, i
8300: 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63  gnore, or replac
8310: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
8320: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8330: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
8340: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8350: 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
8360: 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  '%q'", zTable);.
8370: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
8380: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
8390: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
83a0: 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63  , "Error: no suc
83b0: 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62  h table: ", zTab
83c0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  le, 0);.      re
83d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
83e0: 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
83f0: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
8400: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8410: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
8420: 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d  , zSql, 0, &pStm
8430: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
8440: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
8450: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
8460: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8470: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
8480: 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
8490: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
84a0: 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
84b0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
84c0: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
84d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
84e0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
84f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
8500: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
8510: 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
8520: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8530: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8540: 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
8550: 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
8560: 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
8570: 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
8580: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8590: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
85a0: 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
85b0: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  )", 0);.      re
85c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
85d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
85e0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
85f0: 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +50, zSql, "INSE
8600: 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25  RT OR %q INTO '%
8610: 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20  q' VALUES(?",.  
8620: 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74         zConflict
8630: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
8640: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
8650: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
8660: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8670: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
8680: 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
8690: 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
86a0: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
86b0: 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
86c0: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
86d0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
86e0: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  Db->db, zSql, 0,
86f0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
8700: 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20   free(zSql);.   
8710: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
8720: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8730: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8740: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
8750: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
8760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8770: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
8780: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8790: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
87a0: 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46     in = fopen(zF
87b0: 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  ile, "rb");.    
87c0: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
87d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
87e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
87f0: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
8800: 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20  file: ", zFile, 
8810: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
8820: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8830: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
8840: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8850: 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20    }.    azCol = 
8860: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
8870: 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31  zCol[0])*(nCol+1
8880: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43  ) );.    if( azC
8890: 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ol==0 ) {.      
88a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
88b0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
88c0: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
88d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f  , 0);.      fclo
88e0: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65  se(in);.      re
88f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8900: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8910: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
8920: 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
8930: 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d  );.    zCommit =
8940: 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77   "COMMIT";.    w
8950: 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c  hile( (zLine = l
8960: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20  ocal_getline(0, 
8970: 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  in))!=0 ){.     
8980: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
8990: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e  i = 0;.      lin
89a0: 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43  eno++;.      azC
89b0: 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20  ol[0] = zLine;. 
89c0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d       for(i=0, z=
89d0: 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  zLine; *z; z++){
89e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d  .        if( *z=
89f0: 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e  =zSep[0] && strn
8a00: 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65  cmp(z, zSep, nSe
8a10: 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)==0 ){.       
8a20: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
8a30: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
8a40: 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29      if( i<nCol )
8a50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
8a60: 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70  Col[i] = &z[nSep
8a70: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ];.            z
8a80: 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20   += nSep-1;.    
8a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8aa0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8ab0: 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b  if( i+1!=nCol ){
8ac0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8ad0: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 7a 45 72  Err;.        zEr
8ae0: 72 20 3d 20 6d 61 6c 6c 6f 63 28 32 30 30 20 2b  r = malloc(200 +
8af0: 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 29 3b   strlen(zFile));
8b00: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
8b10: 28 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20  (zErr,.         
8b20: 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e    "Error: %s lin
8b30: 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
8b40: 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
8b50: 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c  a but found %d",
8b60: 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  .           zFil
8b70: 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c  e, lineno, nCol,
8b80: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 54   i+1);.        T
8b90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8ba0: 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29  interp, zErr, 0)
8bb0: 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a  ;.        free(z
8bc0: 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  Err);.        zC
8bd0: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
8be0: 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
8bf0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
8c00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
8c10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8c20: 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c  /* check for nul
8c30: 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62  l data, if so, b
8c40: 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20  ind as null */. 
8c50: 20 20 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c         if ((nNul
8c60: 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a  l>0 && strcmp(az
8c70: 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d  Col[i], zNull)==
8c80: 30 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43  0) || strlen(azC
8c90: 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20  ol[i])==0) {.   
8ca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
8cb0: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
8cc0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  i+1);.        }e
8cd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
8ce0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
8cf0: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43  (pStmt, i+1, azC
8d00: 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  ol[i], -1, SQLIT
8d10: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
8d20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8d30: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
8d40: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63  pStmt);.      rc
8d50: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
8d60: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66  (pStmt);.      f
8d70: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
8d80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8d90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
8da0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8db0: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22  interp,"Error: "
8dc0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
8dd0: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
8de0: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
8df0: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
8e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8e10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
8e20: 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66  ee(azCol);.    f
8e30: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73  close(in);.    s
8e40: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
8e50: 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
8e60: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
8e70: 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c  , zCommit, 0, 0,
8e80: 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43   0);..    if( zC
8e90: 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20  ommit[0] == 'C' 
8ea0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63  ){.      /* succ
8eb0: 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20  ess, set result 
8ec0: 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  as number of lin
8ed0: 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  es processed */.
8ee0: 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20        pResult = 
8ef0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
8f00: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  (interp);.      
8f10: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
8f20: 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  esult, lineno);.
8f30: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
8f40: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
8f50: 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20      /* failure, 
8f60: 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68  append lineno wh
8f70: 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ere failed */.  
8f80: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
8f90: 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f  eNum,"%d",lineno
8fa0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  );.      Tcl_App
8fb0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8fc0: 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65  ,", failed while
8fd0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65   processing line
8fe0: 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b  : ",zLineNum,0);
8ff0: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
9000: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9010: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
9020: 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72  *.  **    $db er
9030: 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a  rorcode.  **.  *
9040: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9050: 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20  eric error code 
9060: 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65  that was returne
9070: 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  d by the most re
9080: 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74  cent.  ** call t
9090: 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  o sqlite3_exec()
90a0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
90b0: 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20  _ERRORCODE: {.  
90c0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
90d0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
90e0: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
90f0: 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
9100: 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  )));.    break;.
9110: 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a    }.   .  /*.  *
9120: 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73  *    $db eval $s
9130: 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e  ql ?array? ?{  .
9140: 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a  ..code... }?.  *
9150: 2a 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75  *    $db onecolu
9160: 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a  mn $sql.  **.  *
9170: 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * The SQL statem
9180: 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65  ent in $sql is e
9190: 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65  valuated.  For e
91a0: 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c  ach row, the val
91b0: 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61  ues are.  ** pla
91c0: 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20  ced in elements 
91d0: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d  of the array nam
91e0: 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e  ed "array" and .
91f0: 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65  ..code... is exe
9200: 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22  cuted..  ** If "
9210: 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65  array" and "code
9220: 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74  " are omitted, t
9230: 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20  hen no callback 
9240: 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64  is every invoked
9250: 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
9260: 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  " is an empty st
9270: 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76  ring, then the v
9280: 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64  alues are placed
9290: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20   in variables.  
92a0: 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65  ** that have the
92b0: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
92c0: 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74  e fields extract
92d0: 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e  ed by the query.
92e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f  .  **.  ** The o
92f0: 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20  necolumn method 
9300: 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  is the equivalen
9310: 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c  t of:.  **     l
9320: 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20  index [$db eval 
9330: 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63  $sql] 0.  */.  c
9340: 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
9350: 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c  :.  case DB_EVAL
9360: 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53  :.  case DB_EXIS
9370: 54 53 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 63  TS: {.    char c
9380: 6f 6e 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20  onst *zSql;     
9390: 20 2f 2a 20 4e 65 78 74 20 53 51 4c 20 73 74 61   /* Next SQL sta
93a0: 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
93b0: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  e */.    char co
93c0: 6e 73 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20  nst *zLeft;     
93d0: 2f 2a 20 57 68 61 74 20 69 73 20 6c 65 66 74 20  /* What is left 
93e0: 61 66 74 65 72 20 66 69 72 73 74 20 73 74 6d 74  after first stmt
93f0: 20 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20   in zSql */.    
9400: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
9410: 74 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c  tmt;   /* Compil
9420: 65 64 20 53 51 4c 20 73 74 61 74 6d 65 6e 74 20  ed SQL statment 
9430: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
9440: 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 2f 2a  pArray;       /*
9450: 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 69   Name of array i
9460: 6e 74 6f 20 77 68 69 63 68 20 72 65 73 75 6c 74  nto which result
9470: 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 2a 2f  s are written */
9480: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
9490: 63 72 69 70 74 3b 20 20 20 20 20 20 2f 2a 20 53  cript;      /* S
94a0: 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72  cript to run for
94b0: 20 65 61 63 68 20 72 65 73 75 6c 74 20 73 65 74   each result set
94c0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
94d0: 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20 20 20 2f  **apParm;      /
94e0: 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 68 61  * Parameters tha
94f0: 74 20 6e 65 65 64 20 61 20 54 63 6c 5f 44 65 63  t need a Tcl_Dec
9500: 72 52 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20  rRefCount() */. 
9510: 20 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20     int nParm;   
9520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9530: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 75  ber of entries u
9540: 73 65 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20  sed in apParm[] 
9550: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
9560: 61 50 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a  aParm[10];    /*
9570: 20 53 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   Static space fo
9580: 72 20 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68  r apParm[] in th
9590: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
95a0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
95b0: 65 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56  et;         /* V
95c0: 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
95d0: 6e 65 64 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72  ned */.    SqlPr
95e0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
95f0: 53 74 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  Stmt;  /* Pointe
9600: 72 20 74 6f 20 61 20 70 72 65 70 61 72 65 64 20  r to a prepared 
9610: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
9620: 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 69   int rc2;..    i
9630: 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56  f( choice==DB_EV
9640: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
9650: 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35  objc<3 || objc>5
9660: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
9670: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9680: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
9690: 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20  QL ?ARRAY-NAME? 
96a0: 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
96b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
96c0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
96d0: 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e      pRet = Tcl_N
96e0: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
96f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
9700: 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRet);.    }else
9710: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
9720: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
9730: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9740: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
9750: 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 20   "SQL");.       
9760: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9770: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
9780: 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
9790: 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20  EXISTS ){.      
97a0: 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
97b0: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 30 29 3b 0a 20  BooleanObj(0);. 
97c0: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
97d0: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
97e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
97f0: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
9800: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9810: 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
9820: 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 53       pArray = pS
9830: 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d  cript = 0;.    }
9840: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
9850: 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79   ){.      pArray
9860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72   = 0;.      pScr
9870: 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ipt = objv[3];. 
9880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9890: 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d  pArray = objv[3]
98a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
98b0: 47 65 74 53 74 72 69 6e 67 28 70 41 72 72 61 79  GetString(pArray
98c0: 29 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72 61 79  )[0]==0 ) pArray
98d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72   = 0;.      pScr
98e0: 69 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20  ipt = objv[4];. 
98f0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e     }..    Tcl_In
9900: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b  crRefCount(objv[
9910: 32 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  2]);.    zSql = 
9920: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
9930: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
9940: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
9950: 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b  =TCL_OK && zSql[
9960: 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
9970: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9980: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
9990: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
99a0: 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
99b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
99c0: 6d 62 65 72 20 6f 66 20 62 69 6e 64 20 70 61 72  mber of bind par
99d0: 61 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20 70  ameters in the p
99e0: 53 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  Stmt */.      in
99f0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
9a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9a10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
9a20: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9a30: 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  */.      Tcl_Obj
9a40: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30   **apColName = 0
9a50: 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  ;   /* Array of 
9a60: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
9a70: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20        int len;  
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67 74   /* String lengt
9aa0: 68 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a  h of zSql */.  .
9ab0: 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
9ac0: 66 69 6e 64 20 61 20 53 51 4c 20 73 74 61 74 65  find a SQL state
9ad0: 6d 65 6e 74 20 74 68 61 74 20 68 61 73 20 61 6c  ment that has al
9ae0: 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 69  ready been compi
9af0: 6c 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  led and.      **
9b00: 20 77 68 69 63 68 20 6d 61 74 63 68 65 73 20 74   which matches t
9b10: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 63 65  he next sequence
9b20: 20 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a   of SQL..      *
9b30: 2f 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20  /.      pStmt = 
9b40: 30 3b 0a 20 20 20 20 20 20 70 50 72 65 53 74 6d  0;.      pPreStm
9b50: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
9b60: 74 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73  t;.      len = s
9b70: 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20  trlen(zSql);.   
9b80: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20     if( pPreStmt 
9b90: 26 26 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72  && sqlite3_expir
9ba0: 65 64 28 70 50 72 65 53 74 6d 74 2d 3e 70 53 74  ed(pPreStmt->pSt
9bb0: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  mt) ){.        f
9bc0: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44  lushStmtCache(pD
9bd0: 62 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65  b);.        pPre
9be0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
9bf0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 70 50  }.      for(; pP
9c00: 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74  reStmt; pPreStmt
9c10: 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74  =pPreStmt->pNext
9c20: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
9c30: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71   = pPreStmt->nSq
9c40: 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  l;.        if( l
9c50: 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20 20  en>=n .         
9c60: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72     && memcmp(pPr
9c70: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
9c80: 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20  l, n)==0.       
9c90: 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d       && (zSql[n]
9ca0: 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d  ==0 || zSql[n-1]
9cb0: 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20 29  ==';').        )
9cc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 6d  {.          pStm
9cd0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53  t = pPreStmt->pS
9ce0: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  tmt;.          z
9cf0: 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72  Left = &zSql[pPr
9d00: 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20  eStmt->nSql];.. 
9d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e           /* When
9d20: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
9d30: 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20  ement is found, 
9d40: 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74  unlink it from t
9d50: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
9d60: 63 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20  cache list.  It 
9d70: 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64  will later be ad
9d80: 64 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ded back to the 
9d90: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
9da0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61      ** of the ca
9db0: 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65  che list in orde
9dc0: 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c  r to implement L
9dd0: 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a  RU replacement..
9de0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
9df0: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
9e00: 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  tmt->pPrev ){.  
9e10: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
9e20: 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  mt->pPrev->pNext
9e30: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65   = pPreStmt->pNe
9e40: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  xt;.          }e
9e50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9e60: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
9e70: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
9e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9e90: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
9ea0: 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  Stmt->pNext ){. 
9eb0: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53             pPreS
9ec0: 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  tmt->pNext->pPre
9ed0: 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50  v = pPreStmt->pP
9ee0: 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rev;.          }
9ef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9f00: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
9f10: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  = pPreStmt->pPre
9f20: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  v;.          }. 
9f30: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53           pDb->nS
9f40: 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  tmt--;.         
9f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9f60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  }.      }.  .   
9f70: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70     /* If no prep
9f80: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77  ared statement w
9f90: 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69  as found.  Compi
9fa0: 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78 74 0a  le the SQL text.
9fb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
9fc0: 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  f( pStmt==0 ){. 
9fd0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
9fe0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72  E_OK!=sqlite3_pr
9ff0: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
a000: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
a010: 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20 20   &zLeft) ){.    
a020: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
a030: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
a040: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
a050: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
a060: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b)));.          
a070: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
a080: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a0a0: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
a0b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a0c0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
a0d0: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
a0e0: 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >db) ){.        
a0f0: 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65      /* A compile
a100: 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74  -time error in t
a110: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  he statement.   
a120: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
a130: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
a140: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
a150: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
a160: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
a170: 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >db)));.        
a180: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
a190: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
a1a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
a1b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a1c0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
a1d0: 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70  ment was a no-op
a1e0: 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74  .  Continue to t
a1f0: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
a200: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
a210: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69   in the SQL stri
a220: 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng..            
a230: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  */.            z
a240: 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20  Sql = zLeft;.   
a250: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
a260: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
a270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a280: 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d   assert( pPreStm
a290: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  t==0 );.      }.
a2a0: 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 76  .      /* Bind v
a2b0: 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74  alues to paramet
a2c0: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
a2d0: 69 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20 20  ith $ or :.     
a2e0: 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61 72   */  .      nVar
a2f0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
a300: 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
a310: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50  pStmt);.      nP
a320: 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  arm = 0;.      i
a330: 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61  f( nVar>sizeof(a
a340: 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61  Parm)/sizeof(aPa
a350: 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  rm[0]) ){.      
a360: 20 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f    apParm = (Tcl_
a370: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
a380: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50 61  nVar*sizeof(apPa
a390: 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d  rm[0]));.      }
a3a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70  else{.        ap
a3b0: 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20  Parm = aParm;.  
a3c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
a3d0: 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b  i=1; i<=nVar; i+
a3e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
a3f0: 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73  t char *zVar = s
a400: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
a410: 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74  meter_name(pStmt
a420: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
a430: 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56  ( zVar!=0 && (zV
a440: 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56  ar[0]=='$' || zV
a450: 61 72 5b 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20  ar[0]==':') ){. 
a460: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a           Tcl_Obj
a470: 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74   *pVar = Tcl_Get
a480: 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26  Var2Ex(interp, &
a490: 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a  zVar[1], 0, 0);.
a4a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 56            if( pV
a4b0: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ar ){.          
a4c0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
a4d0: 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20       u8 *data;. 
a4e0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
a4f0: 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74  *zType = pVar->t
a500: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
a510: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
a520: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ";.            c
a530: 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d  har c = zType[0]
a540: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
a550: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
a560: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
a570: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
a580: 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20  ->bytes==0 ){.  
a590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a5a0: 6e 6c 79 20 6c 6f 61 64 20 61 20 42 4c 4f 42 20  nly load a BLOB 
a5b0: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
a5c0: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
a5d0: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
a5e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73            ** has
a5f0: 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65   no string repre
a600: 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  sentation. */.  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
a620: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
a630: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
a640: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
a650: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
a660: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20  _blob(pStmt, i, 
a670: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
a680: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
a690: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
a6a0: 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20  efCount(pVar);. 
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50               apP
a6c0: 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70  arm[nParm++] = p
a6d0: 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Var;.           
a6e0: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
a6f0: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
a700: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
a710: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
a720: 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26         (c=='i' &
a730: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
a740: 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20  int")==0) ){.   
a750: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
a760: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
a770: 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a  erp, pVar, &n);.
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
a790: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
a7a0: 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20  Stmt, i, n);.   
a7b0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
a7c0: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
a7d0: 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c  cmp(zType,"doubl
a7e0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
a7f0: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
a800: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a810: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
a820: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
a830: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20  r, &r);.        
a840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
a850: 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  nd_double(pStmt,
a860: 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20   i, r);.        
a870: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
a880: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
a890: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
a8a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a8b0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
a8c0: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  v;.             
a8d0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
a8e0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  romObj(interp, p
a8f0: 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  Var, &v);.      
a900: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a910: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
a920: 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20  , i, v);.       
a930: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a940: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d            data =
a950: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
a960: 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  *)Tcl_GetStringF
a970: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
a980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a990: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
a9a0: 74 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61  t(pStmt, i, (cha
a9b0: 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c  r *)data, n, SQL
a9c0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
a9d0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
a9e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72  ncrRefCount(pVar
a9f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
aa00: 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d   apParm[nParm++]
aa10: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
aa20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
aa30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aa40: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
aa50: 5f 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20  _null( pStmt, i 
aa60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
aa70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
aa80: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75  ..      /* Compu
aa90: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  te column names 
aaa0: 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  */.      nCol = 
aab0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
aac0: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
aad0: 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29     if( pScript )
aae0: 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e  {.        apColN
aaf0: 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a  ame = (Tcl_Obj**
ab00: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
ab10: 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f  of(Tcl_Obj*)*nCo
ab20: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
ab30: 20 61 70 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20   apColName==0 ) 
ab40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 66  break;.        f
ab50: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
ab60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
ab70: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64  apColName[i] = d
ab80: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
ab90: 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
aba0: 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20  Stmt,i));.      
abb0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
abc0: 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69  ount(apColName[i
abd0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
abe0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
abf0: 49 66 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  If results are b
ac00: 65 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61  eing stored in a
ac10: 6e 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  n array variable
ac20: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20  , then create.  
ac30: 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79      ** the array
ac40: 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68  (*) entry for th
ac50: 61 74 20 61 72 72 61 79 0a 20 20 20 20 20 20 2a  at array.      *
ac60: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 72  /.      if( pArr
ac70: 61 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ay ){.        Tc
ac80: 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20  l_Obj *pColList 
ac90: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
aca0: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
acb0: 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77  *pStar = Tcl_New
acc0: 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d  StringObj("*", -
acd0: 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  1);.        Tcl_
ace0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f  IncrRefCount(pCo
acf0: 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  lList);.        
ad00: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
ad10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
ad20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
ad30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
ad40: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f  , pColList, apCo
ad50: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
ad60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c     }.        Tcl
ad70: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
ad80: 72 70 2c 20 70 41 72 72 61 79 2c 20 70 53 74 61  rp, pArray, pSta
ad90: 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a  r, pColList,0);.
ada0: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
adb0: 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73  RefCount(pColLis
adc0: 74 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  t);.        Tcl_
add0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74  DecrRefCount(pSt
ade0: 61 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ar);.      }..  
adf0: 20 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74      /* Execute t
ae00: 68 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a  he SQL.      */.
ae10: 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d        while( rc=
ae20: 3d 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74  =TCL_OK && pStmt
ae30: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
ae40: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
ae50: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  mt) ){.        f
ae60: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
ae70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
ae80: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20  Tcl_Obj *pVal;. 
ae90: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
aea0: 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20      /* Set pVal 
aeb0: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69  to contain the i
aec0: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
aed0: 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  is row. */.     
aee0: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
aef0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
af00: 28 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20  (pStmt, i) ){.  
af10: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
af20: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
af30: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
af40: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
af50: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
af60: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
af70: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
af80: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
af90: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
afa0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 2c 20  blob(pStmt, i), 
afb0: 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20  bytes);.        
afc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
afd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
afe0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
aff0: 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TE_INTEGER: {.  
b000: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
b010: 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c  te_int64 v = sql
b020: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
b030: 34 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  4(pStmt, i);.   
b040: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
b050: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
b060: 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   v<=2147483647 )
b070: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b080: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
b090: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
b0a0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0c0: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69  pVal = Tcl_NewWi
b0d0: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
b0e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b0f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b100: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b110: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
b120: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
b130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
b140: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
b150: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
b160: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
b170: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
b180: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
b190: 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (r);.           
b1a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b1b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b1c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1d0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
b1e0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54        pVal = dbT
b1f0: 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e  extToObj(pDb->zN
b200: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
b210: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b230: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
b250: 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a  al = dbTextToObj
b260: 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  ((char *)sqlite3
b270: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
b280: 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20  mt, i));.       
b290: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b2a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b2b0: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
b2c0: 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74       if( pScript
b2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b2e0: 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b  if( pArray==0 ){
b2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
b300: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
b310: 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  terp, apColName[
b320: 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b  i], 0, pVal, 0);
b330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
b340: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
b350: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
b360: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
b370: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70   apColName[i], p
b380: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Val, 0);.       
b390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b3a0: 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63   }else if( choic
b3b0: 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20  e==DB_ONECOLUMN 
b3c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
b3d0: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 29  ssert( pRet==0 )
b3e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
b3f0: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
b400: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20             pRet 
b410: 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  = pVal;.        
b420: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
b430: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
b440: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b450: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
b460: 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20  _BREAK;.        
b470: 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20      i = nCol;.  
b480: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
b490: 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49  ( choice==DB_EXI
b4a0: 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20  STS ){.         
b4b0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
b4c0: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
b4d0: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63         pRet = Tc
b4e0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
b4f0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
b500: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
b510: 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  (pRet);.        
b520: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45      rc = TCL_BRE
b530: 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AK;.            
b540: 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  i = nCol;.      
b550: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b560: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
b570: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b580: 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56  interp, pRet, pV
b590: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  al);.          }
b5a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
b5b0: 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70        if( pScrip
b5c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
b5d0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
b5e0: 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  x(interp, pScrip
b5f0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
b600: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e   if( rc==TCL_CON
b610: 54 49 4e 55 45 20 29 7b 0a 20 20 20 20 20 20 20  TINUE ){.       
b620: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
b630: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
b640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b650: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
b660: 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
b670: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
b680: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
b690: 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6c 75 6d  * Free the colum
b6a0: 6e 20 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a  n name objects *
b6b0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72  /.      if( pScr
b6c0: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ipt ){.        f
b6d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
b6e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
b6f0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
b700: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
b710: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b720: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
b730: 2a 29 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  *)apColName);.  
b740: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
b750: 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73  Free the bound s
b760: 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70  tring and blob p
b770: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
b780: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50     for(i=0; i<nP
b790: 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arm; i++){.     
b7a0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
b7b0: 75 6e 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b 0a  unt(apParm[i]);.
b7c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b7d0: 28 20 61 70 50 61 72 6d 21 3d 61 50 61 72 6d 20  ( apParm!=aParm 
b7e0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
b7f0: 72 65 65 28 28 63 68 61 72 2a 29 61 70 50 61 72  ree((char*)apPar
b800: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  m);.      }..   
b810: 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20     /* Reset the 
b820: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 74  statement.  If t
b830: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 69  he result code i
b840: 73 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c  s SQLITE_SCHEMA,
b850: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 66   then.      ** f
b860: 6c 75 73 68 20 74 68 65 20 73 74 61 74 65 6d 65  lush the stateme
b870: 6e 74 20 63 61 63 68 65 20 61 6e 64 20 74 72 79  nt cache and try
b880: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61   the statement a
b890: 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gain..      */. 
b8a0: 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
b8b0: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
b8c0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
b8d0: 45 5f 53 43 48 45 4d 41 3d 3d 72 63 32 20 29 7b  E_SCHEMA==rc2 ){
b8e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 66 74 65  .        /* Afte
b8f0: 72 20 61 20 73 63 68 65 6d 61 20 63 68 61 6e 67  r a schema chang
b900: 65 2c 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  e, flush the cac
b910: 68 65 20 61 6e 64 20 74 72 79 20 74 6f 20 72 75  he and try to ru
b920: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
b930: 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e   statement again
b940: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
b950: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
b960: 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20  he( pDb );.     
b970: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
b980: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
b990: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
b9a0: 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61   ) Tcl_Free((cha
b9b0: 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  r*)pPreStmt);.  
b9c0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
b9d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b9e0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29  SQLITE_OK!=rc2 )
b9f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
ba00: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
ba10: 20 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20   occurs, report 
ba20: 74 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74  the error and st
ba30: 6f 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20  op reading.     
ba40: 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20     ** the SQL.  
ba50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ba60: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
ba70: 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74  t(interp, dbText
ba80: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ToObj(sqlite3_er
ba90: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b  rmsg(pDb->db)));
baa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bab0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
bac0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
bad0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
bae0: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29    if( pPreStmt )
baf0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
bb00: 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20  )pPreStmt);.    
bb10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bb20: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e   }else if( pDb->
bb30: 6d 61 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20  maxStmt<=0 ){.  
bb40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
bb50: 63 61 63 68 65 20 69 73 20 74 75 72 6e 65 64 20  cache is turned 
bb60: 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64  off, deallocated
bb70: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
bb80: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
bb90: 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65  reStmt ) Tcl_Fre
bba0: 65 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d  e((char*)pPreStm
bbb0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
bbc0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
bbd0: 6d 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mt);.      }else
bbe0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  {.        /* Eve
bbf0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 20 61  rything worked a
bc00: 6e 64 20 74 68 65 20 63 61 63 68 65 20 69 73 20  nd the cache is 
bc10: 6f 70 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20  operational..   
bc20: 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61       ** Create a
bc30: 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64   new SqlPrepared
bc40: 53 74 6d 74 20 73 74 72 75 63 74 75 72 65 20 69  Stmt structure i
bc50: 66 20 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20  f we need one.. 
bc60: 20 20 20 20 20 20 20 2a 2a 20 28 49 66 20 77 65         ** (If we
bc70: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 6f 6e   already have on
bc80: 65 20 77 65 20 63 61 6e 20 6a 75 73 74 20 72 65  e we can just re
bc90: 75 73 65 20 69 74 2e 29 0a 20 20 20 20 20 20 20  use it.).       
bca0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
bcb0: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  pPreStmt==0 ){. 
bcc0: 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a           len = z
bcd0: 4c 65 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20  Left - zSql;.   
bce0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20         pPreStmt 
bcf0: 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  = (SqlPreparedSt
bd00: 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  mt*)Tcl_Alloc( s
bd10: 69 7a 65 6f 66 28 2a 70 50 72 65 53 74 6d 74 29  izeof(*pPreStmt)
bd20: 20 2b 20 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20   + len );.      
bd30: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
bd40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
bd50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
bd60: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d    pPreStmt->pStm
bd70: 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
bd80: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e       pPreStmt->n
bd90: 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  Sql = len;.     
bda0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 72 65       memcpy(pPre
bdb0: 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c  Stmt->zSql, zSql
bdc0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  , len);.        
bdd0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c    pPreStmt->zSql
bde0: 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [len] = 0;.     
bdf0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
be00: 20 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65   Add the prepare
be10: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  d statement to t
be20: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
be30: 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 0a 20  the cache list. 
be40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
be50: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
be60: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
be70: 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  t;.        pPreS
be80: 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  tmt->pPrev = 0;.
be90: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d          if( pDb-
bea0: 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20  >stmtList ){.   
beb0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
bec0: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ist->pPrev = pPr
bed0: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  eStmt;.        }
bee0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74  .        pDb->st
bef0: 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d  mtList = pPreStm
bf00: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
bf10: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20  Db->stmtLast==0 
bf20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
bf30: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d  ert( pDb->nStmt=
bf40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
bf50: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
bf60: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20  pPreStmt;.      
bf70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bf80: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
bf90: 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 20  nStmt>0 );.     
bfa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
bfb0: 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20  ->nStmt++;.   . 
bfc0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
bfd0: 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74  have too many st
bfe0: 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65  atement in cache
bff0: 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72  , remove the sur
c000: 70 6c 75 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  plus from the.  
c010: 20 20 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20        ** end of 
c020: 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 0a  the cache list..
c030: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c040: 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e     while( pDb->n
c050: 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d  Stmt>pDb->maxStm
c060: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
c070: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
c080: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
c090: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
c0a0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
c0b0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e   pDb->stmtLast->
c0c0: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  pPrev;.         
c0d0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
c0e0: 29 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e  )pDb->stmtLast->
c0f0: 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  pNext);.        
c100: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d    pDb->stmtLast-
c110: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
c120: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
c130: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
c140: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c150: 50 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20 6e  Proceed to the n
c160: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ext statement */
c170: 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c  .      zSql = zL
c180: 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  eft;.    }.    T
c190: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c1a0: 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20 69  objv[2]);..    i
c1b0: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
c1c0: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
c1d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  ){.        Tcl_S
c1e0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
c1f0: 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20  rp, pRet);.     
c200: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63   }.      Tcl_Dec
c210: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
c220: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
c230: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
c240: 20 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f       $db functio
c250: 6e 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20  n NAME SCRIPT.  
c260: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
c270: 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f   new SQL functio
c280: 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
c290: 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75  Whenever that fu
c2a0: 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  nction is.  ** c
c2b0: 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
c2c0: 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
c2d0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
c2e0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55   */.  case DB_FU
c2f0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71  NCTION: {.    Sq
c300: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  lFunc *pFunc;.  
c310: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
c320: 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  pt;.    char *zN
c330: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ame;.    if( obj
c340: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
c350: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
c360: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
c370: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
c380: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
c390: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
c3a0: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
c3b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
c3c0: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
c3d0: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
c3e0: 5d 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66  ];.    pFunc = f
c3f0: 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20  indSqlFunc(pDb, 
c400: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
c410: 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72  pFunc==0 ) retur
c420: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
c430: 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72   if( pFunc->pScr
c440: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ipt ){.      Tcl
c450: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46  _DecrRefCount(pF
c460: 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20  unc->pScript);. 
c470: 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e     }.    pFunc->
c480: 70 53 63 72 69 70 74 20 3d 20 70 53 63 72 69 70  pScript = pScrip
c490: 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  t;.    Tcl_IncrR
c4a0: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
c4b0: 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65  ;.    pFunc->use
c4c0: 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54  EvalObjv = safeT
c4d0: 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74  oUseEvalObjv(int
c4e0: 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20  erp, pScript);. 
c4f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
c500: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
c510: 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  pDb->db, zName, 
c520: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
c530: 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20  .        pFunc, 
c540: 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  tclSqlFunc, 0, 0
c550: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
c560: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c570: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
c580: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  ;.      Tcl_SetR
c590: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
c5a0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
c5b0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
c5c0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
c5d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
c5e0: 2a 20 4d 75 73 74 20 66 6c 75 73 68 20 61 6e 79  * Must flush any
c5f0: 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e   cached statemen
c600: 74 73 20 2a 2f 0a 20 20 20 20 20 20 66 6c 75 73  ts */.      flus
c610: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
c620: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
c630: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
c640: 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76  **     $db nullv
c650: 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20  alue ?STRING?.  
c660: 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
c670: 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61 20  ext used when a 
c680: 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
c690: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
c6a0: 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20  e. If ?STRING?. 
c6b0: 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65   ** is not prese
c6c0: 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nt, then the cur
c6d0: 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64  rent string used
c6e0: 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74   for NULL is ret
c6f0: 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53  urned..  ** If S
c700: 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74  TRING is present
c710: 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73  , then STRING is
c720: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a   returned..  **.
c730: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e    */.  case DB_N
c740: 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  ULLVALUE: {.    
c750: 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
c760: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
c770: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
c780: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
c790: 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a  , "NULLVALUE");.
c7a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
c7b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
c7c0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
c7d0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
c7e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c        char *zNul
c7f0: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
c800: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
c810: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
c820: 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
c830: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
c840: 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20  e(pDb->zNull);. 
c850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c860: 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20   zNull && len>0 
c870: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
c880: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zNull = Tcl_Allo
c890: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
c8a0: 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 70 44        strncpy(pD
c8b0: 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c  b->zNull, zNull,
c8c0: 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70   len);.        p
c8d0: 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d  Db->zNull[len] =
c8e0: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\0';.      }el
c8f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
c900: 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  >zNull = 0;.    
c910: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63    }.    }.    Tc
c920: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
c930: 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
c940: 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b  bj(pDb->zNull));
c950: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
c960: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
c970: 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  db last_insert_r
c980: 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owid .  **.  ** 
c990: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
c9a0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52  r which is the R
c9b0: 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73  OWID for the mos
c9c0: 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e  t recent insert.
c9d0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
c9e0: 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49  LAST_INSERT_ROWI
c9f0: 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  D: {.    Tcl_Obj
ca00: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
ca10: 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66  nt rowid;.    if
ca20: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
ca30: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
ca40: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
ca50: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
ca60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ca70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69  ;.    }.    rowi
ca80: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
ca90: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44  _insert_rowid(pD
caa0: 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73  b->db);.    pRes
cab0: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
cac0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
cad0: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
cae0: 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64  j(pResult, rowid
caf0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
cb00: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  }..  /*.  ** The
cb10: 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65   DB_ONECOLUMN me
cb20: 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e  thod is implemen
cb30: 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69 74  ted together wit
cb40: 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a  h DB_EVAL..  */.
cb50: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f  .  /*    $db pro
cb60: 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43  gress ?N CALLBAC
cb70: 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e  K?.  ** .  ** In
cb80: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
cb90: 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20  allback every N 
cba0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
cbb0: 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78  opcodes while ex
cbc0: 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65  ecuting.  ** que
cbd0: 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ries..  */.  cas
cbe0: 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b  e DB_PROGRESS: {
cbf0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  .    if( objc==2
cc00: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
cc10: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
cc20: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
cc30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cc40: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c   pDb->zProgress,
cc50: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
cc60: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
cc70: 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =4 ){.      char
cc80: 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20   *zProgress;.   
cc90: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
cca0: 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69    int N;.      i
ccb0: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
ccc0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
ccd0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e  erp, objv[2], &N
cce0: 29 20 29 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ) ){..return TCL
ccf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b  _ERROR;.      };
cd00: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
cd10: 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
cd20: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
cd30: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20  b->zProgress);. 
cd40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
cd50: 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74  ogress = Tcl_Get
cd60: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
cd70: 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[3], &len);.  
cd80: 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73      if( zProgres
cd90: 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  s && len>0 ){.  
cda0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67        pDb->zProg
cdb0: 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  ress = Tcl_Alloc
cdc0: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
cdd0: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
cde0: 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f  >zProgress, zPro
cdf0: 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 65  gress);.      }e
ce00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
ce10: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->zProgress = 0;
ce20: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
ce30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
ce40: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
ce50: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
ce60: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
ce70: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
ce80: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
ce90: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
cea0: 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  s_handler(pDb->d
ceb0: 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73  b, N, DbProgress
cec0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
ced0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
cef0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
cf00: 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ->db, 0, 0, 0);.
cf10: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
cf20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cf30: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
cf40: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
cf50: 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b  , "N CALLBACK");
cf60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
cf70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
cf80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
cf90: 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69   /*    $db profi
cfa0: 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  le ?CALLBACK?.  
cfb0: 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
cfc0: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
cfd0: 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
cfe0: 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65   routine after e
cff0: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
d000: 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20  t.  ** that has 
d010: 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f  run.  The text o
d020: 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68  f the SQL and th
d030: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70  e amount of elap
d040: 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a  se time are.  **
d050: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c   appended to CAL
d060: 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65  LBACK before the
d070: 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a   script is run..
d080: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50    */.  case DB_P
d090: 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66  ROFILE: {.    if
d0a0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
d0b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
d0c0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
d0d0: 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
d0e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d0f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
d100: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
d110: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
d120: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
d130: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
d140: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d150: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30  pDb->zProfile, 0
d160: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d170: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
d180: 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20   *zProfile;.    
d190: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
d1a0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
d1b0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
d1c0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
d1d0: 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  file);.      }. 
d1e0: 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20       zProfile = 
d1f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
d200: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
d210: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
d220: 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30  Profile && len>0
d230: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
d240: 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f  >zProfile = Tcl_
d250: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
d260: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
d270: 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20  (pDb->zProfile, 
d280: 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20  zProfile);.     
d290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d2a0: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20  pDb->zProfile = 
d2b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
d2c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
d2d0: 52 41 43 45 0a 20 20 20 20 20 20 69 66 28 20 70  RACE.      if( p
d2e0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
d2f0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
d300: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
d310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
d320: 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44  ofile(pDb->db, D
d330: 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c  bProfileHandler,
d340: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
d350: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d360: 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d  te3_profile(pDb-
d370: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
d380: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
d390: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
d3a0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
d3b0: 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a  db rekey KEY.  *
d3c0: 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68  *.  ** Change th
d3d0: 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79  e encryption key
d3e0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c   on the currentl
d3f0: 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e  y open database.
d400: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
d410: 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74  REKEY: {.    int
d420: 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20   nKey;.    void 
d430: 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f  *pKey;.    if( o
d440: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
d450: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
d460: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
d470: 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20  , "KEY");.      
d480: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d490: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
d4a0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
d4b0: 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
d4c0: 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64  2], &nKey);.#ifd
d4d0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
d4e0: 44 45 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  DEC.    rc = sql
d4f0: 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e  ite3_rekey(pDb->
d500: 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, pKey, nKey);
d510: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
d520: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
d530: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
d540: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
d550: 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
d560: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
d570: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
d580: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
d590: 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75  *     $db timeou
d5a0: 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20  t MILLESECONDS. 
d5b0: 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66   **.  ** Delay f
d5c0: 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
d5d0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70   milliseconds sp
d5e0: 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66  ecified when a f
d5f0: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ile is locked.. 
d600: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49   */.  case DB_TI
d610: 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74  MEOUT: {.    int
d620: 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a   ms;.    if( obj
d630: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
d640: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d650: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
d660: 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
d670: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
d680: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
d690: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
d6a0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
d6b0: 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29   objv[2], &ms) )
d6c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d6d0: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  R;.    sqlite3_b
d6e0: 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d  usy_timeout(pDb-
d6f0: 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72  >db, ms);.    br
d700: 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  eak;.  }.  .  /*
d710: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f  .  **     $db to
d720: 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a  tal_changes.  **
d730: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
d740: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
d750: 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
d760: 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
d770: 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73   deleted .  ** s
d780: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
d790: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65  e handle was cre
d7a0: 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ated..  */.  cas
d7b0: 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47  e DB_TOTAL_CHANG
d7c0: 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
d7d0: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
d7e0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
d7f0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
d800: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
d810: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
d820: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d830: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
d840: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
d850: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
d860: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
d870: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
d880: 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
d890: 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
d8a0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
d8b0: 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 20  /*    $db trace 
d8c0: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
d8d0: 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67    ** Make arrang
d8e0: 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65  ements to invoke
d8f0: 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f   the CALLBACK ro
d900: 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53  utine for each S
d910: 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
d920: 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75 74  * that is execut
d930: 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66  ed.  The text of
d940: 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70 65   the SQL is appe
d950: 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
d960: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20   before.  ** it 
d970: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
d980: 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43  /.  case DB_TRAC
d990: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
d9a0: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
d9b0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
d9c0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
d9d0: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
d9e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d9f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
da00: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
da10: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
da20: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
da30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
da40: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54  (interp, pDb->zT
da50: 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  race, 0);.      
da60: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
da70: 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b     char *zTrace;
da80: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
da90: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
daa0: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
dab0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
dac0: 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Trace);.      }.
dad0: 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54        zTrace = T
dae0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
daf0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
db00: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54  n);.      if( zT
db10: 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b  race && len>0 ){
db20: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
db30: 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  race = Tcl_Alloc
db40: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
db50: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
db60: 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65 29  >zTrace, zTrace)
db70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
db80: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
db90: 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ce = 0;.      }.
dba0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dbb0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20  MIT_TRACE.      
dbc0: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
dbd0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
dbe0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
dbf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dc00: 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20  _trace(pDb->db, 
dc10: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20  DbTraceHandler, 
dc20: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
dc30: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
dc40: 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62  e3_trace(pDb->db
dc50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
dc60: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
dc70: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
dc80: 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73 61  /*    $db transa
dc90: 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64  ction [-deferred
dca0: 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63  |-immediate|-exc
dcb0: 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20  lusive] SCRIPT. 
dcc0: 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61   **.  ** Start a
dcd0: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
dce0: 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20   (if we are not 
dcf0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d  already in the m
dd00: 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74  idst of a.  ** t
dd10: 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20  ransaction) and 
dd20: 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c 20  execute the TCL 
dd30: 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 20  script SCRIPT.  
dd40: 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a  After SCRIPT.  *
dd50: 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74  * completes, eit
dd60: 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74  her commit the t
dd70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f  ransaction or ro
dd80: 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53 43  ll it back if SC
dd90: 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73  RIPT.  ** throws
dda0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20   an exception.  
ddb0: 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61  Or if no new tra
ddc0: 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72  nsation was star
ddd0: 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ted, do nothing.
dde0: 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65  .  ** pass the e
ddf0: 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74  xception on up t
de00: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
de10: 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64   ** This command
de20: 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62 79   was inspired by
de30: 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74   Dave Thomas's t
de40: 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74  alk on Ruby at t
de50: 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52  he.  ** 2005 O'R
de60: 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63  eilly Open Sourc
de70: 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53  e Convention (OS
de80: 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  CON)..  */.  cas
de90: 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e  e DB_TRANSACTION
dea0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 54 72  : {.    int inTr
deb0: 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ans;.    Tcl_Obj
dec0: 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
ded0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69  onst char *zBegi
dee0: 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20 20 20  n = "BEGIN";.   
def0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
df00: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
df10: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
df20: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
df30: 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50  v, "[TYPE] SCRIP
df40: 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
df50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
df60: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
df70: 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 53 63 72  =3 ){.      pScr
df80: 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20  ipt = objv[2];. 
df90: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
dfa0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
dfb0: 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b  har *TTYPE_strs[
dfc0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64  ] = {.        "d
dfd0: 65 66 65 72 72 65 64 22 2c 20 20 20 22 65 78 63  eferred",   "exc
dfe0: 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64  lusive",  "immed
dff0: 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d  iate", 0.      }
e000: 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59  ;.      enum TTY
e010: 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20  PE_enum {.      
e020: 20 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44    TTYPE_DEFERRED
e030: 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56  , TTYPE_EXCLUSIV
e040: 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  E, TTYPE_IMMEDIA
e050: 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  TE.      };.    
e060: 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20    int ttype;.   
e070: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
e080: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
e090: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50  p, objv[2], TTYP
e0a0: 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63  E_strs, "transac
e0b0: 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20  tion type",.    
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74            0, &tt
e0e0: 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ype) ){.        
e0f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e110: 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54  switch( (enum TT
e120: 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29  YPE_enum)ttype )
e130: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  {.        case T
e140: 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20  TYPE_DEFERRED:  
e150: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20    /* no-op */;  
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
e170: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
e180: 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49  se TTYPE_EXCLUSI
e190: 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  VE:   zBegin = "
e1a0: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22  BEGIN EXCLUSIVE"
e1b0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
e1c0: 20 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d    case TTYPE_IMM
e1d0: 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e  EDIATE:   zBegin
e1e0: 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49   = "BEGIN IMMEDI
e1f0: 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ATE";  break;.  
e200: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72      }.      pScr
e210: 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ipt = objv[3];. 
e220: 20 20 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73     }.    inTrans
e230: 20 3d 20 21 73 71 6c 69 74 65 33 5f 67 65 74 5f   = !sqlite3_get_
e240: 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e  autocommit(pDb->
e250: 64 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e  db);.    if( !in
e260: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 73  Trans ){.      s
e270: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
e280: 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20  >db, zBegin, 0, 
e290: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
e2a0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
e2b0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72  jEx(interp, pScr
e2c0: 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ipt, 0);.    if(
e2d0: 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20   !inTrans ){.   
e2e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e2f0: 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 72  End;.      if( r
e300: 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a  c==TCL_ERROR ){.
e310: 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22          zEnd = "
e320: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
e330: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
e340: 20 20 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d 49 54    zEnd = "COMMIT
e350: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
e360: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
e370: 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20  b->db, zEnd, 0, 
e380: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
e390: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
e3a0: 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70  *.  **    $db up
e3b0: 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  date_hook ?scrip
e3c0: 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72  t?.  **    $db r
e3d0: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63  ollback_hook ?sc
e3e0: 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73  ript?.  */.  cas
e3f0: 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b  e DB_UPDATE_HOOK
e400: 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c  : .  case DB_ROL
e410: 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20  LBACK_HOOK: {.. 
e420: 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b     /* set ppHook
e430: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70   to point at pUp
e440: 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c  dateHook or pRol
e450: 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e  lbackHook, depen
e460: 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20  ding on .    ** 
e470: 77 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64  whether [$db upd
e480: 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64  ate_hook] or [$d
e490: 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d  b rollback_hook]
e4a0: 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20   was invoked..  
e4b0: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a    */.    Tcl_Obj
e4c0: 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20   **ppHook; .    
e4d0: 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55  if( choice==DB_U
e4e0: 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20  PDATE_HOOK ){.  
e4f0: 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44      ppHook = &pD
e500: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a  b->pUpdateHook;.
e510: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e520: 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
e530: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20  pRollbackHook;. 
e540: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
e550: 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
e560: 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57   ){.       Tcl_W
e570: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
e580: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
e590: 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
e5a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e5b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
e5c0: 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20   *ppHook ){.    
e5d0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
e5e0: 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f  lt(interp, *ppHo
e5f0: 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  ok);.      if( o
e600: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
e610: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
e620: 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
e630: 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30       *ppHook = 0
e640: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e650: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
e660: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e670: 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20   !(*ppHook) );. 
e680: 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
e690: 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b  CharLength(objv[
e6a0: 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  2])>0 ){.       
e6b0: 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b   *ppHook = objv[
e6c0: 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  2];.        Tcl_
e6d0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70  IncrRefCount(*pp
e6e0: 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Hook);.      }. 
e6f0: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
e700: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44  3_update_hook(pD
e710: 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70  b->db, (pDb->pUp
e720: 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74  dateHook?DbUpdat
e730: 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62  eHandler:0), pDb
e740: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
e750: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62  ollback_hook(pDb
e760: 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c  ->db,(pDb->pRoll
e770: 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62  backHook?DbRollb
e780: 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44  ackHandler:0),pD
e790: 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b);..    break;.
e7a0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
e7b0: 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20   version.  **.  
e7c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 65  ** Return the ve
e7d0: 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72  rsion string for
e7e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a   this database..
e7f0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56    */.  case DB_V
e800: 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63  ERSION: {.    Tc
e810: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
e820: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
e830: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
e840: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
e850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a     break;.  }...
e860: 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
e870: 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d 65  e SWITCH stateme
e880: 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  nt */.  return r
e890: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71  c;.}../*.**   sq
e8a0: 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c  lite3 DBNAME FIL
e8b0: 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b  ENAME ?MODE? ?-k
e8c0: 65 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68  ey KEY?.**.** Th
e8d0: 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54  is is the main T
e8e0: 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65  cl command.  Whe
e8f0: 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54  n the "sqlite" T
e900: 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  cl command is.**
e910: 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72   invoked, this r
e920: 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70  outine runs to p
e930: 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d  rocess that comm
e940: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  and..**.** The f
e950: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44  irst argument, D
e960: 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62  BNAME, is an arb
e970: 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20  itrary name for 
e980: 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73  a new.** databas
e990: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  e connection.  T
e9a0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61  his command crea
e9b0: 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e  tes a new comman
e9c0: 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d  d named.** DBNAM
e9d0: 45 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  E that is used t
e9e0: 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63  o control that c
e9f0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20  onnection.  The 
ea00: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
ea10: 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65  ection is delete
ea20: 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d  d when the DBNAM
ea30: 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c  E command is del
ea40: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
ea50: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
ea60: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
ea70: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
ea80: 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  t contains.** th
ea90: 65 20 73 71 6c 69 74 65 20 64 61 74 61 62 61 73  e sqlite databas
eaa0: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
eab0: 61 63 63 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  accessed..**.** 
eac0: 46 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  For testing purp
ead0: 6f 73 65 73 2c 20 77 65 20 61 6c 73 6f 20 73 75  oses, we also su
eae0: 70 70 6f 72 74 20 74 68 65 20 66 6f 6c 6c 6f 77  pport the follow
eaf0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  ing:.**.**  sqli
eb00: 74 65 33 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a  te3 -encoding.**
eb10: 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e  .**       Return
eb20: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 75 73   the encoding us
eb30: 65 64 20 62 79 20 4c 49 4b 45 20 61 6e 64 20 47  ed by LIKE and G
eb40: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e 20 20  LOB operators.  
eb50: 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20 20 20 20  Choices.**      
eb60: 20 61 72 65 20 55 54 46 2d 38 20 61 6e 64 20 69   are UTF-8 and i
eb70: 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73  so8859..**.**  s
eb80: 71 6c 69 74 65 33 20 2d 76 65 72 73 69 6f 6e 0a  qlite3 -version.
eb90: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75  **.**       Retu
eba0: 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  rn the version n
ebb0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 53 51 4c  umber of the SQL
ebc0: 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a  ite library..**.
ebd0: 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 74 63 6c  **  sqlite3 -tcl
ebe0: 2d 75 73 65 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20  -uses-utf.**.** 
ebf0: 20 20 20 20 20 20 52 65 74 75 72 6e 20 22 31 22        Return "1"
ec00: 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   if compiled wit
ec10: 68 20 61 20 54 63 6c 20 75 73 65 73 20 55 54 46  h a Tcl uses UTF
ec20: 2d 38 2e 20 20 52 65 74 75 72 6e 20 22 30 22 20  -8.  Return "0" 
ec30: 69 66 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 74 2e  if.**       not.
ec40: 20 20 55 73 65 64 20 62 79 20 74 65 73 74 73 20    Used by tests 
ec50: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
ec60: 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d   library was com
ec70: 70 69 6c 65 64 20 0a 2a 2a 20 20 20 20 20 20 20  piled .**       
ec80: 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
ec90: 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28  atic int DbMain(
eca0: 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
ecb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
ecc0: 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
ecd0: 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
ece0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f  qliteDb *p;.  vo
ecf0: 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20  id *pKey = 0;.  
ed00: 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20  int nKey = 0;.  
ed10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
ed20: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
ed30: 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  g;.  const char 
ed40: 2a 7a 46 69 6c 65 3b 0a 20 20 69 66 28 20 6f 62  *zFile;.  if( ob
ed50: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72  jc==2 ){.    zAr
ed60: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
ed70: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
ed80: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
ed90: 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73  rcmp(zArg,"-vers
eda0: 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
edb0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
edc0: 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
edd0: 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20  3_version,0);.  
ede0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
edf0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
ee00: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68   strcmp(zArg,"-h
ee10: 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b  as-codec")==0 ){
ee20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
ee30: 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54  AS_CODEC.      T
ee40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ee50: 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23  interp,"1",0);.#
ee60: 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41  else.      Tcl_A
ee70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ee80: 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69  rp,"0",0);.#endi
ee90: 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  f.      return T
eea0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
eeb0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
eec0: 2c 22 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 22  ,"-tcl-uses-utf"
eed0: 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 54  )==0 ){.#ifdef T
eee0: 43 4c 5f 55 54 46 5f 4d 41 58 0a 20 20 20 20 20  CL_UTF_MAX.     
eef0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ef00: 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b  t(interp,"1",0);
ef10: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c  .#else.      Tcl
ef20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ef30: 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e  terp,"0",0);.#en
ef40: 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
ef50: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
ef60: 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35   }.  if( objc==5
ef70: 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20   || objc==6 ){. 
ef80: 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
ef90: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
efa0: 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b  bjv[objc-2], 0);
efb0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
efc0: 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20  zArg,"-key")==0 
efd0: 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20  ){.      pKey = 
efe0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
eff0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a  FromObj(objv[obj
f000: 63 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20  c-1], &nKey);.  
f010: 20 20 20 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20      objc -= 2;. 
f020: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
f030: 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
f040: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
f050: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f060: 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 23 69 66 64  , 1, objv, .#ifd
f070: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
f080: 44 45 43 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  DEC.      "HANDL
f090: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79  E FILENAME ?-key
f0a0: 20 43 4f 44 45 43 2d 4b 45 59 3f 22 0a 23 65 6c   CODEC-KEY?".#el
f0b0: 73 65 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45  se.      "HANDLE
f0c0: 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f   FILENAME ?MODE?
f0d0: 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a  ".#endif.    );.
f0e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f0f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  RROR;.  }.  zErr
f100: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28  Msg = 0;.  p = (
f110: 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c  SqliteDb*)Tcl_Al
f120: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
f130: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
f140: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
f150: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c  lt(interp, "mall
f160: 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f  oc failed", TCL_
f170: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
f180: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f190: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
f1a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
f1b0: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
f1c0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f1d0: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 73 71 6c  jv[2], 0);.  sql
f1e0: 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c  ite3_open(zFile,
f1f0: 20 26 70 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20   &p->db);.  if( 
f200: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
f210: 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  e3_errcode(p->db
f220: 29 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67  ) ){.    zErrMsg
f230: 20 3d 20 73 74 72 64 75 70 28 73 71 6c 69 74 65   = strdup(sqlite
f240: 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
f250: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  ;.    sqlite3_cl
f260: 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ose(p->db);.    
f270: 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23  p->db = 0;.  }.#
f280: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
f290: 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33  _CODEC.  sqlite3
f2a0: 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79  _key(p->db, pKey
f2b0: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
f2c0: 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
f2d0: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
f2e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
f2f0: 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  Msg, TCL_VOLATIL
f300: 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  E);.    Tcl_Free
f310: 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20  ((char*)p);.    
f320: 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
f330: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f340: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  ROR;.  }.  p->ma
f350: 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50  xStmt = NUM_PREP
f360: 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 7a 41  ARED_STMTS;.  zA
f370: 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
f380: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
f390: 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ], 0);.  Tcl_Cre
f3a0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
f3b0: 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
f3c0: 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20  jCmd, (char*)p, 
f3d0: 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 0a 20  DbDeleteCmd);.. 
f3e0: 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20   /* If compiled 
f3f0: 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
f400: 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 6e   turned on, then
f410: 20 72 65 67 69 73 74 65 72 20 74 68 65 20 22 6d   register the "m
f420: 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c 20  d5sum".  ** SQL 
f430: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  function..  */.#
f440: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
f450: 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  T.  {.    extern
f460: 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74   void Md5_Regist
f470: 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 69  er(sqlite3*);.#i
f480: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44  fdef SQLITE_MEMD
f490: 45 42 55 47 0a 20 20 20 20 69 6e 74 20 6d 61 6c  EBUG.    int mal
f4a0: 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c 69 74 65  locfail = sqlite
f4b0: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 0a 20  3_iMallocFail;. 
f4c0: 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c     sqlite3_iMall
f4d0: 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64  ocFail = 0;.#end
f4e0: 69 66 0a 20 20 20 20 4d 64 35 5f 52 65 67 69 73  if.    Md5_Regis
f4f0: 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23 69 66 64  ter(p->db);.#ifd
f500: 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
f510: 55 47 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  UG.    sqlite3_i
f520: 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6d 61 6c  MallocFail = mal
f530: 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64 69 66 0a  locfail;.#endif.
f540: 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a 20 20 70    }.#endif  .  p
f550: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
f560: 70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  p;.  return TCL_
f570: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
f580: 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
f590: 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
f5a0: 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
f5b0: 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
f5c0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
f5d0: 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
f5e0: 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
f5f0: 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
f600: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
f610: 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
f620: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
f630: 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
f640: 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
f650: 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
f660: 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
f670: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
f680: 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
f690: 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
f6a0: 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
f6b0: 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
f6c0: 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
f6d0: 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
f6e0: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
f6f0: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
f700: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
f710: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
f720: 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
f730: 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
f740: 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
f750: 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
f760: 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
f770: 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
f780: 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
f790: 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
f7a0: 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
f7b0: 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
f7c0: 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
f7d0: 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
f7e0: 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
f7f0: 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
f800: 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
f810: 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
f820: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
f830: 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
f840: 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
f850: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
f860: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 65  nformation..*/.e
f870: 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
f880: 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
f890: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63  p *interp){.  Tc
f8a0: 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
f8b0: 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20  rp, "8.4", 0);. 
f8c0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
f8d0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
f8e0: 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62  qlite3", (Tcl_Ob
f8f0: 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
f900: 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50  , 0, 0);.  Tcl_P
f910: 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
f920: 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43  , "sqlite3", PAC
f930: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
f940: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
f950: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
f960: 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a  qlite", (Tcl_Obj
f970: 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
f980: 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
f990: 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
f9a0: 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43 4b 41   "sqlite", PACKA
f9b0: 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72  GE_VERSION);.  r
f9c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
f9d0: 65 78 74 65 72 6e 20 69 6e 74 20 54 63 6c 73 71  extern int Tclsq
f9e0: 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
f9f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
fa00: 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
fa10: 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 65  nit(interp); }.e
fa20: 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
fa30: 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
fa40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
fa50: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
fa60: 0a 65 78 74 65 72 6e 20 69 6e 74 20 54 63 6c 73  .extern int Tcls
fa70: 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
fa80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
fa90: 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
faa0: 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK; }..#ifndef S
fab0: 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
fac0: 4e 4c 59 0a 65 78 74 65 72 6e 20 69 6e 74 20 53  NLY.extern int S
fad0: 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
fae0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
faf0: 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
fb00: 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 65  nit(interp); }.e
fb10: 78 74 65 72 6e 20 69 6e 74 20 54 63 6c 73 71 6c  xtern int Tclsql
fb20: 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ite_Init(Tcl_Int
fb30: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
fb40: 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
fb50: 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 65 78 74  t(interp); }.ext
fb60: 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53  ern int Sqlite_S
fb70: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
fb80: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
fb90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 65 78  urn TCL_OK; }.ex
fba0: 74 65 72 6e 20 69 6e 74 20 54 63 6c 73 71 6c 69  tern int Tclsqli
fbb0: 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
fbc0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
fbd0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
fbe0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
fbf0: 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
fc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc40: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  *****.** The cod
fc50: 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  e that follows i
fc60: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
fc70: 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69  standalone TCL i
fc80: 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2f 0a 0a  nterpreters.*/..
fc90: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63  /*.** If the mac
fca0: 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c  ro TCLSH is one,
fcb0: 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64   then put in cod
fcc0: 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a  e this for the.*
fcd0: 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65  * "main" routine
fce0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69   that will initi
fcf0: 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61  alize Tcl and ta
fd00: 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a  ke input from.**
fd10: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e   standard input.
fd20: 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31  .*/.#if TCLSH==1
fd30: 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
fd40: 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65  inloop[] =.  "se
fd50: 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22  t line {}\n".  "
fd60: 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64  while {![eof std
fd70: 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69  in]} {\n".    "i
fd80: 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20  f {$line!=\"\"} 
fd90: 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73  {\n".      "puts
fda0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20   -nonewline \"> 
fdb0: 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73  \"\n".    "} els
fdc0: 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75  e {\n".      "pu
fdd0: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
fde0: 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e  % \"\n".    "}\n
fdf0: 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74 64  ".    "flush std
fe00: 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65  out\n".    "appe
fe10: 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74  nd line [gets st
fe20: 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20  din]\n".    "if 
fe30: 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20  {[info complete 
fe40: 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20  $line]} {\n".   
fe50: 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b     "if {[catch {
fe60: 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65  uplevel #0 $line
fe70: 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a  } result]} {\n".
fe80: 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74          "puts st
fe90: 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72  derr \"Error: $r
fea0: 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20  esult\"\n".     
feb0: 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73   "} elseif {$res
fec0: 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ult!=\"\"} {\n".
fed0: 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72          "puts $r
fee0: 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22  esult\n".      "
fef0: 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20  }\n".      "set 
ff00: 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22  line {}\n".    "
ff10: 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
ff20: 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c    "append line \
ff30: 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  \n\n".    "}\n".
ff40: 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66    "}\n".;.#endif
ff50: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ../*.** If the m
ff60: 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 74 77  acro TCLSH is tw
ff70: 6f 2c 20 74 68 65 6e 20 67 65 74 20 74 68 65 20  o, then get the 
ff80: 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f  main loop code o
ff90: 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70  ut of.** the sep
ffa0: 61 72 61 74 65 20 66 69 6c 65 20 22 73 70 61 63  arate file "spac
ffb0: 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f  eanal_tcl.h"..*/
ffc0: 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74  .#if TCLSH==2.st
ffd0: 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
ffe0: 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64  oop[] = .#includ
fff0: 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c  e "spaceanal_tcl
10000 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64  .h".;.#endif..#d
10010 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e  efine TCLSH_MAIN
10020 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65   main   /* Neede
10030 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b  d to fake out mk
10040 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43  tclapp */.int TC
10050 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67  LSH_MAIN(int arg
10060 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
10070 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
10080 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e  nterp;.  Tcl_Fin
10090 64 45 78 65 63 75 74 61 62 6c 65 28 61 72 67 76  dExecutable(argv
100a0 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d  [0]);.  interp =
100b0 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72   Tcl_CreateInter
100c0 70 28 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49  p();.  Sqlite3_I
100d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66  nit(interp);.#if
100e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
100f0 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69    {.    extern i
10100 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49  nt Sqlitetest1_I
10110 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10120 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10130 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
10140 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10150 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10160 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
10170 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10180 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
10190 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63  itetest4_Init(Tc
101a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
101b0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
101c0 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f  etest5_Init(Tcl_
101d0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
101e0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
101f0 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est6_Init(Tcl_In
10200 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
10210 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
10220 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t7_Init(Tcl_Inte
10230 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
10240 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63   int Md5_Init(Tc
10250 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10260 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10270 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63  etestsse_Init(Tc
10280 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10290 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
102a0 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
102b0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20  Tcl_Interp*);.. 
102c0 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49     Sqlitetest1_I
102d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
102e0 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
102f0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
10300 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
10310 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
10320 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e  itetest4_Init(in
10330 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
10340 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65  etest5_Init(inte
10350 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
10360 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70  est6_Init(interp
10370 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
10380 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t7_Init(interp);
10390 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61  .    Sqlitetesta
103a0 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  sync_Init(interp
103b0 29 3b 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74 28  );.    Md5_Init(
103c0 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20  interp);.#ifdef 
103d0 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20 53  SQLITE_SSE.    S
103e0 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69  qlitetestsse_Ini
103f0 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
10400 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
10410 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43  f( argc>=2 || TC
10420 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  LSH==2 ){.    in
10430 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  t i;.    Tcl_Set
10440 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
10450 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
10460 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
10470 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
10480 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
10490 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
104a0 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
104b0 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
104c0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
104d0 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
104e0 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
104f0 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
10500 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
10510 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
10520 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
10530 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
10540 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
10550 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
10560 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
10570 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10580 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
10590 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
105a0 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
105b0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
105c0 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
105d0 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70  ) zInfo = interp
105e0 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20  ->result;.      
105f0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
10600 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76  %s: %s\n", *argv
10610 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , zInfo);.      
10620 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
10630 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d    }.  if( argc<=
10640 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b  1 || TCLSH==2 ){
10650 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  .    Tcl_GlobalE
10660 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69  val(interp, zMai
10670 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nloop);.  }.  re
10680 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
10690 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23 65   /* TCLSH */..#e
106a0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
106b0 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a              (NO_TCL) */.