/ Hex Artifact Content
Login

Artifact d20bdf1822c47e367f5acd37823ffe67df40301c:


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 35 20 32 30 30 36 2f 30 33 2f 31 36 20 31 36  55 2006/03/16 16
01c0: 3a 31 39 3a 35 36 20 64 72 68 20 45 78 70 20 24  :19:56 drh Exp $
01d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54  .*/.#ifndef NO_T
01e0: 43 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74  CL     /* Omit t
01f0: 68 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69  his whole file i
0200: 66 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c  f TCL is unavail
0210: 61 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  able */..#includ
0220: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0230: 23 69 6e 63 6c 75 64 65 20 22 68 61 73 68 2e 68  #include "hash.h
0240: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
0250: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0260: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0270: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0280: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0290: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
02a0: 3e 0a 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f  >...#define NUM_
02b0: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31  PREPARED_STMTS 1
02c0: 30 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 52  0.#define MAX_PR
02d0: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30 30  EPARED_STMTS 100
02e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c 20 75  ../*.** If TCL u
02f0: 73 65 73 20 55 54 46 2d 38 20 61 6e 64 20 53 51  ses UTF-8 and SQ
0300: 4c 69 74 65 20 69 73 20 63 6f 6e 66 69 67 75 72  Lite is configur
0310: 65 64 20 74 6f 20 75 73 65 20 69 73 6f 38 38 35  ed to use iso885
0320: 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20 68 61  9, then we.** ha
0330: 76 65 20 74 6f 20 64 6f 20 61 20 74 72 61 6e 73  ve to do a trans
0340: 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f 69 6e  lation when goin
0350: 67 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  g between the tw
0360: 6f 2e 20 20 53 65 74 20 74 68 65 20 0a 2a 2a 20  o.  Set the .** 
0370: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
0380: 4e 45 45 44 45 44 20 6d 61 63 72 6f 20 74 6f 20  NEEDED macro to 
0390: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65  indicate that we
03a0: 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74   need to do.** t
03b0: 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e  his translation.
03c0: 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65    .*/.#if define
03d0: 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29 20 26  d(TCL_UTF_MAX) &
03e0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
03f0: 45 5f 55 54 46 38 29 0a 23 20 64 65 66 69 6e 65  E_UTF8).# define
0400: 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e   UTF_TRANSLATION
0410: 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e 64 69 66  _NEEDED 1.#endif
0420: 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c 20  ../*.** New SQL 
0430: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65  functions can be
0440: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
0450: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
0460: 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  uch function.** 
0470: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0480: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0490: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
04a0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
04b0: 65 66 20 73 74 72 75 63 74 20 53 71 6c 46 75 6e  ef struct SqlFun
04c0: 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72 75 63  c SqlFunc;.struc
04d0: 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20 54 63  t SqlFunc {.  Tc
04e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
04f0: 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69  ;   /* The TCL i
0500: 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65 63  nterpret to exec
0510: 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ute the function
0520: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
0530: 53 63 72 69 70 74 3b 20 20 20 20 20 2f 2a 20 54  Script;     /* T
0540: 68 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70 72 65  he Tcl_Obj repre
0550: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
0560: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74   script */.  int
0570: 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20   useEvalObjv;   
0580: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74     /* True if it
0590: 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20   is safe to use 
05a0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a  Tcl_EvalObjv */.
05b0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
05c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
05d0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
05e0: 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70   */.  SqlFunc *p
05f0: 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  Next;       /* N
0600: 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  ext function on 
0610: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  the list of them
0620: 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   all */.};../*.*
0630: 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  * New collation 
0640: 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69  sequences functi
0650: 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65  on can be create
0660: 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73  d as TCL scripts
0670: 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20  .  Each such.** 
0680: 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63  function is desc
0690: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
06a0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
06b0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
06c0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
06d0: 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71  ct SqlCollate Sq
06e0: 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74  lCollate;.struct
06f0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20   SqlCollate {.  
0700: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0710: 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  rp;   /* The TCL
0720: 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78   interpret to ex
0730: 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69  ecute the functi
0740: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  on */.  char *zS
0750: 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a  cript;        /*
0760: 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62   The script to b
0770: 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f  e run */.  SqlCo
0780: 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20  llate *pNext;   
0790: 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f   /* Next functio
07a0: 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  n on the list of
07b0: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a   them all */.};.
07c0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20  ./*.** Prepared 
07d0: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63  statements are c
07e0: 61 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72  ached for faster
07f0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63   execution.  Eac
0800: 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  h prepared.** st
0810: 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72  atement is descr
0820: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0830: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0840: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0850: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0860: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0870: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0880: 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65  t;.struct SqlPre
0890: 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71  paredStmt {.  Sq
08a0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
08b0: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
08c0: 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f  n linked list */
08d0: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
08e0: 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50  mt *pPrev;  /* P
08f0: 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c  revious on the l
0900: 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
0910: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
0920: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
0930: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
0940: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
0950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61            /* cha
0960: 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a  rs in zSql[] */.
0970: 20 20 63 68 61 72 20 7a 53 71 6c 5b 31 5d 3b 20    char zSql[1]; 
0980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
0990: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  xt of the SQL st
09a0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f  atement */.};../
09b0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
09c0: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
09d0: 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
09e0: 20 65 61 63 68 20 53 51 4c 69 74 65 20 64 61 74   each SQLite dat
09f0: 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20 68 61  abase.** that ha
0a00: 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
0a10: 20 74 68 65 20 53 51 4c 69 74 65 20 54 43 4c 20   the SQLite TCL 
0a20: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 74 79  interface..*/.ty
0a30: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0a40: 69 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a  iteDb SqliteDb;.
0a50: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
0a60: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0a80: 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74  * The "real" dat
0a90: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
0aa0: 20 4d 55 53 54 20 42 45 20 46 49 52 53 54 20 2a   MUST BE FIRST *
0ab0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
0ac0: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f  interp;        /
0ad0: 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65  * The interprete
0ae0: 72 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  r used for this 
0af0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
0b00: 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20  ar *zBusy;      
0b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0b20: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f  busy callback ro
0b30: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0b40: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
0b50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
0b60: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
0b70: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0b80: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0ba0: 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
0bb0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0bc0: 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20 20 20  r *zProfile;    
0bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0be0: 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20  rofile callback 
0bf0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0c00: 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20  r *zProgress;   
0c10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0c20: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
0c30: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0c40: 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20  ar *zAuth;      
0c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0c60: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
0c70: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0c80: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b  /.  char *zNull;
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0ca0: 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69  * Text to substi
0cb0: 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20  tute for an SQL 
0cc0: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
0cd0: 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20  SqlFunc *pFunc; 
0ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
0cf0: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
0d00: 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ons */.  Tcl_Obj
0d10: 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20   *pUpdateHook;  
0d20: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f      /* Update ho
0d30: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0d40: 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  y) */.  Tcl_Obj 
0d50: 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20  *pRollbackHook; 
0d60: 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68     /* Rollback h
0d70: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
0d80: 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ny) */.  SqlColl
0d90: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20  ate *pCollate;  
0da0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53      /* List of S
0db0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
0dc0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
0dd0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
0de0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
0df0: 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65   code of most re
0e00: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  cent sqlite3_exe
0e10: 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  c() */.  Tcl_Obj
0e20: 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64   *pCollateNeeded
0e30: 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e  ;   /* Collation
0e40: 20 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a   needed script *
0e50: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
0e60: 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f  tmt *stmtList; /
0e70: 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72  * List of prepar
0e80: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a  ed statements*/.
0e90: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0ea0: 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20  t *stmtLast; /* 
0eb0: 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69  Last statement i
0ec0: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0ed0: 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20  int maxStmt;    
0ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0ef0: 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e  e next maximum n
0f00: 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73  umber of stmtLis
0f10: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74  t */.  int nStmt
0f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0f30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
0f40: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d  tatements in stm
0f50: 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  tList */.};../*.
0f60: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73  ** Look at the s
0f70: 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20  cript prefix in 
0f80: 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62  pCmd.  We will b
0f90: 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
0fa0: 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72   script.** after
0fb0: 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67   first appending
0fc0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67   one or more arg
0fd0: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f  uments.  This ro
0fe0: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a  utine analyzes.*
0ff0: 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20  * the script to 
1000: 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66  see if it is saf
1010: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
1020: 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73  lObjv() on the s
1030: 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20  cript.** rather 
1040: 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65  than the more ge
1050: 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78  neral Tcl_EvalEx
1060: 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ().  Tcl_EvalObj
1070: 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66  v() is much.** f
1080: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72  aster..**.** Scr
1090: 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61  ipts that are sa
10a0: 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54  fe to use with T
10b0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f  cl_EvalObjv() co
10c0: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63  nsists of a.** c
10d0: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c  ommand name foll
10e0: 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20  owed by zero or 
10f0: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77  more arguments w
1100: 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20  ith no [...] or 
1110: 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72  $.** or {...} or
1120: 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e   ; to be seen an
1130: 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61  ywhere.  Most ca
1140: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63  llback scripts c
1150: 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73  onsist.** of jus
1160: 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  t a single proce
1170: 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  dure name and th
1180: 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71  ey meet this req
1190: 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  uirement..*/.sta
11a0: 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73  tic int safeToUs
11b0: 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e  eEvalObjv(Tcl_In
11c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
11d0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20  l_Obj *pCmd){.  
11e0: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20  /* We could try 
11f0: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
1200: 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29  with Tcl_Parse()
1210: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69  .  But we will i
1220: 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74  nstead.  ** just
1230: 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
1240: 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61   forbidden chara
1250: 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f  cters.  If any o
1260: 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a  f the forbidden.
1270: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
1280: 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20  appear in pCmd, 
1290: 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  we will report t
12a0: 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73  he string as uns
12b0: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  afe..  */.  cons
12c0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
12d0: 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65   n;.  z = Tcl_Ge
12e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
12f0: 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c  Cmd, &n);.  whil
1300: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
1310: 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29    int c = *(z++)
1320: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27  ;.    if( c=='$'
1330: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
1340: 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b  =';' ) return 0;
1350: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
1370: 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74  n SqlFunc struct
1380: 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ure with the giv
1390: 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65  en name.  Or cre
13a0: 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65  ate a new.** one
13b0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
13c0: 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  one cannot be fo
13d0: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  und.  Return a p
13e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
13f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1400: 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66  tatic SqlFunc *f
1410: 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74  indSqlFunc(Sqlit
1420: 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  eDb *pDb, const 
1430: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1440: 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65  SqlFunc *p, *pNe
1450: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e  w;.  int i;.  pN
1460: 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54  ew = (SqlFunc*)T
1470: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
1480: 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e  (*pNew) + strlen
1490: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20  (zName) + 1 );. 
14a0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28   pNew->zName = (
14b0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
14c0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65    for(i=0; zName
14d0: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d  [i]; i++){ pNew-
14e0: 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f  >zName[i] = tolo
14f0: 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d  wer(zName[i]); }
1500: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69  .  pNew->zName[i
1510: 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70  ] = 0;.  for(p=p
1520: 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d  Db->pFunc; p; p=
1530: 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20  p->pNext){ .    
1540: 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e  if( strcmp(p->zN
1550: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  ame, pNew->zName
1560: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
1570: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e  l_Free((char*)pN
1580: 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ew);.      retur
1590: 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n p;.    }.  }. 
15a0: 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20   pNew->interp = 
15b0: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70  pDb->interp;.  p
15c0: 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30  New->pScript = 0
15d0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
15e0: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
15f0: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65  pDb->pFunc = pNe
1600: 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  w;.  return pNew
1610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
1620: 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c  ize and free a l
1630: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
1640: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  statements.*/.st
1650: 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53  atic void flushS
1660: 74 6d 74 43 61 63 68 65 28 20 53 71 6c 69 74 65  tmtCache( Sqlite
1670: 44 62 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c  Db *pDb ){.  Sql
1680: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
1690: 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65  reStmt;..  while
16a0: 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  (  pDb->stmtList
16b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
16c0: 66 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73  finalize( pDb->s
16d0: 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29  tmtList->pStmt )
16e0: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d  ;.    pPreStmt =
16f0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a   pDb->stmtList;.
1700: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
1710: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
1720: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  t->pNext;.    Tc
1730: 6c 5f 46 72 65 65 28 20 28 63 68 61 72 2a 29 70  l_Free( (char*)p
1740: 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20  PreStmt );.  }. 
1750: 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b   pDb->nStmt = 0;
1760: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  .  pDb->stmtLast
1770: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1780: 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72  CL calls this pr
1790: 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20  ocedure when an 
17a0: 73 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65  sqlite3 database
17b0: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64   command is.** d
17c0: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
17d0: 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43  c void DbDeleteC
17e0: 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20  md(void *db){.  
17f0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
1800: 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20  (SqliteDb*)db;. 
1810: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
1820: 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pDb);.  sqlite3_
1830: 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a  close(pDb->db);.
1840: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46    while( pDb->pF
1850: 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75  unc ){.    SqlFu
1860: 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d  nc *pFunc = pDb-
1870: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d  >pFunc;.    pDb-
1880: 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e  >pFunc = pFunc->
1890: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44  pNext;.    Tcl_D
18a0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
18b0: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
18c0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
18d0: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
18e0: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
18f0: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
1900: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
1910: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
1920: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
1930: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
1940: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
1950: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
1960: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
1970: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
1980: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1990: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
19a0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
19b0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
19c0: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
19d0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
19e0: 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  le ){.    Tcl_Fr
19f0: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
1a00: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
1a10: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
1a20: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
1a30: 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
1a40: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
1a50: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1a60: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Null);.  }.  if(
1a70: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
1a80: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
1a90: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
1aa0: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d  UpdateHook);.  }
1ab0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c  .  if( pDb->pRol
1ac0: 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20  lbackHook ){.   
1ad0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1ae0: 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  t(pDb->pRollback
1af0: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
1b00: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
1b10: 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f  eded ){.    Tcl_
1b20: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
1b30: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
1b40: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65  );.  }.  Tcl_Fre
1b50: 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d  e((char*)pDb);.}
1b60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1b70: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
1b80: 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  hen a database f
1b90: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68  ile is locked wh
1ba0: 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
1bb0: 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f   execute SQL..*/
1bc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75  .static int DbBu
1bd0: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
1be0: 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b  cd, int nTries){
1bf0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1c00: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
1c10: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
1c20: 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20  ar zVal[30];..  
1c30: 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22 25  sprintf(zVal, "%
1c40: 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72  d", nTries);.  r
1c50: 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28  c = Tcl_VarEval(
1c60: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
1c70: 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56  ->zBusy, " ", zV
1c80: 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  al, (char*)0);. 
1c90: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
1ca0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
1cb0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
1cc0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
1cd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1cf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d00: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74   is invoked as t
1d10: 68 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c  he 'progress cal
1d20: 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64  lback' for the d
1d30: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1d40: 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73  ic int DbProgres
1d50: 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  sHandler(void *c
1d60: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
1d70: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
1d80: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
1d90: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a    assert( pDb->z
1da0: 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63  Progress );.  rc
1db0: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
1dc0: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  >interp, pDb->zP
1dd0: 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20  rogress);.  if( 
1de0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
1df0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
1e00: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
1e10: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
1e20: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
1e30: 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 0;.}..#ifndef
1e40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1e50: 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CE./*.** This ro
1e60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1e70: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 74 72  by the SQLite tr
1e80: 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  ace handler when
1e90: 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c  ever a new.** bl
1ea0: 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78  ock of SQL is ex
1eb0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c  ecuted.  The TCL
1ec0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
1ed0: 7a 54 72 61 63 65 20 69 73 20 65 78 65 63 75 74  zTrace is execut
1ee0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1ef0: 69 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  id DbTraceHandle
1f00: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
1f10: 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
1f20: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
1f30: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
1f40: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
1f50: 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r;..  Tcl_DStrin
1f60: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
1f70: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
1f80: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61  (&str, pDb->zTra
1f90: 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  ce, -1);.  Tcl_D
1fa0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1fb0: 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b  ent(&str, zSql);
1fc0: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
1fd0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
1fe0: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
1ff0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2000: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
2010: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
2020: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  ->interp);.}.#en
2030: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
2040: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
2050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2060: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
2070: 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c  he SQLite profil
2080: 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20  e handler after 
2090: 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53  a statement.** S
20a0: 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64 2e  QL has executed.
20b0: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
20c0: 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c   in pDb->zProfil
20d0: 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  e is evaluated..
20e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
20f0: 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28  bProfileHandler(
2100: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
2110: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69  char *zSql, sqli
2120: 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20  te_uint64 tm){. 
2130: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
2140: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
2150: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
2160: 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30  r;.  char zTm[10
2170: 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  0];..  sqlite3_s
2180: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2190: 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c  Tm)-1, zTm, "%ll
21a0: 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44  d", tm);.  Tcl_D
21b0: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
21c0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
21d0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
21e0: 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a  >zProfile, -1);.
21f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
2200: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
2210: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53   zSql);.  Tcl_DS
2220: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
2230: 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20  nt(&str, zTm);. 
2240: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
2250: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
2260: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
2270: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
2280: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
2290: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
22a0: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
22b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
22c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
22d0: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
22e0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
22f0: 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72    The.** TCL scr
2300: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d  ipt in pDb->zCom
2310: 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  mit is executed.
2320: 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20    If it returns 
2330: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69  non-zero or.** i
2340: 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65  f it throws an e
2350: 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72  xception, the tr
2360: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
2370: 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64  led back instead
2380: 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d  .** of being com
2390: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mitted..*/.stati
23a0: 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61  c int DbCommitHa
23b0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
23c0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
23d0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
23e0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
23f0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
2400: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
2410: 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
2420: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
2430: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
2440: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
2450: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
2460: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2470: 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n 0;.}..static v
2480: 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61  oid DbRollbackHa
2490: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65  ndler(void *clie
24a0: 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74  ntData){.  Sqlit
24b0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
24c0: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
24d0: 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e  ;.  assert(pDb->
24e0: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
24f0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
2500: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
2510: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52  >interp, pDb->pR
2520: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20  ollbackHook, 0) 
2530: 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67  ){.    Tcl_Backg
2540: 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e  roundError(pDb->
2550: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  interp);.  }.}..
2560: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70  static void DbUp
2570: 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76  dateHandler(.  v
2580: 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f  oid *p, .  int o
2590: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
25a0: 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *zDb, .  const c
25b0: 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71  har *zTbl, .  sq
25c0: 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64  lite_int64 rowid
25d0: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
25e0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
25f0: 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  *)p;.  Tcl_Obj *
2600: 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pCmd;..  assert(
2610: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
2620: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  k );.  assert( o
2630: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  p==SQLITE_INSERT
2640: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55   || op==SQLITE_U
2650: 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c  PDATE || op==SQL
2660: 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20  ITE_DELETE );.. 
2670: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c   pCmd = Tcl_Dupl
2680: 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55  icateObj(pDb->pU
2690: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63  pdateHook);.  Tc
26a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
26b0: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
26c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
26d0: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
26e0: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20  wStringObj(.    
26f0: 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  ( (op==SQLITE_IN
2700: 53 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28  SERT)?"INSERT":(
2710: 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54  op==SQLITE_UPDAT
2720: 45 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c  E)?"UPDATE":"DEL
2730: 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54  ETE"), -1));.  T
2740: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2750: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
2760: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2770: 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54  j(zDb, -1));.  T
2780: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2790: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
27a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
27b0: 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20  j(zTbl, -1));.  
27c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27d0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
27e0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
27f0: 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54  Obj(rowid));.  T
2800: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
2810: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
2820: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
2830: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2840: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
2850: 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  d(.  void *pCtx,
2860: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
2870: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e    int enc,.  con
2880: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
2890: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
28a0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
28b0: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
28c0: 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  *pScript = Tcl_D
28d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
28e0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
28f0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
2900: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
2910: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2920: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
2930: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
2940: 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31  ingObj(zName, -1
2950: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
2960: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
2970: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
2980: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2990: 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a  (pScript);.}../*
29a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
29c0: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f  aluate an SQL co
29d0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
29e0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
29f0: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
2a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a10: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20  tclSqlCollate(. 
2a20: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
2a30: 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nA,.  const v
2a40: 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
2a50: 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  B,.  const void 
2a60: 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c  *zB.){.  SqlColl
2a70: 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c  ate *p = (SqlCol
2a80: 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54  late *)pCtx;.  T
2a90: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
2aa0: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53   pCmd = Tcl_NewS
2ab0: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72  tringObj(p->zScr
2ac0: 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ipt, -1);.  Tcl_
2ad0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
2ae0: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
2af0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
2b00: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
2b10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2b20: 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c  (zA, nA));.  Tcl
2b30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2b40: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
2b50: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
2b60: 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29  ringObj(zB, nB))
2b70: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
2b80: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
2b90: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
2ba0: 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
2bb0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
2bc0: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
2bd0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
2be0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
2bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2c00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2c10: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
2c20: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
2c30: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
2c40: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
2c50: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
2c60: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
2c70: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2c80: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
2c90: 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b  e3_value**argv){
2ca0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20  .  SqlFunc *p = 
2cb0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
2cc0: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63  a(context);.  Tc
2cd0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69  l_Obj *pCmd;.  i
2ce0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
2cf0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
2d00: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
2d10: 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e  e are no argumen
2d20: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
2d30: 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  on, call Tcl_Eva
2d40: 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20  lObjEx on the.  
2d50: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
2d60: 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ct directly.  Th
2d70: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43  is allows the TC
2d80: 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65  L compiler to ge
2d90: 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79  nerate.    ** by
2da0: 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63  tecode for the c
2db0: 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69  ommand on the fi
2dc0: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
2dd0: 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20  nd thus make.   
2de0: 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69   ** subsequent i
2df0: 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20  nvocations much 
2e00: 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70  faster. */.    p
2e10: 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74  Cmd = p->pScript
2e20: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
2e30: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
2e40: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
2e50: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
2e60: 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63  pCmd, 0);.    Tc
2e70: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
2e80: 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
2e90: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
2ea0: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  re arguments to 
2eb0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  the function, ma
2ec0: 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70  ke a shallow cop
2ed0: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
2ee0: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c  script object, l
2ef0: 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d  append the argum
2f00: 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75  ents, then evalu
2f10: 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ate the copy..  
2f20: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22    **.    ** By "
2f30: 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77  shallow" copy, w
2f40: 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68  e mean a only th
2f50: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
2f60: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
2f70: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
2f80: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
2f90: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
2fa0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
2fb0: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
2fc0: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
2fd0: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
2fe0: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
2ff0: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
3000: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
3010: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
3020: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
3030: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
3040: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
3050: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
3060: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
3070: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
3080: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
3090: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
30a0: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
30b0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
30c0: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
30d0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
30e0: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
30f0: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
3100: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
3110: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
3120: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
3130: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
3140: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
3150: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
3160: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
3170: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
3180: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
3190: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
31a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
31b0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
31c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
31d0: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
31e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
31f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
3200: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
3210: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
3220: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
3230: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
3240: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
3250: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
3260: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
3270: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
3280: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
3290: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
32a0: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
32b0: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
32c0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
32d0: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
32e0: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
32f0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
3300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3310: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
3320: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
3330: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3340: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
3350: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
3360: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
3370: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
3380: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
3390: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
33a0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
33b0: 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  wIntObj(v);.    
33c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33d0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
33e0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
33f0: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
3400: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
3410: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
3420: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
3430: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
3440: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
3450: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
3460: 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  ble(pIn);.      
3470: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
3480: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a  ewDoubleObj(r);.
3490: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
34a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
34c0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
34d0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
34e0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b  tringObj("", 0);
34f0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
3500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3510: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
3520: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
3530: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
3540: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
3550: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
3560: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3570: 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  ((char *)sqlite3
3580: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29  _value_text(pIn)
3590: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
35a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
35b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35c0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74     rc = Tcl_List
35d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
35e0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
35f0: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  , pVal);.      i
3600: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
3610: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3620: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20  t(pCmd);.       
3630: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3640: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
3650: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
3660: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
3670: 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74  1); .        ret
3680: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
3690: 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75   }.    if( !p->u
36a0: 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20  seEvalObjv ){.  
36b0: 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f      /* Tcl_EvalO
36c0: 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f  bjEx() will auto
36d0: 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54  matically call T
36e0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66  cl_EvalObjv() if
36f0: 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69   pCmd.      ** i
3700: 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74  s a list without
3710: 20 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73   a string repres
3720: 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72  entation.  To pr
3730: 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a  event this from.
3740: 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69        ** happeni
3750: 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43  ng, make sure pC
3760: 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73  md has a valid s
3770: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
3780: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63  tion */.      Tc
3790: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64  l_GetString(pCmd
37a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
37b0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
37c0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
37d0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
37e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
37f0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
3800: 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20   }..  if( rc && 
3810: 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29  rc!=TCL_RETURN )
3820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
3830: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
3840: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
3850: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
3860: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73  p), -1); .  }els
3870: 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  e{.    Tcl_Obj *
3880: 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62  pVar = Tcl_GetOb
3890: 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  jResult(p->inter
38a0: 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  p);.    int n;. 
38b0: 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20     u8 *data;.   
38c0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70   char *zType = p
38d0: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
38e0: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
38f0: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61  me : "";.    cha
3900: 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a  r c = zType[0];.
3910: 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26      if( c=='b' &
3920: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
3930: 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26  bytearray")==0 &
3940: 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30  & pVar->bytes==0
3950: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   ){.      /* Onl
3960: 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20  y return a BLOB 
3970: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
3980: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
3990: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
39a0: 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69    ** has no stri
39b0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
39c0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61  n. */.      data
39d0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
39e0: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
39f0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
3a00: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
3a10: 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e  context, data, n
3a20: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
3a30: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
3a40: 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74  f( (c=='b' && st
3a50: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
3a60: 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  ean")==0) ||.   
3a70: 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26         (c=='i' &
3a80: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
3a90: 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20  int")==0) ){.   
3aa0: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
3ab0: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e  mObj(0, pVar, &n
3ac0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3ad0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
3ae0: 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  ext, n);.    }el
3af0: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
3b00: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
3b10: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
3b20: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
3b30: 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c      Tcl_GetDoubl
3b40: 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72  eFromObj(0, pVar
3b50: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &r);.      sql
3b60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
3b70: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a  le(context, r);.
3b80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
3b90: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
3ba0: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
3bb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
3bc0: 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20  WideInt v;.     
3bd0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
3be0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
3bf0: 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &v);.      sqlit
3c00: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
3c10: 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20  context, v);.   
3c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61   }else{.      da
3c30: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
3c40: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
3c50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
3c60: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
3c70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
3c80: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a  context, (char *
3c90: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
3ca0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
3cb0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
3cc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
3cd0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  THORIZATION./*.*
3ce0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75  * This is the au
3cf0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e  thentication fun
3d00: 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e  ction.  It appen
3d10: 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  ds the authentic
3d20: 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f  ation.** type co
3d30: 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61  de and the two a
3d40: 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64  rguments to zCmd
3d50: 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20  [] then invokes 
3d60: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e  the result.** on
3d70: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
3d80: 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20  .  The reply is 
3d90: 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65  examined to dete
3da0: 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20  rmine if the.** 
3db0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
3dc0: 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73  ails or succeeds
3dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3de0: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  auth_callback(. 
3df0: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
3e00: 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74  nt code,.  const
3e10: 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20   char *zArg1,.  
3e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
3e30: 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2,.  const char 
3e40: 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20  *zArg3,.  const 
3e50: 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20  char *zArg4.){. 
3e60: 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20   char *zCode;.  
3e70: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
3e80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
3e90: 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b  st char *zReply;
3ea0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3eb0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41   = (SqliteDb*)pA
3ec0: 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63  rg;..  switch( c
3ed0: 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
3ee0: 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20  SQLITE_COPY     
3ef0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
3f00: 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20  ="SQLITE_COPY"; 
3f10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3f20: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
3f30: 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  DEX      : zCode
3f40: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
3f50: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
3f60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3f70: 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20  REATE_TABLE     
3f80: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3f90: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20  _CREATE_TABLE"; 
3fa0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3fb0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
3fc0: 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65  MP_INDEX : zCode
3fd0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
3fe0: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
3ff0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4000: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
4010: 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53  TABLE : zCode="S
4020: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
4030: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
4040: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4050: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
4060: 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GGER: zCode="SQL
4070: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
4080: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
4090: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
40a0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
40b0: 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  W  : zCode="SQLI
40c0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
40d0: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
40e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
40f0: 41 54 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a  ATE_TRIGGER    :
4100: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
4110: 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20  REATE_TRIGGER"; 
4120: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4130: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
4140: 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  EW       : zCode
4150: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
4160: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
4170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
4180: 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20  LETE            
4190: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
41a0: 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a  DELETE"; break;.
41b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
41c0: 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20  DROP_INDEX      
41d0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
41e0: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62  E_DROP_INDEX"; b
41f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
4200: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
4210: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4220: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42  "SQLITE_DROP_TAB
4230: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
4240: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
4250: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20  _TEMP_INDEX   : 
4260: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
4270: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20  OP_TEMP_INDEX"; 
4280: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4290: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
42a0: 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65  _TABLE   : zCode
42b0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
42c0: 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  MP_TABLE"; break
42d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
42e0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
42f0: 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GER : zCode="SQL
4300: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
4310: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
4320: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
4330: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20  ROP_TEMP_VIEW   
4340: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4350: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22  _DROP_TEMP_VIEW"
4360: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4370: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  e SQLITE_DROP_TR
4380: 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f  IGGER      : zCo
4390: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
43a0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
43b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
43c0: 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20  _DROP_VIEW      
43d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
43e0: 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62  TE_DROP_VIEW"; b
43f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
4400: 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20  QLITE_INSERT    
4410: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4420: 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b  "SQLITE_INSERT";
4430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4440: 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20   SQLITE_PRAGMA  
4450: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4460: 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e="SQLITE_PRAGMA
4470: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4480: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20  se SQLITE_READ  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
44a0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44  ode="SQLITE_READ
44b0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
44c0: 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  se SQLITE_SELECT
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
44e0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45  ode="SQLITE_SELE
44f0: 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CT"; break;.    
4500: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e  case SQLITE_TRAN
4510: 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20  SACTION       : 
4520: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52  zCode="SQLITE_TR
4530: 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61  ANSACTION"; brea
4540: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4550: 54 45 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  TE_UPDATE       
4560: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
4570: 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72  LITE_UPDATE"; br
4580: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4590: 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20 20 20  LITE_ATTACH     
45a0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
45b0: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20  SQLITE_ATTACH"; 
45c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
45d0: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20  SQLITE_DETACH   
45e0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
45f0: 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22  ="SQLITE_DETACH"
4600: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4610: 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  e SQLITE_ALTER_T
4620: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
4630: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52  de="SQLITE_ALTER
4640: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
4650: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4660: 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
4670: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
4680: 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61  E_REINDEX"; brea
4690: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
46a0: 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20  TE_ANALYZE      
46b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
46c0: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62  LITE_ANALYZE"; b
46d0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
46e0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
46f0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
4700: 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20  "????"; break;. 
4710: 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67   }.  Tcl_DString
4720: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
4730: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
4740: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68  &str, pDb->zAuth
4750: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
4760: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4770: 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a  t(&str, zCode);.
4780: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4790: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
47a0: 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a   zArg1 ? zArg1 :
47b0: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
47c0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
47d0: 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a  (&str, zArg2 ? z
47e0: 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg2 : "");.  Tc
47f0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
4800: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
4810: 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29  g3 ? zArg3 : "")
4820: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
4830: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
4840: 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34  r, zArg4 ? zArg4
4850: 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54   : "");.  rc = T
4860: 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44  cl_GlobalEval(pD
4870: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
4880: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
4890: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
48a0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a  gFree(&str);.  z
48b0: 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53  Reply = Tcl_GetS
48c0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
48d0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  >interp);.  if( 
48e0: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
48f0: 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b  QLITE_OK")==0 ){
4900: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4910: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
4920: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
4930: 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30  SQLITE_DENY")==0
4940: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
4950: 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73  ITE_DENY;.  }els
4960: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
4970: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f  ply,"SQLITE_IGNO
4980: 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  RE")==0 ){.    r
4990: 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  c = SQLITE_IGNOR
49a0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
49b0: 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20  rc = 999;.  }.  
49c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
49d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
49e0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
49f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74   */../*.** zText
4a00: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4a10: 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76   text obtained v
4a20: 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65  ia an sqlite3_re
4a30: 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f  sult_text().** o
4a40: 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66  r similar interf
4a50: 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ace. This routin
4a60: 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20  e returns a Tcl 
4a70: 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a  string object, .
4a80: 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ** reference cou
4a90: 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e  nt set to 0, con
4aa0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74  taining the text
4ab0: 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69  . If a translati
4ac0: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73  on.** between is
4ad0: 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20  o8859 and UTF-8 
4ae0: 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20  is required, it 
4af0: 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f  is preformed..*/
4b00: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
4b10: 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61  *dbTextToObj(cha
4b20: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b  r const *zText){
4b30: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c  .  Tcl_Obj *pVal
4b40: 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41  ;.#ifdef UTF_TRA
4b50: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a  NSLATION_NEEDED.
4b60: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43    Tcl_DString dC
4b70: 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ol;.  Tcl_DStrin
4b80: 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20  gInit(&dCol);.  
4b90: 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74  Tcl_ExternalToUt
4ba0: 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a  fDString(NULL, z
4bb0: 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29  Text, -1, &dCol)
4bc0: 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e  ;.  pVal = Tcl_N
4bd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
4be0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43  DStringValue(&dC
4bf0: 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ol), -1);.  Tcl_
4c00: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f  DStringFree(&dCo
4c10: 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c  l);.#else.  pVal
4c20: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4c30: 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a  Obj(zText, -1);.
4c40: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
4c50: 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pVal;.}../*.** T
4c60: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
4c70: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
4c80: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
4c90: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
4ca0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
4cb0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
4cc0: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
4cd0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
4ce0: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
4cf0: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
4d00: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
4d10: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
4d20: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ls..**.** The in
4d30: 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20  terface is like 
4d40: 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e  "readline" but n
4d50: 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65  o command-line e
4d60: 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e  diting.** is don
4d70: 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20  e..**.** copied 
4d80: 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f  from shell.c fro
4d90: 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d  m '.import' comm
4da0: 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  and.*/.static ch
4db0: 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  ar *local_getlin
4dc0: 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c  e(char *zPrompt,
4dd0: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
4de0: 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74  ar *zLine;.  int
4df0: 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b   nLine;.  int n;
4e00: 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e  .  int eol;..  n
4e10: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
4e20: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
4e30: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
4e40: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
4e50: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c  ;.  n = 0;.  eol
4e60: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21   = 0;.  while( !
4e70: 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  eol ){.    if( n
4e80: 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20  +100>nLine ){.  
4e90: 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e      nLine = nLin
4ea0: 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20  e*2 + 100;.     
4eb0: 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63   zLine = realloc
4ec0: 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a  (zLine, nLine);.
4ed0: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d        if( zLine=
4ee0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4ef0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65     }.    if( fge
4f00: 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c  ts(&zLine[n], nL
4f10: 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20  ine - n, in)==0 
4f20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  ){.      if( n==
4f30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65  0 ){.        fre
4f40: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
4f50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4f60: 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b    }.      zLine[
4f70: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
4f80: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  l = 1;.      bre
4f90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  ak;.    }.    wh
4fa0: 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b  ile( zLine[n] ){
4fb0: 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   n++; }.    if( 
4fc0: 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31  n>0 && zLine[n-1
4fd0: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
4fe0: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   n--;.      zLin
4ff0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
5000: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  eol = 1;.    }. 
5010: 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61   }.  zLine = rea
5020: 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31  lloc( zLine, n+1
5030: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69   );.  return zLi
5040: 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ne;.}../*.** The
5050: 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
5060: 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20  d below creates 
5070: 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  a new Tcl comman
5080: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
5090: 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e  nnection it open
50a0: 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64  s to an SQLite d
50b0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
50c0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
50d0: 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e  d.** whenever on
50e0: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
50f0: 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63  ction-specific c
5100: 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75  ommands is execu
5110: 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20  ted.** in Tcl.  
5120: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
5130: 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65  you run Tcl code
5140: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
5150: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  *       sqlite3 
5160: 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73  db1  "my_databas
5170: 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20  e".**       db1 
5180: 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  close.**.** The 
5190: 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70  first command op
51a0: 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ens a connection
51b0: 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61   to the "my_data
51c0: 62 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a  base" database.*
51d0: 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74  * and calls that
51e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31   connection "db1
51f0: 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63  ".  The second c
5200: 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68  ommand causes th
5210: 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  is.** subroutine
5220: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a   to be invoked..
5230: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
5240: 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c  ObjCmd(void *cd,
5250: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5260: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
5270: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
5280: 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
5290: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
52a0: 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63  )cd;.  int choic
52b0: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43  e;.  int rc = TC
52c0: 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63  L_OK;.  static c
52d0: 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74  onst char *DB_st
52e0: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75  rs[] = {.    "au
52f0: 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20  thorizer",      
5300: 20 20 20 22 62 75 73 79 22 2c 20 20 20 20 20 20     "busy",      
5310: 20 20 20 20 20 20 20 20 22 63 61 63 68 65 22 2c          "cache",
5320: 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20  .    "changes", 
5330: 20 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73             "clos
5340: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5350: 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20 20 22  "collate",.    "
5360: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
5370: 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f  ",   "commit_hoo
5380: 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d 70 6c  k",       "compl
5390: 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70 79 22  ete",.    "copy"
53a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
53b0: 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20  "errorcode",    
53c0: 20 20 20 20 20 22 65 76 61 6c 22 2c 0a 20 20 20       "eval",.   
53d0: 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20 20   "exists",      
53e0: 20 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e         "function
53f0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 6c 61 73  ",          "las
5400: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
5410: 0a 20 20 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22  .    "nullvalue"
5420: 2c 20 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63  ,          "onec
5430: 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20  olumn",         
5440: 22 70 72 6f 66 69 6c 65 22 2c 0a 20 20 20 20 22  "profile",.    "
5450: 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20  progress",      
5460: 20 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20       "rekey",   
5470: 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c 62            "rollb
5480: 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22  ack_hook",.    "
5490: 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
54a0: 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e       "total_chan
54b0: 67 65 73 22 2c 20 20 20 20 20 22 74 72 61 63 65  ges",     "trace
54c0: 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61 63 74  ",.    "transact
54d0: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22 75 70  ion",        "up
54e0: 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  date_hook",     
54f0: 20 20 22 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20    "version",.   
5500: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5510: 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e        .  };.  en
5520: 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20  um DB_enum {.   
5530: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20   DB_AUTHORIZER, 
5540: 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 20         DB_BUSY, 
5550: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
5560: 41 43 48 45 2c 0a 20 20 20 20 44 42 5f 43 48 41  ACHE,.    DB_CHA
5570: 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 20  NGES,           
5580: 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 20  DB_CLOSE,       
5590: 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c       DB_COLLATE,
55a0: 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  .    DB_COLLATIO
55b0: 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42 5f 43 4f  N_NEEDED,  DB_CO
55c0: 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20  MMIT_HOOK,      
55d0: 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20  DB_COMPLETE,.   
55e0: 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20   DB_COPY,       
55f0: 20 20 20 20 20 20 20 44 42 5f 45 52 52 4f 52 43         DB_ERRORC
5600: 4f 44 45 2c 20 20 20 20 20 20 20 20 44 42 5f 45  ODE,        DB_E
5610: 56 41 4c 2c 0a 20 20 20 20 44 42 5f 45 58 49 53  VAL,.    DB_EXIS
5620: 54 53 2c 20 20 20 20 20 20 20 20 20 20 20 20 44  TS,            D
5630: 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20  B_FUNCTION,     
5640: 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45      DB_LAST_INSE
5650: 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44 42  RT_ROWID,.    DB
5660: 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20 20  _NULLVALUE,     
5670: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
5680: 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f 46  ,        DB_PROF
5690: 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f 47  ILE,.    DB_PROG
56a0: 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 20 44  RESS,          D
56b0: 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20 20  B_REKEY,        
56c0: 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f      DB_ROLLBACK_
56d0: 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54 49 4d  HOOK,.    DB_TIM
56e0: 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 20  EOUT,           
56f0: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
5700: 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a 20  ,    DB_TRACE,. 
5710: 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f     DB_TRANSACTIO
5720: 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50 44 41  N,       DB_UPDA
5730: 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42  TE_HOOK,      DB
5740: 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20 20  _VERSION.  };.  
5750: 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74  /* don't leave t
5760: 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f  railing commas o
5770: 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f  n DB_enum, it co
5780: 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78  nfuses the AIX x
5790: 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a  lc compiler */..
57a0: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
57b0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
57c0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
57d0: 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e  objv, "SUBCOMMAN
57e0: 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74  D ...");.    ret
57f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5800: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
5810: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
5820: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42  erp, objv[1], DB
5830: 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  _strs, "option",
5840: 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a   0, &choice) ){.
5850: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5860: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  RROR;.  }..  swi
5870: 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e  tch( (enum DB_en
5880: 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20  um)choice ){..  
5890: 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72  /*    $db author
58a0: 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  izer ?CALLBACK?.
58b0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
58c0: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
58d0: 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65  ack to authorize
58e0: 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74   each SQL operat
58f0: 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a  ion as it is.  *
5900: 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61  * compiled.  5 a
5910: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70  rguments are app
5920: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c  ended to the cal
5930: 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20  lback before it 
5940: 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a  is.  ** invoked:
5950: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29  .  **.  **   (1)
5960: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
5970: 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c  on type (ex: SQL
5980: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5990: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
59a0: 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29   ...).  **   (2)
59b0: 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69   First descripti
59c0: 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73  ve name (depends
59d0: 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   on authorizatio
59e0: 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28  n type).  **   (
59f0: 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69  3) Second descri
5a00: 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20  ptive name.  ** 
5a10: 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68    (4) Name of th
5a20: 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20  e database (ex: 
5a30: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a  "main", "temp").
5a40: 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20    **   (5) Name 
5a50: 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20  of trigger that 
5a60: 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63  is doing the acc
5a70: 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ess.  **.  ** Th
5a80: 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c  e callback shoul
5a90: 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74  d return on of t
5aa0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5ab0: 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c  ings: SQLITE_OK,
5ac0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e  .  ** SQLITE_IGN
5ad0: 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44  ORE, or SQLITE_D
5ae0: 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ENY.  Any other 
5af0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
5b00: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20  an error..  **. 
5b10: 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68   ** If this meth
5b20: 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  od is invoked wi
5b30: 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c  th no arguments,
5b40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74   the current aut
5b50: 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  horization.  ** 
5b60: 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20  callback string 
5b70: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
5b80: 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48  /.  case DB_AUTH
5b90: 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66  ORIZER: {.#ifdef
5ba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5bb0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54  HORIZATION.    T
5bc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5bd0: 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69  interp, "authori
5be0: 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c  zation not avail
5bf0: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
5c00: 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ld", 0);.    ret
5c10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
5c20: 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a  else.    if( obj
5c30: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
5c40: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
5c50: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
5c60: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
5c70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5c80: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
5c90: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
5ca0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
5cb0: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
5cc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5cd0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75  interp, pDb->zAu
5ce0: 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  th, 0);.      }.
5cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d00: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20   char *zAuth;.  
5d10: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
5d20: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
5d30: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
5d40: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
5d50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5d60: 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74   zAuth = Tcl_Get
5d70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
5d80: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
5d90: 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26      if( zAuth &&
5da0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
5db0: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54    pDb->zAuth = T
5dc0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
5dd0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
5de0: 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20  cpy(pDb->zAuth, 
5df0: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 65  zAuth);.      }e
5e00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
5e10: 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->zAuth = 0;.   
5e20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5e30: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
5e40: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
5e50: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
5e60: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
5e70: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
5e80: 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  b, auth_callback
5e90: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
5ea0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5eb0: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
5ec0: 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  zer(pDb->db, 0, 
5ed0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
5ee0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
5ef0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
5f00: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
5f10: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
5f20: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
5f30: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
5f40: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
5f50: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
5f60: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
5f70: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
5f80: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
5f90: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
5fa0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
5fb0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5fc0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
5fd0: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
5fe0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5ff0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
6000: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
6010: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
6020: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
6030: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6040: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30  p, pDb->zBusy, 0
6050: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
6070: 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69   *zBusy;.      i
6080: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
6090: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
60a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
60b0: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
60c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73      }.      zBus
60d0: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
60e0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
60f0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
6100: 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e  f( zBusy && len>
6110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
6120: 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c  ->zBusy = Tcl_Al
6130: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
6140: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
6150: 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79  Db->zBusy, zBusy
6160: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6170: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
6180: 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sy = 0;.      }.
6190: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
61a0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
61b0: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
61c0: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
61d0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
61e0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75  er(pDb->db, DbBu
61f0: 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  syHandler, pDb);
6200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
6220: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
6230: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
6240: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
6250: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
6260: 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73    $db cache flus
6270: 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  h.  **     $db c
6280: 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a  ache size n.  **
6290: 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  .  ** Flush the 
62a0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
62b0: 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74  nt cache, or set
62c0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
62d0: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68  ber of.  ** cach
62e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
62f0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41   */.  case DB_CA
6300: 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  CHE: {.    char 
6310: 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74  *subCmd;.    int
6320: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   n;..    if( obj
6330: 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c<=2 ){.      Tc
6340: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6350: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
6360: 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61  "cache option ?a
6370: 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  rg?");.      ret
6380: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6390: 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20     }.    subCmd 
63a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
63b0: 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c  romObj( objv[2],
63c0: 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73   0 );.    if( *s
63d0: 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74  ubCmd=='f' && st
63e0: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75  rcmp(subCmd,"flu
63f0: 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sh")==0 ){.     
6400: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
6410: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
6420: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6430: 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68   2, objv, "flush
6440: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
6450: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6470: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
6480: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
6490: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
64a0: 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20  *subCmd=='s' && 
64b0: 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73  strcmp(subCmd,"s
64c0: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
64d0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
64e0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
64f0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6500: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65  , 2, objv, "size
6510: 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65   n");.        re
6520: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6530: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6540: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52       if( TCL_ERR
6550: 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OR==Tcl_GetIntFr
6560: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
6570: 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20  jv[3], &n) ){.  
6580: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
6590: 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
65a0: 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72  , "cannot conver
65b0: 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  t \"", .        
65c0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
65d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
65e0: 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69  [3],0), "\" to i
65f0: 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20  nteger", 0);.   
6600: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
6610: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
6620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6630: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
6640: 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74           flushSt
6650: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
6660: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
6670: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
6680: 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45  se if( n>MAX_PRE
6690: 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20  PARED_STMTS ){. 
66a0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d             n = M
66b0: 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
66c0: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  S;.          }. 
66d0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61           pDb->ma
66e0: 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20  xStmt = n;.     
66f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
6710: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
6720: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74  interp, "bad opt
6730: 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20  ion \"", .      
6740: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
6750: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
6760: 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62  ,0), "\": must b
6770: 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22  e flush or size"
6780: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
6790: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
67a0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
67b0: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62   }..  /*     $db
67c0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20   changes.  **.  
67d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
67e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
67f0: 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
6800: 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
6810: 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68  leted by.  ** th
6820: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e  e most recent IN
6830: 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
6840: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
6850: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  , not including 
6860: 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65  .  ** any change
6870: 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65  s made by trigge
6880: 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f  r programs..  */
6890: 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47  .  case DB_CHANG
68a0: 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
68b0: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
68c0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
68d0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
68e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
68f0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
6900: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6910: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
6920: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
6930: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
6940: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
6950: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
6960: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62  ite3_changes(pDb
6970: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
6980: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
6990: 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20  $db close.  **. 
69a0: 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65   ** Shutdown the
69b0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20   database.  */. 
69c0: 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20   case DB_CLOSE: 
69d0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  {.    Tcl_Delete
69e0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
69f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6a00: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
6a10: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
6a20: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
6a30: 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d   $db collate NAM
6a40: 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
6a50: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
6a60: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
6a70: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
6a80: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
6a90: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
6aa0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
6ab0: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
6ac0: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
6ad0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
6ae0: 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  DB_COLLATE: {.  
6af0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
6b00: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72  ollate;.    char
6b10: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
6b20: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
6b30: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
6b40: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
6b50: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6b60: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6b70: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
6b80: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
6b90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6ba0: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
6bb0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6bc0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
6bd0: 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
6be0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6bf0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
6c00: 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
6c10: 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f  Collate = (SqlCo
6c20: 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63  llate*)Tcl_Alloc
6c30: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61  ( sizeof(*pColla
6c40: 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20  te) + nScript + 
6c50: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  1 );.    if( pCo
6c60: 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72  llate==0 ) retur
6c70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6c80: 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72   pCollate->inter
6c90: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
6ca0: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20  pCollate->pNext 
6cb0: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
6cc0: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a  .    pCollate->z
6cd0: 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29  Script = (char*)
6ce0: 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20  &pCollate[1];.  
6cf0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
6d00: 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  = pCollate;.    
6d10: 73 74 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d  strcpy(pCollate-
6d20: 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70  >zScript, zScrip
6d30: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  t);.    if( sqli
6d40: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
6d50: 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
6d60: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
6d70: 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  , .        pColl
6d80: 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61  ate, tclSqlColla
6d90: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  te) ){.      Tcl
6da0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
6db0: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
6dc0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
6dd0: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
6de0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6df0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6e00: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6e10: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
6e20: 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  db collation_nee
6e30: 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ded SCRIPT.  **.
6e40: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
6e50: 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
6e60: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
6e70: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
6e80: 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
6e90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
6ea0: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
6eb0: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
6ec0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
6ed0: 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e  e DB_COLLATION_N
6ee0: 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28  EEDED: {.    if(
6ef0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
6f00: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6f10: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
6f20: 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
6f30: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6f40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6f50: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
6f60: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
6f70: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6f80: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
6f90: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  Needed);.    }. 
6fa0: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
6fb0: 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70  Needed = Tcl_Dup
6fc0: 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32  licateObj(objv[2
6fd0: 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  ]);.    Tcl_Incr
6fe0: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
6ff0: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
7000: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61     sqlite3_colla
7010: 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d  tion_needed(pDb-
7020: 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c  >db, pDb, tclCol
7030: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
7040: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
7050: 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f  *    $db commit_
7060: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  hook ?CALLBACK?.
7070: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
7080: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
7090: 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ack just before 
70a0: 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79  committing every
70b0: 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   SQL transaction
70c0: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
70d0: 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e  llback throws an
70e0: 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65   exception or re
70f0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
7100: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72  then the.  ** tr
7110: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f  ansaction is abo
7120: 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41  rted.  If CALLBA
7130: 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  CK is an empty s
7140: 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62  tring, the callb
7150: 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ack.  ** is disa
7160: 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  bled..  */.  cas
7170: 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b  e DB_COMMIT_HOOK
7180: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
7190: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
71a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
71b0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
71c0: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
71d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
71e0: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
71f0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
7200: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
7210: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
7220: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7230: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  (interp, pDb->zC
7240: 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  ommit, 0);.     
7250: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
7260: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
7270: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
7280: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
7290: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
72a0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
72b0: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
72c0: 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
72d0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
72e0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
72f0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
7300: 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
7310: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
7320: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
7330: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
7340: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
7350: 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
7360: 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   zCommit);.     
7370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7380: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
7390: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
73a0: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
73b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
73c0: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
73d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
73e0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
73f0: 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
7400: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
7410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7420: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
7430: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
7440: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
7450: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
7460: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
7470: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
7480: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
7490: 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
74a0: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
74b0: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
74c0: 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
74d0: 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
74e0: 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
74f0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
7500: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
7510: 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
7520: 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
7530: 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
7540: 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
7550: 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
7560: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
7570: 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
7580: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
7590: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
75a0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
75b0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
75c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
75d0: 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
75e0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
75f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
7600: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
7610: 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
7620: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7630: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
7640: 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
7650: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
7660: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
7670: 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
7680: 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
7690: 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
76a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
76b0: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
76c0: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
76d0: 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
76e0: 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
76f0: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
7700: 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
7710: 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
7720: 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
7730: 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
7740: 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
7750: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
7760: 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
7770: 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
7780: 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
7790: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
77a0: 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
77b0: 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
77c0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
77d0: 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
77e0: 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
77f0: 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
7800: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
7810: 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
7820: 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
7830: 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
7840: 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
7850: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
7860: 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
7870: 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
7880: 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
7890: 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
78a0: 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
78b0: 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
78c0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
78d0: 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
78e0: 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
78f0: 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
7900: 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
7910: 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
7920: 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
7930: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
7940: 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
7950: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
7960: 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
7970: 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
7980: 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
7990: 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
79a0: 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
79b0: 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
79c0: 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
79d0: 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
79e0: 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
79f0: 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
7a00: 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
7a10: 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
7a20: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
7a30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7a40: 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
7a50: 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
7a60: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
7a70: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
7a80: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
7a90: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
7aa0: 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
7ab0: 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
7ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7ad0: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
7ae0: 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
7af0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
7b00: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
7b10: 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
7b20: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  */.    int rc;  
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
7b50: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  e */.    int nCo
7b60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7b70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7b80: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
7b90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
7ba0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
7bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7bc0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
7bd0: 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f  an SQL string */
7be0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  .    int i, j;  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7c10: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
7c20: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
7c30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7c40: 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b  f bytes in zSep[
7c50: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75  ] */.    int nNu
7c60: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7c70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7c80: 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c  f bytes in zNull
7c90: 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  [] */.    char *
7ca0: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
7cb0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20        /* An SQL 
7cc0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
7cd0: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20   char *zLine;   
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7cf0: 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  A single line of
7d00: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
7d10: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
7d20: 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20   **azCol;       
7d30: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65          /* zLine
7d40: 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74  [] broken up int
7d50: 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  o columns */.   
7d60: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d80: 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68  How to commit ch
7d90: 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c  anges */.    FIL
7da0: 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
7db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7dc0: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
7dd0: 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30    int lineno = 0
7de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7df0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20   Line number of 
7e00: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
7e10: 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b    char zLineNum[
7e20: 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  80];          /*
7e30: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69   Line number pri
7e40: 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  nt buffer */.   
7e50: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
7e60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
7e70: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f  interp result */
7e80: 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70  ..    char *zSep
7e90: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c  ;.    char *zNul
7ea0: 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  l;.    if( objc<
7eb0: 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20  5 || objc>7 ){. 
7ec0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
7ed0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
7ee0: 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20   objv, .        
7ef0: 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52   "CONFLICT-ALGOR
7f00: 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e  ITHM TABLE FILEN
7f10: 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  AME ?SEPARATOR? 
7f20: 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22  ?NULLINDICATOR?"
7f30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7f40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7f50: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36  .    if( objc>=6
7f60: 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d   ){.      zSep =
7f70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
7f80: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30  omObj(objv[5], 0
7f90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7fa0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b      zSep = "\t";
7fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
7fc0: 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20  bjc>=7 ){.      
7fd0: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
7fe0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
7ff0: 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[6], 0);.    }e
8000: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  lse{.      zNull
8010: 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20   = "";.    }.   
8020: 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c   zConflict = Tcl
8030: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8040: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
8050: 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
8060: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8070: 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20  (objv[3], 0);.  
8080: 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
8090: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
80a0: 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[4], 0);.    
80b0: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53  nSep = strlen(zS
80c0: 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d  ep);.    nNull =
80d0: 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a   strlen(zNull);.
80e0: 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
80f0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
8100: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8110: 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75  , "Error: non-nu
8120: 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  ll separator req
8130: 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c  uired for copy",
8140: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
8150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8160: 20 7d 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65   }.    if(sqlite
8170: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
8180: 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20  ct, "rollback") 
8190: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
81a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
81b0: 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
81c0: 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
81d0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
81e0: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66  mp(zConflict, "f
81f0: 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26  ail"    ) != 0 &
8200: 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  &.       sqlite3
8210: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
8220: 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
8230: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
8240: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
8250: 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65  nflict, "replace
8260: 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20  " ) != 0 ) {.   
8270: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8280: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
8290: 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69  or: \"", zConfli
82a0: 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ct, .           
82b0: 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61   "\", conflict-a
82c0: 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65  lgorithm must be
82d0: 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63   one of: rollbac
82e0: 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  k, ".           
82f0: 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69   "abort, fail, i
8300: 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63  gnore, or replac
8310: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
8320: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8330: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
8340: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8350: 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
8360: 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  '%q'", zTable);.
8370: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
8380: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
8390: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
83a0: 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63  , "Error: no suc
83b0: 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62  h table: ", zTab
83c0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  le, 0);.      re
83d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
83e0: 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
83f0: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
8400: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8410: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
8420: 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d  , zSql, 0, &pStm
8430: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
8440: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
8450: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
8460: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8470: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
8480: 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
8490: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
84a0: 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
84b0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
84c0: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
84d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
84e0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
84f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
8500: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
8510: 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
8520: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8530: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8540: 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
8550: 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
8560: 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
8570: 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
8580: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8590: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
85a0: 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
85b0: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  )", 0);.      re
85c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
85d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
85e0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
85f0: 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +50, zSql, "INSE
8600: 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25  RT OR %q INTO '%
8610: 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20  q' VALUES(?",.  
8620: 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74         zConflict
8630: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
8640: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
8650: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
8660: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8670: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
8680: 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
8690: 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
86a0: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
86b0: 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
86c0: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
86d0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
86e0: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  Db->db, zSql, 0,
86f0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
8700: 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20   free(zSql);.   
8710: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
8720: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8730: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8740: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
8750: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
8760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8770: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
8780: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8790: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
87a0: 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46     in = fopen(zF
87b0: 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  ile, "rb");.    
87c0: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
87d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
87e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
87f0: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
8800: 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20  file: ", zFile, 
8810: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
8820: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8830: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
8840: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8850: 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20    }.    azCol = 
8860: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
8870: 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31  zCol[0])*(nCol+1
8880: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43  ) );.    if( azC
8890: 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ol==0 ) {.      
88a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
88b0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
88c0: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
88d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f  , 0);.      fclo
88e0: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65  se(in);.      re
88f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8900: 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29      }.    (void)
8910: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
8920: 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  ->db, "BEGIN", 0
8930: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f  , 0, 0);.    zCo
8940: 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b  mmit = "COMMIT";
8950: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69  .    while( (zLi
8960: 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69  ne = local_getli
8970: 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b  ne(0, in))!=0 ){
8980: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  .      char *z;.
8990: 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20        i = 0;.   
89a0: 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
89b0: 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c     azCol[0] = zL
89c0: 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ine;.      for(i
89d0: 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b  =0, z=zLine; *z;
89e0: 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   z++){.        i
89f0: 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26  f( *z==zSep[0] &
8a00: 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65  & strncmp(z, zSe
8a10: 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20  p, nSep)==0 ){. 
8a20: 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b           *z = 0;
8a30: 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
8a40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
8a50: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
8a60: 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26      azCol[i] = &
8a70: 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20  z[nSep];.       
8a80: 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31       z += nSep-1
8a90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8ab0: 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e        if( i+1!=n
8ac0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Col ){.        c
8ad0: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
8ae0: 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63     zErr = malloc
8af0: 28 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46  (200 + strlen(zF
8b00: 69 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73  ile));.        s
8b10: 70 72 69 6e 74 66 28 7a 45 72 72 2c 0a 20 20 20  printf(zErr,.   
8b20: 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20          "Error: 
8b30: 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70 65  %s line %d: expe
8b40: 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
8b50: 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75 6e  of data but foun
8b60: 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
8b70: 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c    zFile, lineno,
8b80: 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20   nCol, i+1);.   
8b90: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
8ba0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
8bb0: 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rr, 0);.        
8bc0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
8bd0: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52      zCommit = "R
8be0: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
8bf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8c00: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8c10: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
8c20: 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66        /* check f
8c30: 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66  or null data, if
8c40: 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c   so, bind as nul
8c50: 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20  l */.        if 
8c60: 28 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72  ((nNull>0 && str
8c70: 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e  cmp(azCol[i], zN
8c80: 75 6c 6c 29 3d 3d 30 29 20 7c 7c 20 73 74 72 6c  ull)==0) || strl
8c90: 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 29  en(azCol[i])==0)
8ca0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
8cb0: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
8cc0: 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20  Stmt, i+1);.    
8cd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ce0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
8cf0: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b  d_text(pStmt, i+
8d00: 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c  1, azCol[i], -1,
8d10: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
8d20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8d30: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8d40: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
8d50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8d60: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
8d70: 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29       free(zLine)
8d80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
8d90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8da0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
8db0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
8dc0: 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
8dd0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
8de0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f   0);.        zCo
8df0: 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
8e00: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
8e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8e20: 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b      free(azCol);
8e30: 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
8e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
8e50: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
8e60: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
8e70: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43  exec(pDb->db, zC
8e80: 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ommit, 0, 0, 0);
8e90: 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69  ..    if( zCommi
8ea0: 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20  t[0] == 'C' ){. 
8eb0: 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c       /* success,
8ec0: 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e   set result as n
8ed0: 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70  umber of lines p
8ee0: 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
8ef0: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
8f00: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
8f10: 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  erp);.      Tcl_
8f20: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
8f30: 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  t, lineno);.    
8f40: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
8f50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8f60: 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65  /* failure, appe
8f70: 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20  nd lineno where 
8f80: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
8f90: 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 4e 75 6d  sprintf(zLineNum
8fa0: 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20  ,"%d",lineno);. 
8fb0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
8fc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20  esult(interp,", 
8fd0: 66 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f  failed while pro
8fe0: 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c  cessing line: ",
8ff0: 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20  zLineNum,0);.   
9000: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
9010: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
9020: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
9030: 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63  **    $db errorc
9040: 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ode.  **.  ** Re
9050: 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63  turn the numeric
9060: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
9070: 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79   was returned by
9080: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9090: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
90a0: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20  lite3_exec()..  
90b0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52  */.  case DB_ERR
90c0: 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63  ORCODE: {.    Tc
90d0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
90e0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
90f0: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  tObj(sqlite3_err
9100: 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b  code(pDb->db)));
9110: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
9120: 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20     .  /*.  **   
9130: 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f   $db eval $sql ?
9140: 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f  array? ?{  ...co
9150: 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20  de... }?.  **   
9160: 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24   $db onecolumn $
9170: 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  sql.  **.  ** Th
9180: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
9190: 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75  in $sql is evalu
91a0: 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20  ated.  For each 
91b0: 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20  row, the values 
91c0: 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20  are.  ** placed 
91d0: 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  in elements of t
91e0: 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22  he array named "
91f0: 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f  array" and ...co
9200: 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65  de... is execute
9210: 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
9220: 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72  y" and "code" ar
9230: 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  e omitted, then 
9240: 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65  no callback is e
9250: 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20  very invoked..  
9260: 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73  ** If "array" is
9270: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
9280: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
9290: 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20  s are placed in 
92a0: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74  variables.  ** t
92b0: 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  hat have the sam
92c0: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69  e name as the fi
92d0: 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62  elds extracted b
92e0: 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  y the query..  *
92f0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f  *.  ** The oneco
9300: 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74  lumn method is t
9310: 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  he equivalent of
9320: 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65  :.  **     linde
9330: 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c  x [$db eval $sql
9340: 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ] 0.  */.  case 
9350: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20  DB_ONECOLUMN:.  
9360: 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20  case DB_EVAL:.  
9370: 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20  case DB_EXISTS: 
9380: 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
9390: 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20   *zSql;      /* 
93a0: 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  Next SQL stateme
93b0: 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f  nt to execute */
93c0: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
93d0: 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57  *zLeft;     /* W
93e0: 68 61 74 20 69 73 20 6c 65 66 74 20 61 66 74 65  hat is left afte
93f0: 72 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20  r first stmt in 
9400: 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69  zSql */.    sqli
9410: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
9420: 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53     /* Compiled S
9430: 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20  QL statment */. 
9440: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72     Tcl_Obj *pArr
9450: 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ay;       /* Nam
9460: 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20  e of array into 
9470: 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61 72  which results ar
9480: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
9490: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
94a0: 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70  t;      /* Scrip
94b0: 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63  t to run for eac
94c0: 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  h result set */.
94d0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70      Tcl_Obj **ap
94e0: 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61  Parm;      /* Pa
94f0: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65  rameters that ne
9500: 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66  ed a Tcl_DecrRef
9510: 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69  Count() */.    i
9520: 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20  nt nParm;       
9530: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9540: 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65 64 20  of entries used 
9550: 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20  in apParm[] */. 
9560: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72     Tcl_Obj *aPar
9570: 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61  m[10];    /* Sta
9580: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 70  tic space for ap
9590: 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f  Parm[] in the co
95a0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
95b0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20   Tcl_Obj *pRet; 
95c0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
95d0: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
95e0: 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72  */.    SqlPrepar
95f0: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
9600: 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ;  /* Pointer to
9610: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
9620: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
9630: 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63   rc2;..    if( c
9640: 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29  hoice==DB_EVAL )
9650: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
9660: 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a  <3 || objc>5 ){.
9670: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
9680: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9690: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f   2, objv, "SQL ?
96a0: 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52  ARRAY-NAME? ?SCR
96b0: 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20  IPT?");.        
96c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
96d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
96e0: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
96f0: 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  j();.      Tcl_I
9700: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
9710: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9720: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
9730: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
9740: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
9750: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
9760: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  L");.        ret
9770: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9790: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53   choice==DB_EXIS
97a0: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  TS ){.        pR
97b0: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  et = Tcl_NewBool
97c0: 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20  eanObj(0);.     
97d0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
97e0: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
97f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9800: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
9810: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9820: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
9830: 20 70 41 72 72 61 79 20 3d 20 70 53 63 72 69 70   pArray = pScrip
9840: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
9850: 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
9860: 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 30        pArray = 0
9870: 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  ;.      pScript 
9880: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d  = objv[3];.    }
9890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72  else{.      pArr
98a0: 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  ay = objv[3];.  
98b0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53      if( Tcl_GetS
98c0: 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d  tring(pArray)[0]
98d0: 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d 20 30  ==0 ) pArray = 0
98e0: 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  ;.      pScript 
98f0: 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d  = objv[4];.    }
9900: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
9910: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b  fCount(objv[2]);
9920: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  .    zSql = Tcl_
9930: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9940: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
9950: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c    while( rc==TCL
9960: 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29  _OK && zSql[0] )
9970: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
99a0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
99b0: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
99c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
99d0: 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74   of bind paramet
99e0: 65 72 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74  ers in the pStmt
99f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   */.      int nC
9a00: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
9a10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9a20: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9a30: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
9a40: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61       Tcl_Obj **a
9a50: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20  pColName = 0;   
9a60: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
9a70: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  mn names */.    
9a80: 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20    int len;      
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9aa0: 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66  String length of
9ab0: 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20   zSql */.  .    
9ac0: 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
9ad0: 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74   a SQL statement
9ae0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
9af0: 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  y been compiled 
9b00: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69  and.      ** whi
9b10: 63 68 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ch matches the n
9b20: 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ext sequence of 
9b30: 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  SQL..      */.  
9b40: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
9b50: 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20       pPreStmt = 
9b60: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
9b70: 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
9b80: 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69  n(zSql);.      i
9b90: 66 28 20 70 50 72 65 53 74 6d 74 20 26 26 20 73  f( pPreStmt && s
9ba0: 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70  qlite3_expired(p
9bb0: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 20  PreStmt->pStmt) 
9bc0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  ){.        flush
9bd0: 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a  StmtCache(pDb);.
9be0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
9bf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
9c00: 20 20 20 20 66 6f 72 28 3b 20 70 50 72 65 53 74      for(; pPreSt
9c10: 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72  mt; pPreStmt=pPr
9c20: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  eStmt->pNext){. 
9c30: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70         int n = p
9c40: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20  PreStmt->nSql;. 
9c50: 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 3d         if( len>=
9c60: 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  n .            &
9c70: 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d  & memcmp(pPreStm
9c80: 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e  t->zSql, zSql, n
9c90: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
9ca0: 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20   && (zSql[n]==0 
9cb0: 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b  || zSql[n-1]==';
9cc0: 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ').        ){.  
9cd0: 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20          pStmt = 
9ce0: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b  pPreStmt->pStmt;
9cf0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65 66 74  .          zLeft
9d00: 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d   = &zSql[pPreStm
9d10: 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20  t->nSql];..     
9d20: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70       /* When a p
9d30: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9d40: 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69  t is found, unli
9d50: 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20  nk it from the. 
9d60: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68           ** cach
9d70: 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  e list.  It will
9d80: 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20   later be added 
9d90: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
9da0: 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  nning.          
9db0: 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ** of the cache 
9dc0: 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  list in order to
9dd0: 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72   implement LRU r
9de0: 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20  eplacement..    
9df0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9e00: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
9e10: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
9e20: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
9e30: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
9e40: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
9e50: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62  .            pDb
9e70: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
9e80: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
9e90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ea0: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
9eb0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
9ec0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
9ed0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
9ee0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b  pPreStmt->pPrev;
9ef0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
9f00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
9f10: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50  b->stmtLast = pP
9f20: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20  reStmt->pPrev;. 
9f30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9f40: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d       pDb->nStmt-
9f50: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  -;.          bre
9f60: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
9f70: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
9f80: 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64  * If no prepared
9f90: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66   statement was f
9fa0: 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20 74  ound.  Compile t
9fb0: 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20 20 20  he SQL text.    
9fc0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
9fd0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
9fe0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
9ff0: 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  !=sqlite3_prepar
a000: 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
a010: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c   -1, &pStmt, &zL
a020: 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eft) ){.        
a030: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
a040: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
a050: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  tToObj(sqlite3_e
a060: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29  rrmsg(pDb->db)))
a070: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
a080: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a0a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a0b0: 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  f( pStmt==0 ){. 
a0c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c           if( SQL
a0d0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
a0e0: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
a0f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a100: 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  /* A compile-tim
a110: 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73  e error in the s
a120: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20  tatement.       
a130: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a140: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
a150: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54  sult(interp, dbT
a160: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
a170: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
a180: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
a190: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a1b0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
a1c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
a1d0: 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  /* The statement
a1e0: 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43   was a no-op.  C
a1f0: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e  ontinue to the n
a200: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ext statement.  
a210: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
a220: 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a  the SQL string..
a230: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
a240: 20 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20             zSql 
a250: 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  = zLeft;.       
a260: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a270: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a280: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
a290: 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d 30  ert( pPreStmt==0
a2a0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
a2b0: 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65     /* Bind value
a2c0: 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20  s to parameters 
a2d0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
a2e0: 24 20 6f 72 20 3a 0a 20 20 20 20 20 20 2a 2f 20  $ or :.      */ 
a2f0: 20 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73   .      nVar = s
a300: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
a310: 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d  meter_count(pStm
a320: 74 29 3b 0a 20 20 20 20 20 20 6e 50 61 72 6d 20  t);.      nParm 
a330: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  = 0;.      if( n
a340: 56 61 72 3e 73 69 7a 65 6f 66 28 61 50 61 72 6d  Var>sizeof(aParm
a350: 29 2f 73 69 7a 65 6f 66 28 61 50 61 72 6d 5b 30  )/sizeof(aParm[0
a360: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  ]) ){.        ap
a370: 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a  Parm = (Tcl_Obj*
a380: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61 72  *)Tcl_Alloc(nVar
a390: 2a 73 69 7a 65 6f 66 28 61 70 50 61 72 6d 5b 30  *sizeof(apParm[0
a3a0: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
a3b0: 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d  {.        apParm
a3c0: 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20 20 20 20   = aParm;.      
a3d0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  }.      for(i=1;
a3e0: 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a   i<=nVar; i++){.
a3f0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a400: 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74  ar *zVar = sqlit
a410: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
a420: 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  r_name(pStmt, i)
a430: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 56  ;.        if( zV
a440: 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30  ar!=0 && (zVar[0
a450: 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30  ]=='$' || zVar[0
a460: 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20 20 20 20 20  ]==':') ){.     
a470: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
a480: 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32  ar = Tcl_GetVar2
a490: 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72  Ex(interp, &zVar
a4a0: 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  [1], 0, 0);.    
a4b0: 20 20 20 20 20 20 69 66 28 20 70 56 61 72 20 29        if( pVar )
a4c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
a4d0: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t n;.           
a4e0: 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20   u8 *data;.     
a4f0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 79         char *zTy
a500: 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65 50  pe = pVar->typeP
a510: 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50  tr ? pVar->typeP
a520: 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20  tr->name : "";. 
a530: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
a540: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
a550: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
a560: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
a570: 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22  Type,"bytearray"
a580: 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79  )==0 && pVar->by
a590: 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tes==0 ){.      
a5a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
a5b0: 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65  load a BLOB type
a5c0: 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69   if the Tcl vari
a5d0: 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72  able is a bytear
a5e0: 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ray and.        
a5f0: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20        ** has no 
a600: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
a610: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
a620: 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54          data = T
a630: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
a640: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
a650: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a660: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
a670: 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61  b(pStmt, i, data
a680: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
a690: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
a6a0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
a6b0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
a6c0: 20 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b           apParm[
a6d0: 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b  nParm++] = pVar;
a6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
a6f0: 73 65 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26  se if( (c=='b' &
a700: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
a710: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29 20 7c 7c  boolean")==0) ||
a720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a730: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
a740: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
a750: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
a760: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e         Tcl_GetIn
a770: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
a780: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
a790: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a7a0: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
a7b0: 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , i, n);.       
a7c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
a7d0: 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28  =='d' && strcmp(
a7e0: 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d  zType,"double")=
a7f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a800: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
a810: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
a820: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
a830: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26  (interp, pVar, &
a840: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
a850: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
a860: 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20  ouble(pStmt, i, 
a870: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
a880: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 77 27  }else if( c=='w'
a890: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
a8a0: 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 20 29  ,"wideInt")==0 )
a8b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a8c0: 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20  Tcl_WideInt v;. 
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
a8e0: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
a8f0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
a900: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
a910: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
a920: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c  _int64(pStmt, i,
a930: 20 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   v);.           
a940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a950: 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e        data = (un
a960: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63  signed char *)Tc
a970: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a980: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
a990: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a9a0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
a9b0: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
a9c0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
a9d0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
a9e0: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
a9f0: 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20  efCount(pVar);. 
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50               apP
aa10: 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70  arm[nParm++] = p
aa20: 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Var;.           
aa30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
aa40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
aa50: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
aa60: 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a 20  l( pStmt, i );. 
aa70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aa80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
aa90: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63      /* Compute c
aaa0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
aab0: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
aac0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
aad0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
aae0: 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20  f( pScript ){.  
aaf0: 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20        apColName 
ab00: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c  = (Tcl_Obj**)Tcl
ab10: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  _Alloc( sizeof(T
ab20: 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b  cl_Obj*)*nCol );
ab30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 43  .        if( apC
ab40: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61  olName==0 ) brea
ab50: 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  k;.        for(i
ab60: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
ab70: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 6f  {.          apCo
ab80: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78  lName[i] = dbTex
ab90: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  tToObj(sqlite3_c
aba0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
abb0: 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,i));.          
abc0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
abd0: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
abe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
abf0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  }..      /* If r
ac00: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
ac10: 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72   stored in an ar
ac20: 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68  ray variable, th
ac30: 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 20 20  en create.      
ac40: 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20  ** the array(*) 
ac50: 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61  entry for that a
ac60: 72 72 61 79 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rray.      */.  
ac70: 20 20 20 20 69 66 28 20 70 41 72 72 61 79 20 29      if( pArray )
ac80: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  {.        Tcl_Ob
ac90: 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63  j *pColList = Tc
aca0: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
acb0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74      Tcl_Obj *pSt
acc0: 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  ar = Tcl_NewStri
acd0: 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a  ngObj("*", -1);.
ace0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
acf0: 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73  RefCount(pColLis
ad00: 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t);.        for(
ad10: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
ad20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
ad30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ad40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43  ement(interp, pC
ad50: 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d  olList, apColNam
ad60: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  e[i]);.        }
ad70: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
ad80: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
ad90: 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70  pArray, pStar, p
ada0: 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20  ColList,0);.    
adb0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
adc0: 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a  ount(pColList);.
add0: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
ade0: 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b  RefCount(pStar);
adf0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ae00: 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 53  /* Execute the S
ae10: 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  QL.      */.    
ae20: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c    while( rc==TCL
ae30: 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20 26 26 20  _OK && pStmt && 
ae40: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
ae50: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
ae60: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
ae70: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
ae80: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
ae90: 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  Obj *pVal;.     
aea0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
aeb0: 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63  /* Set pVal to c
aec0: 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20  ontain the i'th 
aed0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72  column of this r
aee0: 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ow. */.         
aef0: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
af00: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
af10: 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  mt, i) ){.      
af20: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
af30: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
af40: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
af50: 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
af60: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
af70: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
af80: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
af90: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c  ByteArrayObj(sql
afa0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
afb0: 28 70 53 74 6d 74 2c 20 69 29 2c 20 62 79 74 65  (pStmt, i), byte
afc0: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
afd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
afe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
aff0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b000: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
b010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69          sqlite_i
b020: 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33  nt64 v = sqlite3
b030: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
b040: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
b050: 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32         if( v>=-2
b060: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
b070: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
b090: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  al = Tcl_NewIntO
b0a0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
b0b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
b0d0: 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
b0e0: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20  tObj(v);.       
b0f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b100: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b110: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b120: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
b130: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
b140: 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c             doubl
b150: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  e r = sqlite3_co
b160: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
b170: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
b180: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
b190: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b  NewDoubleObj(r);
b1a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
b1b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b1c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b1d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
b1e0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
b1f0: 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54    pVal = dbTextT
b200: 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  oObj(pDb->zNull)
b210: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b220: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b230: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b240: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b250: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
b260: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 28 63 68   dbTextToObj((ch
b270: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
b280: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
b290: 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i));.           
b2a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b2c0: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
b2d0: 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a   if( pScript ){.
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b2f0: 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20  pArray==0 ){.   
b300: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f             Tcl_O
b310: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
b320: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
b330: 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  0, pVal, 0);.   
b340: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
b360: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
b370: 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43  erp, pArray, apC
b380: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c  olName[i], pVal,
b390: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b3a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
b3b0: 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44  se if( choice==D
b3c0: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20  B_ONECOLUMN ){. 
b3d0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
b3e0: 74 28 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20 20  t( pRet==0 );.  
b3f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
b400: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
b410: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 56         pRet = pV
b420: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
b430: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
b440: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
b450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b460: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45      rc = TCL_BRE
b470: 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AK;.            
b480: 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  i = nCol;.      
b490: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68      }else if( ch
b4a0: 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20  oice==DB_EXISTS 
b4b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  ){.            T
b4c0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b4d0: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  pRet);.         
b4e0: 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
b4f0: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 3b 0a  wBooleanObj(1);.
b500: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
b510: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
b520: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
b530: 72 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a  rc = TCL_BREAK;.
b540: 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20              i = 
b550: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  nCol;.          
b560: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b570: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
b580: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
b590: 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c 29 3b  rp, pRet, pVal);
b5a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b5b0: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
b5c0: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
b5d0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
b5e0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
b5f0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
b600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
b610: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
b620: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
b630: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
b640: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b650: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b660: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
b670: 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  EAK ){.        r
b680: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
b690: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72    }..      /* Fr
b6a0: 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ee the column na
b6b0: 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  me objects */.  
b6c0: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
b6d0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
b6e0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
b6f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
b700: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43  DecrRefCount(apC
b710: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
b720: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63      }.        Tc
b730: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70  l_Free((char*)ap
b740: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
b750: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  }..      /* Free
b760: 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e   the bound strin
b770: 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d  g and blob param
b780: 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 66  eters */.      f
b790: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b  or(i=0; i<nParm;
b7a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54   i++){.        T
b7b0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b7c0: 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20  apParm[i]);.    
b7d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70    }.      if( ap
b7e0: 50 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20  Parm!=aParm ){. 
b7f0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
b800: 28 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a  (char*)apParm);.
b810: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
b820: 2a 20 52 65 73 65 74 20 74 68 65 20 73 74 61 74  * Reset the stat
b830: 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72  ement.  If the r
b840: 65 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53 51  esult code is SQ
b850: 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68 65  LITE_SCHEMA, the
b860: 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68  n.      ** flush
b870: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
b880: 61 63 68 65 20 61 6e 64 20 74 72 79 20 74 68 65  ache and try the
b890: 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e   statement again
b8a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b8b0: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
b8c0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
b8d0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 53 43     if( SQLITE_SC
b8e0: 48 45 4d 41 3d 3d 72 63 32 20 29 7b 0a 20 20 20  HEMA==rc2 ){.   
b8f0: 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 61 20       /* After a 
b900: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 66  schema change, f
b910: 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 20 61  lush the cache a
b920: 6e 64 20 74 72 79 20 74 6f 20 72 75 6e 20 74 68  nd try to run th
b930: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61  e.        ** sta
b940: 74 65 6d 65 6e 74 20 61 67 61 69 6e 0a 20 20 20  tement again.   
b950: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b960: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
b970: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 73  pDb );.        s
b980: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
b990: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
b9a0: 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54  if( pPreStmt ) T
b9b0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
b9c0: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
b9d0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b9e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49    }else if( SQLI
b9f0: 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20  TE_OK!=rc2 ){.  
ba00: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75        /* If a ru
ba10: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63  n-time error occ
ba20: 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20  urs, report the 
ba30: 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72  error and stop r
ba40: 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  eading.        *
ba50: 2a 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20  * the SQL.      
ba60: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c    */.        Tcl
ba70: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
ba80: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
ba90: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
baa0: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
bab0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
bac0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
bad0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
bae0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
baf0: 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c  ( pPreStmt ) Tcl
bb00: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72  _Free((char*)pPr
bb10: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  eStmt);.        
bb20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
bb30: 73 65 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53  se if( pDb->maxS
bb40: 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt<=0 ){.      
bb50: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
bb60: 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c  e is turned off,
bb70: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65   deallocated the
bb80: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
bb90: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
bba0: 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63  mt ) Tcl_Free((c
bbb0: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  har*)pPreStmt);.
bbc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
bbd0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
bbe0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bbf0: 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68        /* Everyth
bc00: 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74  ing worked and t
bc10: 68 65 20 63 61 63 68 65 20 69 73 20 6f 70 65 72  he cache is oper
bc20: 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20  ational..       
bc30: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
bc40: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
bc50: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 77 65   structure if we
bc60: 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20   need one..     
bc70: 20 20 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72     ** (If we alr
bc80: 65 61 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65  eady have one we
bc90: 20 63 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20   can just reuse 
bca0: 69 74 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a  it.).        */.
bcb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
bcc0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
bcd0: 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74       len = zLeft
bce0: 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20   - zSql;.       
bcf0: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
bd00: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
bd10: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
bd20: 66 28 2a 70 50 72 65 53 74 6d 74 29 20 2b 20 6c  f(*pPreStmt) + l
bd30: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  en );.          
bd40: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
bd50: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
bd60: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OR;.          pP
bd70: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20  reStmt->pStmt = 
bd80: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20  pStmt;.         
bd90: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20   pPreStmt->nSql 
bda0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  = len;.         
bdb0: 20 6d 65 6d 63 70 79 28 70 50 72 65 53 74 6d 74   memcpy(pPreStmt
bdc0: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65  ->zSql, zSql, le
bdd0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  n);.          pP
bde0: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65 6e  reStmt->zSql[len
bdf0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 0;.        }
be00: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ..        /* Add
be10: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
be20: 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62  atement to the b
be30: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
be40: 63 61 63 68 65 20 6c 69 73 74 0a 20 20 20 20 20  cache list.     
be50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50     */.        pP
be60: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20  reStmt->pNext = 
be70: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
be80: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
be90: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
bea0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
beb0: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tList ){.       
bec0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d    pDb->stmtList-
bed0: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
bee0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
bef0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
bf00: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
bf10: 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e         if( pDb->
bf20: 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  stmtLast==0 ){. 
bf30: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
bf40: 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29   pDb->nStmt==0 )
bf50: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
bf60: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
bf70: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Stmt;.        }e
bf80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
bf90: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
bfa0: 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  t>0 );.        }
bfb0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53  .        pDb->nS
bfc0: 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20  tmt++;.   .     
bfd0: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
bfe0: 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d   too many statem
bff0: 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65  ent in cache, re
c000: 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73  move the surplus
c010: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
c020: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
c030: 63 61 63 68 65 20 6c 69 73 74 2e 0a 20 20 20 20  cache list..    
c040: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77      */.        w
c050: 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74  hile( pDb->nStmt
c060: 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b  >pDb->maxStmt ){
c070: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c080: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d  e3_finalize(pDb-
c090: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74  >stmtLast->pStmt
c0a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
c0b0: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62  ->stmtLast = pDb
c0c0: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65  ->stmtLast->pPre
c0d0: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
c0e0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62  _Free((char*)pDb
c0f0: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78  ->stmtLast->pNex
c100: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  t);.          pD
c110: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65  b->stmtLast->pNe
c120: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
c130: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
c140: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c150: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63  }..      /* Proc
c160: 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  eed to the next 
c170: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
c180: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
c190: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
c1a0: 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ecrRefCount(objv
c1b0: 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  [2]);..    if( p
c1c0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Ret ){.      if(
c1d0: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
c1e0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
c1f0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c200: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pRet);.      }. 
c210: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
c220: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
c230: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
c240: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
c250: 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41   $db function NA
c260: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
c270: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
c280: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61   SQL function ca
c290: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
c2a0: 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69  ever that functi
c2b0: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65  on is.  ** calle
c2c0: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
c2d0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
c2e0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
c2f0: 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49    case DB_FUNCTI
c300: 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e  ON: {.    SqlFun
c310: 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63  c *pFunc;.    Tc
c320: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
c330: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
c340: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  .    if( objc!=4
c350: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
c360: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
c370: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
c380: 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  E SCRIPT");.    
c390: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c3a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  OR;.    }.    zN
c3b0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
c3c0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
c3d0: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 53 63 72  2], 0);.    pScr
c3e0: 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ipt = objv[3];. 
c3f0: 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53     pFunc = findS
c400: 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d  qlFunc(pDb, zNam
c410: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  e);.    if( pFun
c420: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  c==0 ) return TC
c430: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28  L_ERROR;.    if(
c440: 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
c450: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
c460: 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d  rRefCount(pFunc-
c470: 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  >pScript);.    }
c480: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72  .    pFunc->pScr
c490: 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20  ipt = pScript;. 
c4a0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
c4b0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
c4c0: 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c    pFunc->useEval
c4d0: 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65  Objv = safeToUse
c4e0: 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c  EvalObjv(interp,
c4f0: 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72   pScript);.    r
c500: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
c510: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d  te_function(pDb-
c520: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  >db, zName, -1, 
c530: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
c540: 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53       pFunc, tclS
c550: 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
c560: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c570: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
c580: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
c590: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
c5a0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
c5b0: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
c5c0: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
c5d0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65  OLATILE);.    }e
c5e0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75  lse{.      /* Mu
c5f0: 73 74 20 66 6c 75 73 68 20 61 6e 79 20 63 61 63  st flush any cac
c600: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  hed statements *
c610: 2f 0a 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d  /.      flushStm
c620: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
c630: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
c640: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
c650: 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
c660: 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
c670: 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
c680: 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
c690: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
c6a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
c6b0: 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
c6c0: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
c6d0: 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
c6e0: 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
c6f0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
c700: 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
c710: 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
c720: 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
c730: 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
c740: 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
c750: 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
c760: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
c770: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
c780: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
c790: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
c7a0: 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
c7b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c7c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
c7d0: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
c7e0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
c7f0: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
c800: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
c810: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
c820: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
c830: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
c840: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
c850: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
c860: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
c870: 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
c880: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
c890: 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
c8a0: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
c8b0: 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a    strncpy(pDb->z
c8c0: 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e  Null, zNull, len
c8d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
c8e0: 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30  zNull[len] = '\0
c8f0: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ';.      }else{.
c900: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
c910: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
c920: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
c930: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
c940: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70  p, dbTextToObj(p
c950: 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20  Db->zNull));.   
c960: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
c970: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c  *.  **     $db l
c980: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
c990: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75   .  **.  ** Retu
c9a0: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
c9b0: 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44  ich is the ROWID
c9c0: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
c9d0: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a  cent insert..  *
c9e0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54  /.  case DB_LAST
c9f0: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b  _INSERT_ROWID: {
ca00: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
ca10: 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72  esult;.    int r
ca20: 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62  owid;.    if( ob
ca30: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
ca40: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
ca50: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
ca60: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
ca70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ca80: 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20    }.    rowid = 
ca90: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
caa0: 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64  ert_rowid(pDb->d
cab0: 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20  b);.    pResult 
cac0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
cad0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
cae0: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
caf0: 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20  esult, rowid);. 
cb00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
cb10: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f   /*.  ** The DB_
cb20: 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64  ONECOLUMN method
cb30: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
cb40: 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42  together with DB
cb50: 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  _EVAL..  */..  /
cb60: 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73  *    $db progres
cb70: 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20  s ?N CALLBACK?. 
cb80: 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65   ** .  ** Invoke
cb90: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
cba0: 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74  ack every N virt
cbb0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f  ual machine opco
cbc0: 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74  des while execut
cbd0: 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  ing.  ** queries
cbe0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
cbf0: 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20  _PROGRESS: {.   
cc00: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
cc10: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
cc20: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
cc30: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
cc40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
cc50: 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b  ->zProgress, 0);
cc60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
cc70: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
cc80: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
cc90: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69  rogress;.      i
cca0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e  nt len;.      in
ccb0: 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t N;.      if( T
ccc0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
ccd0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
cce0: 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b   objv[2], &N) ){
ccf0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
cd00: 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  OR;.      };.   
cd10: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
cd20: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
cd30: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
cd40: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
cd50: 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65   }.      zProgre
cd60: 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ss = Tcl_GetStri
cd70: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
cd80: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
cd90: 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26  if( zProgress &&
cda0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
cdb0: 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
cdc0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
cdd0: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
cde0: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72   strcpy(pDb->zPr
cdf0: 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73  ogress, zProgres
ce00: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
ce10: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
ce20: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
ce30: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
ce40: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
ce50: 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20  S_CALLBACK.     
ce60: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
ce70: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
ce80: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
ce90: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
cea0: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
ceb0: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e  ndler(pDb->db, N
cec0: 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  , DbProgressHand
ced0: 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
cee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cef0: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
cf00: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
cf10: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
cf20: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
cf30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
cf40: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cf50: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
cf60: 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20   CALLBACK");.   
cf70: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
cf80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
cf90: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
cfa0: 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f     $db profile ?
cfb0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
cfc0: 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
cfd0: 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
cfe0: 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
cff0: 74 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20  tine after each 
d000: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
d010: 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e  ** that has run.
d020: 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
d030: 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d  e SQL and the am
d040: 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74  ount of elapse t
d050: 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70  ime are.  ** app
d060: 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
d070: 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72  K before the scr
d080: 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f  ipt is run..  */
d090: 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49  .  case DB_PROFI
d0a0: 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  LE: {.    if( ob
d0b0: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
d0c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d0d0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
d0e0: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
d0f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
d100: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
d110: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
d120: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
d130: 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
d140: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d150: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
d160: 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20  >zProfile, 0);. 
d170: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d180: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
d190: 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e  rofile;.      in
d1a0: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
d1b0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
d1c0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
d1d0: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
d1e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d1f0: 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f   zProfile = Tcl_
d200: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
d210: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
d220: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66  .      if( zProf
d230: 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ile && len>0 ){.
d240: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
d250: 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ofile = Tcl_Allo
d260: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
d270: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
d280: 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f  ->zProfile, zPro
d290: 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  file);.      }el
d2a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
d2b0: 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20  >zProfile = 0;. 
d2c0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
d2d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
d2e0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
d2f0: 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
d300: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
d310: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
d320: 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
d330: 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f  e(pDb->db, DbPro
d340: 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  fileHandler, pDb
d350: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d360: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d370: 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c  profile(pDb->db,
d380: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
d390: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
d3a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
d3b0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72  *.  **     $db r
d3c0: 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20  ekey KEY.  **.  
d3d0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e  ** Change the en
d3e0: 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20  cryption key on 
d3f0: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
d400: 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  en database..  *
d410: 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45  /.  case DB_REKE
d420: 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65  Y: {.    int nKe
d430: 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  y;.    void *pKe
d440: 79 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  y;.    if( objc!
d450: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
d460: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
d470: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b  erp, 2, objv, "K
d480: 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  EY");.      retu
d490: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d4a0: 20 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54    }.    pKey = T
d4b0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
d4c0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
d4d0: 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53  &nKey);.#ifdef S
d4e0: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
d4f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d500: 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20  _rekey(pDb->db, 
d510: 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  pKey, nKey);.   
d520: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d530: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d540: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
d550: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
d560: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
d570: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERROR;.    }.#en
d580: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
d590: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
d5a0: 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49    $db timeout MI
d5b0: 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a  LLESECONDS.  **.
d5c0: 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74    ** Delay for t
d5d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
d5e0: 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66  liseconds specif
d5f0: 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  ied when a file 
d600: 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  is locked..  */.
d610: 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55    case DB_TIMEOU
d620: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b  T: {.    int ms;
d630: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
d640: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
d650: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d660: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 2, objv, "MIL
d670: 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
d680: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d690: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
d6a0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
d6b0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
d6c0: 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
d6d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d6e0: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
d6f0: 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c  timeout(pDb->db,
d700: 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   ms);.    break;
d710: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
d720: 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f  *     $db total_
d730: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
d740: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
d750: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
d760: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
d770: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
d780: 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  eted .  ** since
d790: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
d7a0: 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
d7b0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
d7c0: 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
d7d0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
d7e0: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
d7f0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
d800: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d810: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
d820: 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
d830: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d840: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
d850: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
d860: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
d870: 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
d880: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
d890: 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
d8a0: 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
d8b0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
d8c0: 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
d8d0: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
d8e0: 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
d8f0: 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
d900: 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
d910: 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
d920: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
d930: 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
d940: 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
d950: 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
d960: 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
d970: 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
d980: 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
d990: 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
d9a0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
d9b0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
d9c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
d9d0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
d9e0: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
d9f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
da00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
da10: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
da20: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
da30: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
da40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
da50: 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
da60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
da70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
da80: 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
da90: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
daa0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
dab0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
dac0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
dad0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
dae0: 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
daf0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
db00: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
db10: 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
db20: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
db30: 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
db40: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
db50: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
db60: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 54 72   strcpy(pDb->zTr
db70: 61 63 65 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20  ace, zTrace);.  
db80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db90: 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
dba0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
dbb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dbc0: 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28 20  TRACE.      if( 
dbd0: 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
dbe0: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
dbf0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
dc00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
dc10: 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
dc20: 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
dc30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dc40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
dc50: 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
dc60: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
dc70: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
dc80: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
dc90: 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
dca0: 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
dcb0: 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
dcc0: 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
dcd0: 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
dce0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
dcf0: 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
dd00: 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
dd10: 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
dd20: 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
dd30: 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
dd40: 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
dd50: 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
dd60: 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
dd70: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
dd80: 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
dd90: 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
dda0: 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
ddb0: 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
ddc0: 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
ddd0: 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
dde0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
ddf0: 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
de00: 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
de10: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
de20: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
de30: 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
de40: 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
de50: 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
de60: 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
de70: 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
de80: 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
de90: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
dea0: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
deb0: 20 20 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 3b      int inTrans;
dec0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
ded0: 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74  cript;.    const
dee0: 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20   char *zBegin = 
def0: 22 42 45 47 49 4e 22 3b 0a 20 20 20 20 69 66 28  "BEGIN";.    if(
df00: 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
df10: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
df20: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
df30: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
df40: 5b 54 59 50 45 5d 20 53 43 52 49 50 54 22 29 3b  [TYPE] SCRIPT");
df50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
df60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
df70: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
df80: 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  {.      pScript 
df90: 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 7d  = objv[2];.    }
dfa0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74   else {.      st
dfb0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dfc0: 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20  *TTYPE_strs[] = 
dfd0: 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65 72  {.        "defer
dfe0: 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69  red",   "exclusi
dff0: 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65  ve",  "immediate
e000: 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ", 0.      };.  
e010: 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65      enum TTYPE_e
e020: 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54  num {.        TT
e030: 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54  YPE_DEFERRED, TT
e040: 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54  YPE_EXCLUSIVE, T
e050: 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20  TYPE_IMMEDIATE. 
e060: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
e070: 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69  t ttype;.      i
e080: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
e090: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
e0a0: 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74  bjv[2], TTYPE_st
e0b0: 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e  rs, "transaction
e0c0: 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20   type",.        
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29        0, &ttype)
e0f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e100: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e110: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74      }.      swit
e120: 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
e130: 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
e140: 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
e150: 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a  _DEFERRED:    /*
e160: 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20   no-op */;      
e170: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
e180: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
e190: 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20  TYPE_EXCLUSIVE: 
e1a0: 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
e1b0: 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62  N EXCLUSIVE";  b
e1c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
e1d0: 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  se TTYPE_IMMEDIA
e1e0: 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  TE:   zBegin = "
e1f0: 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
e200: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
e210: 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  }.      pScript 
e220: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d  = objv[3];.    }
e230: 0a 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 21  .    inTrans = !
e240: 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
e250: 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64 62 29 3b  commit(pDb->db);
e260: 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e  .    if( !inTran
e270: 73 20 29 7b 0a 20 20 20 20 20 20 28 76 6f 69 64  s ){.      (void
e280: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
e290: 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30  b->db, zBegin, 0
e2a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
e2b0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
e2c0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
e2d0: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 69  cript, 0);.    i
e2e0: 66 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20  f( !inTrans ){. 
e2f0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
e300: 2a 7a 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  *zEnd;.      if(
e310: 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 20 29   rc==TCL_ERROR )
e320: 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d  {.        zEnd =
e330: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
e340: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
e350: 20 20 20 20 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d      zEnd = "COMM
e360: 49 54 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IT";.      }.   
e370: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
e380: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
e390: 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  End, 0, 0, 0);. 
e3a0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
e3b0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
e3c0: 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f    $db update_hoo
e3d0: 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20  k ?script?.  ** 
e3e0: 20 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f     $db rollback_
e3f0: 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
e400: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44  */.  case DB_UPD
e410: 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73  ATE_HOOK: .  cas
e420: 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f  e DB_ROLLBACK_HO
e430: 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65  OK: {..    /* se
e440: 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e  t ppHook to poin
e450: 74 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b  t at pUpdateHook
e460: 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f   or pRollbackHoo
e470: 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  k, depending on 
e480: 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20  .    ** whether 
e490: 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b  [$db update_hook
e4a0: 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61  ] or [$db rollba
e4b0: 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76  ck_hook] was inv
e4c0: 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oked..    */.   
e4d0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f   Tcl_Obj **ppHoo
e4e0: 6b 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69  k; .    if( choi
e4f0: 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f  ce==DB_UPDATE_HO
e500: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f  OK ){.      ppHo
e510: 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61  ok = &pDb->pUpda
e520: 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73  teHook;.    }els
e530: 65 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20  e{.      ppHook 
e540: 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  = &pDb->pRollbac
e550: 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  kHook;.    }..  
e560: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
e570: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
e580: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
e590: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
e5a0: 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
e5b0: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
e5c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e5d0: 0a 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b  .    if( *ppHook
e5e0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
e5f0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
e600: 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  p, *ppHook);.   
e610: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
e620: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  {.        Tcl_De
e630: 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f  crRefCount(*ppHo
e640: 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  ok);.        *pp
e650: 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hook = 0;.      
e660: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e670: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
e680: 20 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f   assert( !(*ppHo
e690: 6f 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ok) );.      if(
e6a0: 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67   Tcl_GetCharLeng
e6b0: 74 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b  th(objv[2])>0 ){
e6c0: 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b  .        *ppHook
e6d0: 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20   = objv[2];.    
e6e0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
e6f0: 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20  ount(*ppHook);. 
e700: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e710: 20 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65    sqlite3_update
e720: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28  _hook(pDb->db, (
e730: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
e740: 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72  ?DbUpdateHandler
e750: 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20 73  :0), pDb);.    s
e760: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
e770: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44  hook(pDb->db,(pD
e780: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
e790: 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c  ?DbRollbackHandl
e7a0: 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20  er:0),pDb);..   
e7b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
e7c0: 2a 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e  *    $db version
e7d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
e7e0: 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74  n the version st
e7f0: 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61  ring for this da
e800: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
e810: 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20  ase DB_VERSION: 
e820: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
e830: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
e840: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76  r *)sqlite3_libv
e850: 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54  ersion(), TCL_ST
e860: 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b  ATIC);.    break
e870: 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45  ;.  }...  } /* E
e880: 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48  nd of the SWITCH
e890: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
e8a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e8b0: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42  .**   sqlite3 DB
e8c0: 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d  NAME FILENAME ?M
e8d0: 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a  ODE? ?-key KEY?.
e8e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
e8f0: 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61  e main Tcl comma
e900: 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73  nd.  When the "s
e910: 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61  qlite" Tcl comma
e920: 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  nd is.** invoked
e930: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
e940: 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74  uns to process t
e950: 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  hat command..**.
e960: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
e970: 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69  ument, DBNAME, i
e980: 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e  s an arbitrary n
e990: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a  ame for a new.**
e9a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
e9b0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d  tion.  This comm
e9c0: 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65  and creates a ne
e9d0: 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a  w command named.
e9e0: 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69  ** DBNAME that i
e9f0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  s used to contro
ea00: 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  l that connectio
ea10: 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  n.  The database
ea20: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
ea30: 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  s deleted when t
ea40: 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e  he DBNAME comman
ea50: 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  d is deleted..**
ea60: 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
ea70: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
ea80: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
ea90: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
eaa0: 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  ns.** the sqlite
eab0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
eac0: 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
ead0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74  ..**.** For test
eae0: 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65  ing purposes, we
eaf0: 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74 68   also support th
eb00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
eb10: 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 65 6e 63  **  sqlite3 -enc
eb20: 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20  oding.**.**     
eb30: 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e 63    Return the enc
eb40: 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c 49  oding used by LI
eb50: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72  KE and GLOB oper
eb60: 61 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73 0a  ators.  Choices.
eb70: 2a 2a 20 20 20 20 20 20 20 61 72 65 20 55 54 46  **       are UTF
eb80: 2d 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e 0a  -8 and iso8859..
eb90: 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d  **.**  sqlite3 -
eba0: 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  version.**.**   
ebb0: 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 76      Return the v
ebc0: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66  ersion number of
ebd0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
ebe0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  ary..**.**  sqli
ebf0: 74 65 33 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74  te3 -tcl-uses-ut
ec00: 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65  f.**.**       Re
ec10: 74 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d 70  turn "1" if comp
ec20: 69 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c 20  iled with a Tcl 
ec30: 75 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65 74  uses UTF-8.  Ret
ec40: 75 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20 20  urn "0" if.**   
ec50: 20 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20 62      not.  Used b
ec60: 79 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65 20  y tests to make 
ec70: 73 75 72 65 20 74 68 65 20 6c 69 62 72 61 72 79  sure the library
ec80: 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a   was compiled .*
ec90: 2a 20 20 20 20 20 20 20 63 6f 72 72 65 63 74 6c  *       correctl
eca0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
ecb0: 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64   DbMain(void *cd
ecc0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
ecd0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54  terp, int objc,T
ece0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
ecf0: 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  jv){.  SqliteDb 
ed00: 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79  *p;.  void *pKey
ed10: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79   = 0;.  int nKey
ed20: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
ed30: 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72  ar *zArg;.  char
ed40: 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e   *zErrMsg;.  con
ed50: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
ed60: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
ed70: 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
ed80: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ed90: 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
eda0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
edb0: 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30  g,"-version")==0
edc0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
edd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ede0: 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  p,sqlite3_versio
edf0: 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n,0);.      retu
ee00: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
ee10: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
ee20: 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63  zArg,"-has-codec
ee30: 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
ee40: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
ee50: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
ee60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
ee70: 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1",0);.#else.   
ee80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ee90: 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30  ult(interp,"0",0
eea0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
eeb0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
eec0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
eed0: 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d 75  cmp(zArg,"-tcl-u
eee0: 73 65 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b 0a  ses-utf")==0 ){.
eef0: 23 69 66 64 65 66 20 54 43 4c 5f 55 54 46 5f 4d  #ifdef TCL_UTF_M
ef00: 41 58 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  AX.      Tcl_App
ef10: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ef20: 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20  ,"1",0);.#else. 
ef30: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
ef40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22  esult(interp,"0"
ef50: 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ,0);.#endif.    
ef60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ef70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
ef80: 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63   objc==5 || objc
ef90: 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72 67 20  ==6 ){.    zArg 
efa0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
efb0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63  romObj(objv[objc
efc0: 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  -2], 0);.    if(
efd0: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b   strcmp(zArg,"-k
efe0: 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
eff0: 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
f000: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
f010: 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e  objv[objc-1], &n
f020: 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a 63  Key);.      objc
f030: 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   -= 2;.    }.  }
f040: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
f050: 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
f060: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f070: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
f080: 76 2c 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  v, .#ifdef SQLIT
f090: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
f0a0: 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
f0b0: 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d 4b  ME ?-key CODEC-K
f0c0: 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20 20  EY?".#else.     
f0d0: 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d   "HANDLE FILENAM
f0e0: 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69 66  E ?MODE?".#endif
f0f0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
f100: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f110: 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b  }.  zErrMsg = 0;
f120: 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62  .  p = (SqliteDb
f130: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
f140: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
f150: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c   p==0 ){.    Tcl
f160: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
f170: 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  p, "malloc faile
f180: 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  d", TCL_STATIC);
f190: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
f1a0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d  ERROR;.  }.  mem
f1b0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
f1c0: 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  (*p));.  zFile =
f1d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f1e0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
f1f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  );.  sqlite3_ope
f200: 6e 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 29  n(zFile, &p->db)
f210: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
f220: 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
f230: 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
f240: 20 7a 45 72 72 4d 73 67 20 3d 20 73 74 72 64 75   zErrMsg = strdu
f250: 70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  p(sqlite3_errmsg
f260: 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71  (p->db));.    sq
f270: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
f280: 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
f290: 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  0;.  }.#ifdef SQ
f2a0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
f2b0: 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e   sqlite3_key(p->
f2c0: 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, pKey, nKey);
f2d0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
f2e0: 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  >db==0 ){.    Tc
f2f0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f300: 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c  rp, zErrMsg, TCL
f310: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
f320: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
f330: 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 45 72  p);.    free(zEr
f340: 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
f350: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
f360: 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20  .  p->maxStmt = 
f370: 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  NUM_PREPARED_STM
f380: 54 53 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c  TS;.  zArg = Tcl
f390: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f3a0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
f3b0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
f3c0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41  mmand(interp, zA
f3d0: 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63  rg, DbObjCmd, (c
f3e0: 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65  har*)p, DbDelete
f3f0: 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63  Cmd);..  /* If c
f400: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
f410: 49 54 45 5f 54 45 53 54 20 74 75 72 6e 65 64 20  ITE_TEST turned 
f420: 6f 6e 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65  on, then registe
f430: 72 20 74 68 65 20 22 6d 64 35 73 75 6d 22 0a 20  r the "md5sum". 
f440: 20 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   ** SQL function
f450: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
f460: 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20  LITE_TEST.  {.  
f470: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 4d 64    extern void Md
f480: 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69 74  5_Register(sqlit
f490: 65 33 2a 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  e3*);.#ifdef SQL
f4a0: 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20  ITE_MEMDEBUG.   
f4b0: 20 69 6e 74 20 6d 61 6c 6c 6f 63 66 61 69 6c 20   int mallocfail 
f4c0: 3d 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f  = sqlite3_iMallo
f4d0: 63 46 61 69 6c 3b 0a 20 20 20 20 73 71 6c 69 74  cFail;.    sqlit
f4e0: 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d  e3_iMallocFail =
f4f0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 4d   0;.#endif.    M
f500: 64 35 5f 52 65 67 69 73 74 65 72 28 70 2d 3e 64  d5_Register(p->d
f510: 62 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b);.#ifdef SQLIT
f520: 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 73  E_MEMDEBUG.    s
f530: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
f540: 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66 61 69 6c 3b  il = mallocfail;
f550: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
f560: 69 66 20 20 0a 20 20 70 2d 3e 69 6e 74 65 72 70  if  .  p->interp
f570: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 72 65 74   = interp;.  ret
f580: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
f590: 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64  *.** Provide a d
f5a0: 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75  ummy Tcl_InitStu
f5b0: 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73 69  bs if we are usi
f5c0: 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74 61  ng this as a sta
f5d0: 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a  tic.** library..
f5e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54  */.#ifndef USE_T
f5f0: 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66  CL_STUBS.# undef
f600: 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a    Tcl_InitStubs.
f610: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69  # define Tcl_Ini
f620: 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65  tStubs(a,b,c).#e
f630: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
f640: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
f650: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
f660: 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20  macro defined.  
f670: 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  This will be.** 
f680: 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69  defined automati
f690: 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41  cally by the TEA
f6a0: 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20   makefile.  But 
f6b0: 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a  other makefiles.
f6c0: 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65  ** do not define
f6d0: 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   it..*/.#ifndef 
f6e0: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a  PACKAGE_VERSION.
f6f0: 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45  # define PACKAGE
f700: 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f  _VERSION SQLITE_
f710: 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a  VERSION.#endif..
f720: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
f730: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a   this module..**
f740: 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64  .** This Tcl mod
f750: 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  ule contains onl
f760: 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54  y a single new T
f770: 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  cl command named
f780: 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48   "sqlite"..** (H
f790: 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ence there is no
f7a0: 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65   namespace.  The
f7b0: 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
f7c0: 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70  n using a namesp
f7d0: 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ace.** if the ex
f7e0: 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70  tension only sup
f7f0: 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61  plies one new na
f800: 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69 74  me!)  The "sqlit
f810: 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  e" command is.**
f820: 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20   used to open a 
f830: 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61 62  new SQLite datab
f840: 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44 62  ase.  See the Db
f850: 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61  Main() routine a
f860: 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69  bove.** for addi
f870: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
f880: 6f 6e 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e  on..*/.extern in
f890: 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  t Sqlite3_Init(T
f8a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
f8b0: 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74  p){.  Tcl_InitSt
f8c0: 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34  ubs(interp, "8.4
f8d0: 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ", 0);.  Tcl_Cre
f8e0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
f8f0: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
f900: 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
f910: 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
f920: 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
f930: 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
f940: 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52  e3", PACKAGE_VER
f950: 53 49 4f 4e 29 3b 0a 20 20 54 63 6c 5f 43 72 65  SION);.  Tcl_Cre
f960: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
f970: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20  terp, "sqlite", 
f980: 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
f990: 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a  )DbMain, 0, 0);.
f9a0: 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65    Tcl_PkgProvide
f9b0: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
f9c0: 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ", PACKAGE_VERSI
f9d0: 4f 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ON);.  return TC
f9e0: 4c 5f 4f 4b 3b 0a 7d 0a 65 78 74 65 72 6e 20 69  L_OK;.}.extern i
f9f0: 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e  nt Tclsqlite3_In
fa00: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
fa10: 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
fa20: 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
fa30: 72 70 29 3b 20 7d 0a 65 78 74 65 72 6e 20 69 6e  rp); }.extern in
fa40: 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e  t Sqlite3_SafeIn
fa50: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
fa60: 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
fa70: 43 4c 5f 4f 4b 3b 20 7d 0a 65 78 74 65 72 6e 20  CL_OK; }.extern 
fa80: 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53  int Tclsqlite3_S
fa90: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
faa0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
fab0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23  urn TCL_OK; }..#
fac0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f  ifndef SQLITE_3_
fad0: 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 65 78 74 65  SUFFIX_ONLY.exte
fae0: 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e  rn int Sqlite_In
faf0: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
fb00: 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
fb10: 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
fb20: 72 70 29 3b 20 7d 0a 65 78 74 65 72 6e 20 69 6e  rp); }.extern in
fb30: 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74  t Tclsqlite_Init
fb40: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
fb50: 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
fb60: 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
fb70: 29 3b 20 7d 0a 65 78 74 65 72 6e 20 69 6e 74 20  ); }.extern int 
fb80: 53 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28  Sqlite_SafeInit(
fb90: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
fba0: 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
fbb0: 4f 4b 3b 20 7d 0a 65 78 74 65 72 6e 20 69 6e 74  OK; }.extern int
fbc0: 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66 65 49   Tclsqlite_SafeI
fbd0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
fbe0: 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
fbf0: 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66  TCL_OK; }.#endif
fc00: 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f  ..#ifdef TCLSH./
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
fc60: 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   The code that f
fc70: 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74  ollows is used t
fc80: 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f  o build standalo
fc90: 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  ne TCL interpret
fca0: 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  ers.*/../*.** If
fcb0: 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48   the macro TCLSH
fcc0: 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75   is one, then pu
fcd0: 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66  t in code this f
fce0: 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22  or the.** "main"
fcf0: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69   routine that wi
fd00: 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63  ll initialize Tc
fd10: 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74  l and take input
fd20: 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72   from.** standar
fd30: 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 23 69 66 20  d input..*/.#if 
fd40: 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20  TCLSH==1.static 
fd50: 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d  char zMainloop[]
fd60: 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65 20 7b   =.  "set line {
fd70: 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20 7b 21  }\n".  "while {!
fd80: 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e  [eof stdin]} {\n
fd90: 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69 6e 65  ".    "if {$line
fda0: 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
fdb0: 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c     "puts -nonewl
fdc0: 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20  ine \"> \"\n".  
fdd0: 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
fde0: 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
fdf0: 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a  wline \"% \"\n".
fe00: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66      "}\n".    "f
fe10: 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20  lush stdout\n". 
fe20: 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20     "append line 
fe30: 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a  [gets stdin]\n".
fe40: 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63      "if {[info c
fe50: 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20  omplete $line]} 
fe60: 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b  {\n".      "if {
fe70: 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
fe80: 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74  #0 $line} result
fe90: 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  ]} {\n".        
fea0: 22 70 75 74 73 20 73 74 64 65 72 72 20 5c 22 45  "puts stderr \"E
feb0: 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c  rror: $result\"\
fec0: 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65  n".      "} else
fed0: 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c  if {$result!=\"\
fee0: 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  "} {\n".        
fef0: 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22  "puts $result\n"
ff00: 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20  .      "}\n".   
ff10: 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c     "set line {}\
ff20: 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  n".    "} else {
ff30: 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65 6e  \n".      "appen
ff40: 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20  d line \\n\n".  
ff50: 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a    "}\n".  "}\n".
ff60: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
ff70: 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
ff80: 53 48 20 69 73 20 74 77 6f 2c 20 74 68 65 6e 20  SH is two, then 
ff90: 67 65 74 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  get the main loo
ffa0: 70 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a 2a 2a  p code out of.**
ffb0: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 66 69   the separate fi
ffc0: 6c 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63  le "spaceanal_tc
ffd0: 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c  l.h"..*/.#if TCL
ffe0: 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 68 61  SH==2.static cha
fff0: 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20  r zMainloop[] = 
10000 0a 23 69 6e 63 6c 75 64 65 20 22 73 70 61 63 65  .#include "space
10010 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65  anal_tcl.h".;.#e
10020 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 43  ndif..#define TC
10030 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20  LSH_MAIN main   
10040 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b  /* Needed to fak
10050 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a  e out mktclapp *
10060 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e  /.int TCLSH_MAIN
10070 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
10080 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49  **argv){.  Tcl_I
10090 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
100a0 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61   Tcl_FindExecuta
100b0 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
100c0 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65  interp = Tcl_Cre
100d0 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 53  ateInterp();.  S
100e0 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
100f0 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  rp);.#ifdef SQLI
10100 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20  TE_TEST.  {.    
10110 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10120 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f  etest1_Init(Tcl_
10130 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
10140 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
10150 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est2_Init(Tcl_In
10160 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
10170 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
10180 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t3_Init(Tcl_Inte
10190 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
101a0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34   int Sqlitetest4
101b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
101c0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
101d0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49  nt Sqlitetest5_I
101e0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
101f0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10200 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69   Sqlitetest6_Ini
10210 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10220 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10230 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28  qlitetest7_Init(
10240 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10250 20 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35    extern int Md5
10260 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10270 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10280 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65  nt Sqlitetestsse
10290 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
102a0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
102b0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
102c0 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
102d0 72 70 2a 29 3b 0a 0a 20 20 20 20 53 71 6c 69 74  rp*);..    Sqlit
102e0 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65  etest1_Init(inte
102f0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
10300 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70  est2_Init(interp
10310 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
10320 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t3_Init(interp);
10330 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 34  .    Sqlitetest4
10340 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
10350 20 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49     Sqlitetest5_I
10360 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
10370 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69   Sqlitetest6_Ini
10380 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
10390 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28  qlitetest7_Init(
103a0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
103b0 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69  itetestasync_Ini
103c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d  t(interp);.    M
103d0 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  d5_Init(interp);
103e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
103f0 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  SE.    Sqlitetes
10400 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  tsse_Init(interp
10410 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65  );.#endif.  }.#e
10420 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67 63 3e  ndif.  if( argc>
10430 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29  =2 || TCLSH==2 )
10440 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
10450 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
10460 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b  rp,"argv0",argv[
10470 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  1],TCL_GLOBAL_ON
10480 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
10490 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
104a0 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  ", "", TCL_GLOBA
104b0 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72  L_ONLY);.    for
104c0 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72  (i=3-TCLSH; i<ar
104d0 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
104e0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
104f0 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b  p, "argv", argv[
10500 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43  i],.          TC
10510 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20  L_GLOBAL_ONLY | 
10520 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54  TCL_LIST_ELEMENT
10530 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41   | TCL_APPEND_VA
10540 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LUE);.    }.    
10550 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20  if( TCLSH==1 && 
10560 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74  Tcl_EvalFile(int
10570 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54  erp, argv[1])!=T
10580 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63  CL_OK ){.      c
10590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f  onst char *zInfo
105a0 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e   = Tcl_GetVar(in
105b0 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f  terp, "errorInfo
105c0 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
105d0 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LY);.      if( z
105e0 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20  Info==0 ) zInfo 
105f0 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74  = interp->result
10600 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
10610 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e  stderr,"%s: %s\n
10620 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29  ", *argv, zInfo)
10630 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
10640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10650 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c  ( argc<=1 || TCL
10660 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  SH==2 ){.    Tcl
10670 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65  _GlobalEval(inte
10680 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a  rp, zMainloop);.
10690 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
106a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53  }.#endif /* TCLS
106b0 48 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  H */..#endif /* 
106c0 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 43 4c 29  !defined(NO_TCL)
106d0 20 2a 2f 0a                                       */.