/ Hex Artifact Content
Login

Artifact b21dd96ffab1625c986513e003a1945a6ae112ae:


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: 34 30 20 32 30 30 35 2f 31 32 2f 31 36 20 30 36  40 2005/12/16 06
01c0: 3a 35 34 3a 30 33 20 64 61 6e 69 65 6c 6b 31 39  :54:03 danielk19
01d0: 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e  77 Exp $.*/.#ifn
01e0: 64 65 66 20 4e 4f 5f 54 43 4c 20 20 20 20 20 2f  def NO_TCL     /
01f0: 2a 20 4f 6d 69 74 20 74 68 69 73 20 77 68 6f 6c  * Omit this whol
0200: 65 20 66 69 6c 65 20 69 66 20 54 43 4c 20 69 73  e file if TCL is
0210: 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a   unavailable */.
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0230: 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  eInt.h".#include
0240: 20 22 68 61 73 68 2e 68 22 0a 23 69 6e 63 6c 75   "hash.h".#inclu
0250: 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c  de "tcl.h".#incl
0260: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0270: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0280: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
0290: 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
02a0: 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 20 2a  <ctype.h>../*. *
02b0: 20 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74   Windows needs t
02c0: 6f 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d  o know which sym
02d0: 62 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20  bols to export. 
02e0: 20 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a   Unix does not..
02f0: 20 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20   * BUILD_sqlite 
0300: 73 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69  should be undefi
0310: 6e 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a  ned for Unix.. *
0320: 2f 0a 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f  /..#ifdef BUILD_
0330: 73 71 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43  sqlite.#undef TC
0340: 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a  L_STORAGE_CLASS.
0350: 23 64 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52  #define TCL_STOR
0360: 41 47 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50  AGE_CLASS DLLEXP
0370: 4f 52 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55  ORT.#endif /* BU
0380: 49 4c 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23  ILD_sqlite */..#
0390: 64 65 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41  define NUM_PREPA
03a0: 52 45 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65  RED_STMTS 10.#de
03b0: 66 69 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45  fine MAX_PREPARE
03c0: 44 5f 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a  D_STMTS 100../*.
03d0: 2a 2a 20 49 66 20 54 43 4c 20 75 73 65 73 20 55  ** If TCL uses U
03e0: 54 46 2d 38 20 61 6e 64 20 53 51 4c 69 74 65 20  TF-8 and SQLite 
03f0: 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
0400: 20 75 73 65 20 69 73 6f 38 38 35 39 2c 20 74 68   use iso8859, th
0410: 65 6e 20 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f  en we.** have to
0420: 20 64 6f 20 61 20 74 72 61 6e 73 6c 61 74 69 6f   do a translatio
0430: 6e 20 77 68 65 6e 20 67 6f 69 6e 67 20 62 65 74  n when going bet
0440: 77 65 65 6e 20 74 68 65 20 74 77 6f 2e 20 20 53  ween the two.  S
0450: 65 74 20 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54  et the .** UTF_T
0460: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
0470: 44 20 6d 61 63 72 6f 20 74 6f 20 69 6e 64 69 63  D macro to indic
0480: 61 74 65 20 74 68 61 74 20 77 65 20 6e 65 65 64  ate that we need
0490: 20 74 6f 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74   to do.** this t
04a0: 72 61 6e 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f  ranslation.  .*/
04b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c  .#if defined(TCL
04c0: 5f 55 54 46 5f 4d 41 58 29 20 26 26 20 21 64 65  _UTF_MAX) && !de
04d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46  fined(SQLITE_UTF
04e0: 38 29 0a 23 20 64 65 66 69 6e 65 20 55 54 46 5f  8).# define UTF_
04f0: 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44  TRANSLATION_NEED
0500: 45 44 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ED 1.#endif../*.
0510: 2a 2a 20 4e 65 77 20 53 51 4c 20 66 75 6e 63 74  ** New SQL funct
0520: 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 72 65 61  ions can be crea
0530: 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70  ted as TCL scrip
0540: 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 66  ts.  Each such f
0550: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65  unction.** is de
0560: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0570: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0580: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0590: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
05a0: 72 75 63 74 20 53 71 6c 46 75 6e 63 20 53 71 6c  ruct SqlFunc Sql
05b0: 46 75 6e 63 3b 0a 73 74 72 75 63 74 20 53 71 6c  Func;.struct Sql
05c0: 46 75 6e 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74  Func {.  Tcl_Int
05d0: 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f  erp *interp;   /
05e0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
05f0: 72 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74  ret to execute t
0600: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
0610: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
0620: 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 54 63  t;     /* The Tc
0630: 6c 5f 4f 62 6a 20 72 65 70 72 65 73 65 6e 74 61  l_Obj representa
0640: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69  tion of the scri
0650: 70 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45  pt */.  int useE
0660: 76 61 6c 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a  valObjv;      /*
0670: 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 73   True if it is s
0680: 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45  afe to use Tcl_E
0690: 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61  valObjv */.  cha
06a0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
06b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
06c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
06d0: 20 53 71 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b   SqlFunc *pNext;
06e0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
06f0: 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c  unction on the l
0700: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
0710: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77  */.};../*.** New
0720: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0730: 6e 63 65 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  nces function ca
0740: 6e 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20  n be created as 
0750: 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61  TCL scripts.  Ea
0760: 63 68 20 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74  ch such.** funct
0770: 69 6f 6e 20 69 73 20 64 65 73 63 72 69 62 65 64  ion is described
0780: 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   by an instance 
0790: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
07a0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74   structure..*/.t
07b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71  ypedef struct Sq
07c0: 6c 43 6f 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c  lCollate SqlColl
07d0: 61 74 65 3b 0a 73 74 72 75 63 74 20 53 71 6c 43  ate;.struct SqlC
07e0: 6f 6c 6c 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49  ollate {.  Tcl_I
07f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20  nterp *interp;  
0800: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
0810: 72 70 72 65 74 20 74 6f 20 65 78 65 63 75 74 65  rpret to execute
0820: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
0830: 0a 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74  .  char *zScript
0840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
0850: 73 63 72 69 70 74 20 74 6f 20 62 65 20 72 75 6e  script to be run
0860: 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65   */.  SqlCollate
0870: 20 2a 70 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e   *pNext;    /* N
0880: 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  ext function on 
0890: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  the list of them
08a0: 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   all */.};../*.*
08b0: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
08c0: 6d 65 6e 74 73 20 61 72 65 20 63 61 63 68 65 64  ments are cached
08d0: 20 66 6f 72 20 66 61 73 74 65 72 20 65 78 65 63   for faster exec
08e0: 75 74 69 6f 6e 2e 20 20 45 61 63 68 20 70 72 65  ution.  Each pre
08f0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
0900: 6e 74 20 69 73 20 64 65 73 63 72 69 62 65 64 20  nt is described 
0910: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0920: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0930: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
0940: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0950: 50 72 65 70 61 72 65 64 53 74 6d 74 20 53 71 6c  PreparedStmt Sql
0960: 50 72 65 70 61 72 65 64 53 74 6d 74 3b 0a 73 74  PreparedStmt;.st
0970: 72 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64  ruct SqlPrepared
0980: 53 74 6d 74 20 7b 0a 20 20 53 71 6c 50 72 65 70  Stmt {.  SqlPrep
0990: 61 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b  aredStmt *pNext;
09a0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e    /* Next in lin
09b0: 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71  ked list */.  Sq
09c0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
09d0: 50 72 65 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f  Prev;  /* Previo
09e0: 75 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a  us on the list *
09f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
0a00: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
0a10: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0a20: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
0a30: 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nSql;           
0a40: 20 20 20 20 20 2f 2a 20 63 68 61 72 73 20 69 6e       /* chars in
0a50: 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20 20 63 68 61   zSql[] */.  cha
0a60: 72 20 7a 53 71 6c 5b 31 5d 3b 20 20 20 20 20 20  r zSql[1];      
0a70: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
0a80: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0a90: 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  nt */.};../*.** 
0aa0: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
0ab0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0ac0: 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
0ad0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0ae0: 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
0af0: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
0b00: 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72  SQLite TCL inter
0b10: 66 61 63 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  face..*/.typedef
0b20: 20 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62   struct SqliteDb
0b30: 20 53 71 6c 69 74 65 44 62 3b 0a 73 74 72 75 63   SqliteDb;.struc
0b40: 74 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73  t SqliteDb {.  s
0b50: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
0b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0b70: 20 22 72 65 61 6c 22 20 64 61 74 61 62 61 73 65   "real" database
0b80: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
0b90: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0ba0: 72 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  rp;        /* Th
0bb0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 75 73  e interpreter us
0bc0: 65 64 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ed for this data
0bd0: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
0be0: 7a 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20  zBusy;          
0bf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 75 73 79       /* The busy
0c00: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0c10: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  e */.  char *zCo
0c20: 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  mmit;           
0c30: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 69 74 20    /* The commit 
0c40: 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hook callback ro
0c50: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0c60: 2a 7a 54 72 61 63 65 3b 20 20 20 20 20 20 20 20  *zTrace;        
0c70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61        /* The tra
0c80: 63 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  ce callback rout
0c90: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
0ca0: 50 72 6f 66 69 6c 65 3b 20 20 20 20 20 20 20 20  Profile;        
0cb0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 66 69      /* The profi
0cc0: 6c 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  le callback rout
0cd0: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
0ce0: 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20  Progress;       
0cf0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 67 72      /* The progr
0d00: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ess callback rou
0d10: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
0d20: 7a 41 75 74 68 3b 20 20 20 20 20 20 20 20 20 20  zAuth;          
0d30: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 68       /* The auth
0d40: 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
0d50: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0d60: 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20  char *zNull;    
0d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
0d80: 78 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65  xt to substitute
0d90: 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c   for an SQL NULL
0da0: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46   value */.  SqlF
0db0: 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20  unc *pFunc;     
0dc0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
0dd0: 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  f SQL functions 
0de0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55  */.  Tcl_Obj *pU
0df0: 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20  pdateHook;      
0e00: 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73  /* Update hook s
0e10: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
0e20: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f  /.  Tcl_Obj *pRo
0e30: 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f  llbackHook;    /
0e40: 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20  * Rollback hook 
0e50: 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20  script (if any) 
0e60: 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  */.  SqlCollate 
0e70: 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20  *pCollate;      
0e80: 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63  /* List of SQL c
0e90: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
0ea0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ns */.  int rc; 
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
0ed0: 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74  e of most recent
0ee0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
0ef0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  */.  Tcl_Obj *pC
0f00: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20  ollateNeeded;   
0f10: 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  /* Collation nee
0f20: 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ded script */.  
0f30: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
0f40: 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69  *stmtList; /* Li
0f50: 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  st of prepared s
0f60: 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71  tatements*/.  Sq
0f70: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73  lPreparedStmt *s
0f80: 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74  tmtLast; /* Last
0f90: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
0fa0: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
0fb0: 6d 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20  maxStmt;        
0fc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
0fd0: 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  xt maximum numbe
0fe0: 72 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f  r of stmtList */
0ff0: 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20  .  int nStmt;   
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1010: 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65   Number of state
1020: 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73  ments in stmtLis
1030: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c  t */.};../*.** L
1040: 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72 69 70  ook at the scrip
1050: 74 20 70 72 65 66 69 78 20 69 6e 20 70 43 6d 64  t prefix in pCmd
1060: 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20 65 78  .  We will be ex
1070: 65 63 75 74 69 6e 67 20 74 68 69 73 20 73 63 72  ecuting this scr
1080: 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66 69 72  ipt.** after fir
1090: 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65  st appending one
10a0: 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e   or more argumen
10b0: 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ts.  This routin
10c0: 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68  e analyzes.** th
10d0: 65 20 73 63 72 69 70 74 20 74 6f 20 73 65 65 20  e script to see 
10e0: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
10f0: 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a   use Tcl_EvalObj
1100: 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72 69 70  v() on the scrip
1110: 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  t.** rather than
1120: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
1130: 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20  l Tcl_EvalEx(). 
1140: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
1150: 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65  is much.** faste
1160: 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73  r..**.** Scripts
1170: 20 74 68 61 74 20 61 72 65 20 73 61 66 65 20 74   that are safe t
1180: 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c 5f 45  o use with Tcl_E
1190: 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73  valObjv() consis
11a0: 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61  ts of a.** comma
11b0: 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64  nd name followed
11c0: 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   by zero or more
11d0: 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 20   arguments with 
11e0: 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a  no [...] or $.**
11f0: 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74   or {...} or ; t
1200: 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77 68 65  o be seen anywhe
1210: 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61  re.  Most callba
1220: 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e 73 69  ck scripts consi
1230: 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20  st.** of just a 
1240: 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75 72 65  single procedure
1250: 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79 20 6d   name and they m
1260: 65 65 74 20 74 68 69 73 20 72 65 71 75 69 72 65  eet this require
1270: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1280: 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45 76 61  int safeToUseEva
1290: 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70  lObjv(Tcl_Interp
12a0: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62   *interp, Tcl_Ob
12b0: 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57  j *pCmd){.  /* W
12c0: 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f 20 64  e could try to d
12d0: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68  o something with
12e0: 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20 20 42   Tcl_Parse().  B
12f0: 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73 74 65  ut we will inste
1300: 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20  ad.  ** just do 
1310: 61 20 73 65 61 72 63 68 20 66 6f 72 20 66 6f 72  a search for for
1320: 62 69 64 64 65 6e 20 63 68 61 72 61 63 74 65 72  bidden character
1330: 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68  s.  If any of th
1340: 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a  e forbidden.  **
1350: 20 63 68 61 72 61 63 74 65 72 73 20 61 70 70 65   characters appe
1360: 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65 20 77  ar in pCmd, we w
1370: 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 73  ill report the s
1380: 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66 65 2e  tring as unsafe.
1390: 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  .  */.  const ch
13a0: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ar *z;.  int n;.
13b0: 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72    z = Tcl_GetStr
13c0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c  ingFromObj(pCmd,
13d0: 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e   &n);.  while( n
13e0: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e  -- > 0 ){.    in
13f0: 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20  t c = *(z++);.  
1400: 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20    if( c=='$' || 
1410: 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27  c=='[' || c==';'
1420: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1430: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1440: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71  /*.** Find an Sq
1450: 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72 65 20  lFunc structure 
1460: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e  with the given n
1470: 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74 65 20  ame.  Or create 
1480: 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20  a new.** one if 
1490: 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20  an existing one 
14a0: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
14b0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
14c0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72  er to the.** str
14d0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
14e0: 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53  c SqlFunc *findS
14f0: 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44 62 20  qlFunc(SqliteDb 
1500: 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pDb, const char
1510: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46   *zName){.  SqlF
1520: 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20  unc *p, *pNew;. 
1530: 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20 3d   int i;.  pNew =
1540: 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41   (SqlFunc*)Tcl_A
1550: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
1560: 65 77 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61  ew) + strlen(zNa
1570: 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65  me) + 1 );.  pNe
1580: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  w->zName = (char
1590: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f  *)&pNew[1];.  fo
15a0: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
15b0: 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61   i++){ pNew->zNa
15c0: 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  me[i] = tolower(
15d0: 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20 70  zName[i]); }.  p
15e0: 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20  New->zName[i] = 
15f0: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e  0;.  for(p=pDb->
1600: 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70  pFunc; p; p=p->p
1610: 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28 20  Next){ .    if( 
1620: 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c  strcmp(p->zName,
1630: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30   pNew->zName)==0
1640: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72   ){.      Tcl_Fr
1650: 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b  ee((char*)pNew);
1660: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b  .      return p;
1670: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
1680: 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  w->interp = pDb-
1690: 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d  >interp;.  pNew-
16a0: 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20  >pScript = 0;.  
16b0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44  pNew->pNext = pD
16c0: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d  b->pFunc;.  pDb-
16d0: 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20  >pFunc = pNew;. 
16e0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
16f0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  ./*.** Finalize 
1700: 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20  and free a list 
1710: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
1720: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
1730: 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43   void flushStmtC
1740: 61 63 68 65 28 20 53 71 6c 69 74 65 44 62 20 2a  ache( SqliteDb *
1750: 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65 70  pDb ){.  SqlPrep
1760: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
1770: 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20 70  mt;..  while(  p
1780: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a  Db->stmtList ){.
1790: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
17a0: 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74 4c  lize( pDb->stmtL
17b0: 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
17c0: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62    pPreStmt = pDb
17d0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
17e0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
17f0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
1800: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
1810: 65 65 28 20 28 63 68 61 72 2a 29 70 50 72 65 53  ee( (char*)pPreS
1820: 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44 62  tmt );.  }.  pDb
1830: 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->nStmt = 0;.  p
1840: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30  Db->stmtLast = 0
1850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63  ;.}../*.** TCL c
1860: 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65 64  alls this proced
1870: 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c 69  ure when an sqli
1880: 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f 6d  te3 database com
1890: 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74  mand is.** delet
18a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
18b0: 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76  id DbDeleteCmd(v
18c0: 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69  oid *db){.  Sqli
18d0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
18e0: 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75  iteDb*)db;.  flu
18f0: 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29  shStmtCache(pDb)
1900: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ;.  sqlite3_clos
1910: 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68  e(pDb->db);.  wh
1920: 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20  ile( pDb->pFunc 
1930: 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a  ){.    SqlFunc *
1940: 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75  pFunc = pDb->pFu
1950: 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75  nc;.    pDb->pFu
1960: 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78  nc = pFunc->pNex
1970: 74 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  t;.    Tcl_DecrR
1980: 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70  efCount(pFunc->p
1990: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c  Script);.    Tcl
19a0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75  _Free((char*)pFu
19b0: 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  nc);.  }.  while
19c0: 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20  ( pDb->pCollate 
19d0: 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74  ){.    SqlCollat
19e0: 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44  e *pCollate = pD
19f0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  b->pCollate;.   
1a00: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
1a10: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
1a20: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
1a30: 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b  char*)pCollate);
1a40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
1a50: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c  zBusy ){.    Tcl
1a60: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79  _Free(pDb->zBusy
1a70: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
1a80: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
1a90: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54  Tcl_Free(pDb->zT
1aa0: 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  race);.  }.  if(
1ab0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
1ac0: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
1ad0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  Db->zProfile);. 
1ae0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41   }.  if( pDb->zA
1af0: 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  uth ){.    Tcl_F
1b00: 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b  ree(pDb->zAuth);
1b10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
1b20: 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c  zNull ){.    Tcl
1b30: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c  _Free(pDb->zNull
1b40: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
1b50: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b  ->pUpdateHook ){
1b60: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
1b70: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61  Count(pDb->pUpda
1b80: 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  teHook);.  }.  i
1b90: 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  f( pDb->pRollbac
1ba0: 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  kHook ){.    Tcl
1bb0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
1bc0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
1bd0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
1be0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
1bf0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
1c00: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
1c10: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
1c20: 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63   }.  Tcl_Free((c
1c30: 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a  har*)pDb);.}../*
1c40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c50: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1c60: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1c70: 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20  is locked while 
1c80: 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65  trying.** to exe
1c90: 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61  cute SQL..*/.sta
1ca0: 74 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61  tic int DbBusyHa
1cb0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
1cc0: 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53  int nTries){.  S
1cd0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
1ce0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
1cf0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
1d00: 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 70 72 69  Val[30];..  spri
1d10: 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64 22 2c 20  ntf(zVal, "%d", 
1d20: 6e 54 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20  nTries);.  rc = 
1d30: 54 63 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d  Tcl_VarEval(pDb-
1d40: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  >interp, pDb->zB
1d50: 75 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20  usy, " ", zVal, 
1d60: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28  (char*)0);.  if(
1d70: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
1d80: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
1d90: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
1da0: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
1db0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1dc0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1dd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1de0: 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27  invoked as the '
1df0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
1e00: 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  k' for the datab
1e10: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1e20: 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e  nt DbProgressHan
1e30: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
1e40: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
1e50: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
1e60: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1e70: 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67  sert( pDb->zProg
1e80: 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54  ress );.  rc = T
1e90: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
1ea0: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
1eb0: 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ess);.  if( rc!=
1ec0: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
1ed0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1ee0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
1ef0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1f00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1f10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f20: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f30: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
1f40: 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68  trace handler wh
1f50: 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20  enever a new.** 
1f60: 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20  block of SQL is 
1f70: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54  executed.  The T
1f80: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
1f90: 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63  ->zTrace is exec
1fa0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
1fb0: 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64  void DbTraceHand
1fc0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
1fd0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
1fe0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1ff0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
2000: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2010: 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72  str;..  Tcl_DStr
2020: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2030: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2040: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54  nd(&str, pDb->zT
2050: 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  race, -1);.  Tcl
2060: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
2070: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
2080: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
2090: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
20a0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
20b0: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
20c0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
20d0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
20e0: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a  Db->interp);.}..
20f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2100: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
2110: 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69  the SQLite profi
2120: 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72  le handler after
2130: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
2140: 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64  SQL has executed
2150: 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70  .  The TCL scrip
2160: 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69  t in pDb->zProfi
2170: 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  le is evaluated.
2180: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2190: 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
21a0: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
21b0: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c   char *zSql, sql
21c0: 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a  ite_uint64 tm){.
21d0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
21e0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
21f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
2200: 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31  tr;.  char zTm[1
2210: 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  00];..  sqlite3_
2220: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2230: 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c  zTm)-1, zTm, "%l
2240: 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f  ld", tm);.  Tcl_
2250: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
2260: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
2270: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
2280: 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b  ->zProfile, -1);
2290: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
22a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
22b0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44  , zSql);.  Tcl_D
22c0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
22d0: 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a  ent(&str, zTm);.
22e0: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
22f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
2300: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
2310: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
2320: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
2330: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
2340: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a  >interp);.}../*.
2350: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2360: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
2370: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2380: 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54 68 65 0a  committed.  The.
2390: 2a 2a 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  ** TCL script in
23a0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73   pDb->zCommit is
23b0: 20 65 78 65 63 75 74 65 64 2e 20 20 49 66 20 69   executed.  If i
23c0: 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  t returns non-ze
23d0: 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74  ro or.** if it t
23e0: 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
23f0: 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  on, the transact
2400: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
2410: 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  ck instead.** of
2420: 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
2430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2440: 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28  DbCommitHandler(
2450: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
2460: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
2470: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
2480: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63  t rc;..  rc = Tc
2490: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
24a0: 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  rp, pDb->zCommit
24b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
24c0: 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f  _OK || atoi(Tcl_
24d0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
24e0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b  pDb->interp)) ){
24f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2500: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2510: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  ..static void Db
2520: 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 28  RollbackHandler(
2530: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
2540: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
2550: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
2560: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 61 73  clientData;.  as
2570: 73 65 72 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  sert(pDb->pRollb
2580: 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69 66 28 20  ackHook);.  if( 
2590: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c  TCL_OK!=Tcl_Eval
25a0: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
25b0: 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  p, pDb->pRollbac
25c0: 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a 20 20 20  kHook, 0) ){.   
25d0: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
25e0: 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74 65 72 70  rror(pDb->interp
25f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
2600: 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48 61   void DbUpdateHa
2610: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70  ndler(.  void *p
2620: 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63  , .  int op,.  c
2630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
2640: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2650: 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69  Tbl, .  sqlite_i
2660: 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20  nt64 rowid.){.  
2670: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
2680: 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20  (SqliteDb *)p;. 
2690: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
26a0: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
26b0: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20  pUpdateHook );. 
26c0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
26d0: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
26e0: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
26f0: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
2700: 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20  LETE );..  pCmd 
2710: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2720: 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  bj(pDb->pUpdateH
2730: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
2740: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
2750: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2760: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
2770: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
2780: 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70 3d  gObj(.    ( (op=
2790: 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3f  =SQLITE_INSERT)?
27a0: 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53 51  "INSERT":(op==SQ
27b0: 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55 50  LITE_UPDATE)?"UP
27c0: 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29 2c  DATE":"DELETE"),
27d0: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
27e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
27f0: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
2800: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c  ewStringObj(zDb,
2810: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
2820: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2830: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
2840: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c  ewStringObj(zTbl
2850: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
2860: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2870: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
2880: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f  NewWideIntObj(ro
2890: 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61  wid));.  Tcl_Eva
28a0: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
28b0: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
28c0: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 7d 0a 0a 73  AL_DIRECT);.}..s
28d0: 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f  tatic void tclCo
28e0: 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76  llateNeeded(.  v
28f0: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c  oid *pCtx,.  sql
2900: 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
2910: 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  enc,.  const cha
2920: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71  r *zName.){.  Sq
2930: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
2940: 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a  qliteDb *)pCtx;.
2950: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
2960: 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  pt = Tcl_Duplica
2970: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c  teObj(pDb->pColl
2980: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63  ateNeeded);.  Tc
2990: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
29a0: 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c  Script);.  Tcl_L
29b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
29c0: 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20  ent(0, pScript, 
29d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
29e0: 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  (zName, -1));.  
29f0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
2a00: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69  b->interp, pScri
2a10: 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pt, 0);.  Tcl_De
2a20: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
2a30: 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pt);.}../*.** Th
2a40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2a50: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
2a60: 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f   an SQL collatio
2a70: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  n function imple
2a80: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
2a90: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
2aa0: 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c  tatic int tclSql
2ab0: 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  Collate(.  void 
2ac0: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c  *pCtx,.  int nA,
2ad0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
2ae0: 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63  A,.  int nB,.  c
2af0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
2b00: 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70  .  SqlCollate *p
2b10: 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a   = (SqlCollate *
2b20: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
2b30: 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20   *pCmd;..  pCmd 
2b40: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
2b50: 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d  bj(p->zScript, -
2b60: 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
2b70: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
2b80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b90: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
2ba0: 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  rp, pCmd, Tcl_Ne
2bb0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e  wStringObj(zA, n
2bc0: 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  A));.  Tcl_ListO
2bd0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2be0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
2bf0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2c00: 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63  j(zB, nB));.  Tc
2c10: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
2c20: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
2c30: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
2c40: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
2c50: 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72  t(pCmd);.  retur
2c60: 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  n (atoi(Tcl_GetS
2c70: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
2c80: 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a  nterp)));.}../*.
2c90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ca0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
2cb0: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e  luate an SQL fun
2cc0: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65  ction implemente
2cd0: 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73  d.** using TCL s
2ce0: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
2cf0: 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63   void tclSqlFunc
2d00: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2d10: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
2d20: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
2d30: 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c  ue**argv){.  Sql
2d40: 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65  Func *p = sqlite
2d50: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
2d60: 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ext);.  Tcl_Obj 
2d70: 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pCmd;.  int i;.
2d80: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2d90: 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20   argc==0 ){.    
2da0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
2db0: 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  no arguments to 
2dc0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61  the function, ca
2dd0: 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  ll Tcl_EvalObjEx
2de0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   on the.    ** s
2df0: 63 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72  cript object dir
2e00: 65 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c  ectly.  This all
2e10: 6f 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70  ows the TCL comp
2e20: 69 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  iler to generate
2e30: 0a 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65  .    ** bytecode
2e40: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64   for the command
2e50: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e   on the first in
2e60: 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75  vocation and thu
2e70: 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  s make.    ** su
2e80: 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
2e90: 69 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72  ions much faster
2ea0: 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20  . */.    pCmd = 
2eb0: 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20  p->pScript;.    
2ec0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2ed0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d  (pCmd);.    rc =
2ee0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
2ef0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
2f00: 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  0);.    Tcl_Decr
2f10: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
2f20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2f30: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 72 67  If there are arg
2f40: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75  uments to the fu
2f50: 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73  nction, make a s
2f60: 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74  hallow copy of t
2f70: 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74  he.    ** script
2f80: 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64   object, lappend
2f90: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20   the arguments, 
2fa0: 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
2fb0: 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20  e copy..    **. 
2fc0: 20 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f     ** By "shallo
2fd0: 77 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e  w" copy, we mean
2fe0: 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65   a only the oute
2ff0: 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69  r list Tcl_Obj i
3000: 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20 20  s duplicated..  
3010: 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63 6c    ** The new Tcl
3020: 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f  _Obj contains po
3030: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f 72  inters to the or
3040: 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d  iginal list elem
3050: 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68  ents. .    ** Th
3060: 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63 6c  at way, when Tcl
3070: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 72  _EvalObjv() is r
3080: 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73 20  un and shimmers 
3090: 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  the first elemen
30a0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
30b0: 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61  list to tclCmdNa
30c0: 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c 74  meType, that alt
30d0: 65 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e 74  ernate represent
30e0: 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ation will.    *
30f0: 2a 20 62 65 20 70 72 65 73 65 72 76 65 64 20 61  * be preserved a
3100: 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68 65  nd reused on the
3110: 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e   next invocation
3120: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  ..    */.    Tcl
3130: 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20  _Obj **aArg;.   
3140: 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
3150: 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f( Tcl_ListObjGe
3160: 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74  tElements(p->int
3170: 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c  erp, p->pScript,
3180: 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20 29   &nArg, &aArg) )
3190: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
31a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
31b0: 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72  text, Tcl_GetStr
31c0: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
31d0: 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20  erp), -1); .    
31e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20    return;.    } 
31f0: 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d 20      .    pCmd = 
3200: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e  Tcl_NewListObj(n
3210: 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20 20  Arg, aArg);.    
3220: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3230: 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28  (pCmd);.    for(
3240: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
3250: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3260: 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72  _value *pIn = ar
3270: 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c  gv[i];.      Tcl
3280: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20  _Obj *pVal;.    
3290: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
32a0: 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f  * Set pVal to co
32b0: 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63  ntain the i'th c
32c0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f  olumn of this ro
32d0: 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74  w. */.      swit
32e0: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
32f0: 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a 20  e_type(pIn) ){. 
3300: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
3310: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
3320: 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d       int bytes =
3330: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
3340: 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20  ytes(pIn);.     
3350: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
3360: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
3370: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
3380: 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b  ob(pIn), bytes);
3390: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
33a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
33c0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
33d0: 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36       sqlite_int6
33e0: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
33f0: 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a  lue_int64(pIn);.
3400: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
3410: 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20  =-2147483647 && 
3420: 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  v<=2147483647 ){
3430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61  .            pVa
3440: 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  l = Tcl_NewIntOb
3450: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
3460: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3470: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
3480: 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a  wWideIntObj(v);.
3490: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
34b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
34c0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
34d0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  : {.          do
34e0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
34f0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49  _value_double(pI
3500: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
3510: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
3520: 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20  leObj(r);.      
3530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3540: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
3550: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
3560: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
3570: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
3580: 62 6a 28 22 22 2c 20 30 29 3b 0a 20 20 20 20 20  bj("", 0);.     
3590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65      }.        de
35b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
35c0: 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73     int bytes = s
35d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
35e0: 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  es(pIn);.       
35f0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
3600: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
3610: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
3620: 5f 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74 65  _text(pIn), byte
3630: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  s);.          br
3640: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
3650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
3660: 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  = Tcl_ListObjApp
3670: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
3680: 74 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c  terp, pCmd, pVal
3690: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
36a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ){.        Tcl_D
36b0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ecrRefCount(pCmd
36c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
36d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
36e0: 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74  context, Tcl_Get
36f0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
3700: 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20  interp), -1); . 
3710: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
3720: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3730: 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61 6c   if( !p->useEval
3740: 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Objv ){.      /*
3750: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29   Tcl_EvalObjEx()
3760: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
3770: 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  lly call Tcl_Eva
3780: 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64 0a  lObjv() if pCmd.
3790: 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c 69        ** is a li
37a0: 73 74 20 77 69 74 68 6f 75 74 20 61 20 73 74 72  st without a str
37b0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
37c0: 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20  on.  To prevent 
37d0: 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  this from.      
37e0: 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61  ** happening, ma
37f0: 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68 61 73  ke sure pCmd has
3800: 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20   a valid string 
3810: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a  representation *
3820: 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  /.      Tcl_GetS
3830: 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20  tring(pCmd);.   
3840: 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f   }.    rc = Tcl_
3850: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
3860: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
3870: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20  VAL_DIRECT);.   
3880: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3890: 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20  t(pCmd);.  }..  
38a0: 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 54 43  if( rc && rc!=TC
38b0: 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20 20  L_RETURN ){.    
38c0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
38d0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
38e0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
38f0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
3900: 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ); .  }else{.   
3910: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d   Tcl_Obj *pVar =
3920: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
3930: 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  t(p->interp);.  
3940: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20    int n;.    u8 
3950: 2a 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20  *data;.    char 
3960: 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74  *zType = pVar->t
3970: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
3980: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
3990: 22 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  ";.    char c = 
39a0: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66  zType[0];.    if
39b0: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
39c0: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
39d0: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
39e0: 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20  ->bytes==0 ){.  
39f0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75      /* Only retu
3a00: 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69  rn a BLOB type i
3a10: 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62  f the Tcl variab
3a20: 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61  le is a bytearra
3a30: 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68  y and.      ** h
3a40: 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70  as no string rep
3a50: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  resentation. */.
3a60: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
3a70: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
3a80: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
3a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3aa0: 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78  sult_blob(contex
3ab0: 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  t, data, n, SQLI
3ac0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
3ad0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
3ae0: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
3af0: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
3b00: 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  =0) ||.         
3b10: 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63   (c=='i' && strc
3b20: 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d  mp(zType,"int")=
3b30: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  =0) ){.      Tcl
3b40: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30  _GetIntFromObj(0
3b50: 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  , pVar, &n);.   
3b60: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3b70: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e  t_int(context, n
3b80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
3b90: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
3ba0: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
3bb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f  )==0 ){.      do
3bc0: 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63  uble r;.      Tc
3bd0: 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
3be0: 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b  bj(0, pVar, &r);
3bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
3c00: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
3c10: 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65  text, r);.    }e
3c20: 6c 73 65 20 69 66 28 20 63 3d 3d 27 77 27 20 26  lse if( c=='w' &
3c30: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
3c40: 77 69 64 65 49 6e 74 22 29 3d 3d 30 20 29 7b 0a  wideInt")==0 ){.
3c50: 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
3c60: 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  t v;.      Tcl_G
3c70: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
3c80: 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20  (0, pVar, &v);. 
3c90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3ca0: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
3cb0: 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, v);.    }else
3cc0: 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 28  {.      data = (
3cd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
3ce0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3cf0: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
3d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3d10: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
3d20: 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  t, (char *)data,
3d30: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
3d40: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IENT);.    }.  }
3d50: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
3d60: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
3d70: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ATION./*.** This
3d80: 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74 69   is the authenti
3d90: 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  cation function.
3da0: 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68 65    It appends the
3db0: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a   authentication.
3dc0: 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64  ** type code and
3dd0: 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e   the two argumen
3de0: 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65  ts to zCmd[] the
3df0: 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65  n invokes the re
3e00: 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69  sult.** on the i
3e10: 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 65  nterpreter.  The
3e20: 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e   reply is examin
3e30: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
3e40: 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e  if the.** authen
3e50: 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f  tication fails o
3e60: 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73  r succeeds..*/.s
3e70: 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63  tatic int auth_c
3e80: 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20  allback(.  void 
3e90: 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64  *pArg,.  int cod
3ea0: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
3eb0: 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20  *zArg1,.  const 
3ec0: 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63  char *zArg2,.  c
3ed0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33  onst char *zArg3
3ee0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
3ef0: 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61 72 20  zArg4.){.  char 
3f00: 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53  *zCode;.  Tcl_DS
3f10: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
3f20: 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
3f30: 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c  r *zReply;.  Sql
3f40: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3f50: 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 0a 20  liteDb*)pArg;.. 
3f60: 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b   switch( code ){
3f70: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3f80: 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20  _COPY           
3f90: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
3fa0: 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b  TE_COPY"; break;
3fb0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3fc0: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20  _CREATE_INDEX   
3fd0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
3fe0: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22  TE_CREATE_INDEX"
3ff0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4000: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
4010: 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f  TABLE      : zCo
4020: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
4030: 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  E_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 49 4e 44  _CREATE_TEMP_IND
4060: 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  EX : zCode="SQLI
4070: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
4080: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
4090: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
40a0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20  EATE_TEMP_TABLE 
40b0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
40c0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
40d0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
40e0: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
40f0: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20  E_TEMP_TRIGGER: 
4100: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
4110: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
4120: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
4130: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
4140: 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a  E_TEMP_VIEW  : z
4150: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
4160: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ATE_TEMP_VIEW"; 
4170: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4180: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
4190: 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65  IGGER    : zCode
41a0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
41b0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
41c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
41d0: 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20  _CREATE_VIEW    
41e0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
41f0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b  TE_CREATE_VIEW";
4200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4210: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20   SQLITE_DELETE  
4220: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4230: 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e="SQLITE_DELETE
4240: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4250: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  se SQLITE_DROP_I
4260: 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43  NDEX        : zC
4270: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
4280: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
4290: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
42a0: 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20  DROP_TABLE      
42b0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
42c0: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62  E_DROP_TABLE"; b
42d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
42e0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
42f0: 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d  INDEX   : zCode=
4300: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
4310: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
4320: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4330: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
4340: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4350: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
4360: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
4370: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
4380: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20  _TEMP_TRIGGER : 
4390: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
43a0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  OP_TEMP_TRIGGER"
43b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
43c0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
43d0: 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f  MP_VIEW    : zCo
43e0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
43f0: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
4400: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4410: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20  TE_DROP_TRIGGER 
4420: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
4430: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
4440: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
4450: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
4460: 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a  VIEW         : z
4470: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
4480: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
4490: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
44a0: 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20  INSERT          
44b0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
44c0: 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b  E_INSERT"; break
44d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
44e0: 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20  E_PRAGMA        
44f0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
4500: 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65  ITE_PRAGMA"; bre
4510: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4520: 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20  ITE_READ        
4530: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
4540: 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65  QLITE_READ"; bre
4550: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4560: 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20  ITE_SELECT      
4570: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
4580: 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62  QLITE_SELECT"; b
4590: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
45a0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
45b0: 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  N       : zCode=
45c0: 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54  "SQLITE_TRANSACT
45d0: 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ION"; break;.   
45e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44   case SQLITE_UPD
45f0: 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ATE            :
4600: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55   zCode="SQLITE_U
4610: 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  PDATE"; break;. 
4620: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
4630: 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  TTACH           
4640: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4650: 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _ATTACH"; break;
4660: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4670: 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20  _DETACH         
4680: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4690: 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61  TE_DETACH"; brea
46a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
46b0: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20  TE_ALTER_TABLE  
46c0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
46d0: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
46e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
46f0: 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  se SQLITE_REINDE
4700: 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  X           : zC
4710: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e  ode="SQLITE_REIN
4720: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
4730: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41   case SQLITE_ANA
4740: 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a  LYZE           :
4750: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
4760: 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a  NALYZE"; break;.
4770: 20 20 20 20 64 65 66 61 75 6c 74 20 20 20 20 20      default     
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22    : zCode="????"
47a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ; break;.  }.  T
47b0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
47c0: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
47d0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
47e0: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b  pDb->zAuth, -1);
47f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
4800: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
4810: 2c 20 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f  , zCode);.  Tcl_
4820: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
4830: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31  ment(&str, zArg1
4840: 20 3f 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a   ? zArg1 : "");.
4850: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4860: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
4870: 20 7a 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a   zArg2 ? zArg2 :
4880: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
4890: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
48a0: 28 26 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a  (&str, zArg3 ? z
48b0: 41 72 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg3 : "");.  Tc
48c0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
48d0: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
48e0: 67 34 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29  g4 ? zArg4 : "")
48f0: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f  ;.  rc = Tcl_Glo
4900: 62 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  balEval(pDb->int
4910: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
4920: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
4930: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
4940: 26 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20  &str);.  zReply 
4950: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  = Tcl_GetStringR
4960: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
4970: 70 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  p);.  if( strcmp
4980: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
4990: 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  OK")==0 ){.    r
49a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
49b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
49c0: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
49d0: 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20  _DENY")==0 ){.  
49e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 45    rc = SQLITE_DE
49f0: 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NY;.  }else if( 
4a00: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
4a10: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d  QLITE_IGNORE")==
4a20: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
4a30: 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d  LITE_IGNORE;.  }
4a40: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 39  else{.    rc = 9
4a50: 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  99;.  }.  return
4a60: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
4a70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
4a80: 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  HORIZATION */../
4a90: 2a 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20 61 20  *.** zText is a 
4aa0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 65 78 74 20  pointer to text 
4ab0: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 61 6e 20  obtained via an 
4ac0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4ad0: 65 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69  ext().** or simi
4ae0: 6c 61 72 20 69 6e 74 65 72 66 61 63 65 2e 20 54  lar interface. T
4af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4b00: 72 6e 73 20 61 20 54 63 6c 20 73 74 72 69 6e 67  rns a Tcl string
4b10: 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66   object, .** ref
4b20: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 73 65 74  erence count set
4b30: 20 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e   to 0, containin
4b40: 67 20 74 68 65 20 74 65 78 74 2e 20 49 66 20 61  g the text. If a
4b50: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20   translation.** 
4b60: 62 65 74 77 65 65 6e 20 69 73 6f 38 38 35 39 20  between iso8859 
4b70: 61 6e 64 20 55 54 46 2d 38 20 69 73 20 72 65 71  and UTF-8 is req
4b80: 75 69 72 65 64 2c 20 69 74 20 69 73 20 70 72 65  uired, it is pre
4b90: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
4ba0: 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78  c Tcl_Obj *dbTex
4bb0: 74 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73  tToObj(char cons
4bc0: 74 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c  t *zText){.  Tcl
4bd0: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64  _Obj *pVal;.#ifd
4be0: 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ef UTF_TRANSLATI
4bf0: 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f  ON_NEEDED.  Tcl_
4c00: 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20  DString dCol;.  
4c10: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
4c20: 26 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78  &dCol);.  Tcl_Ex
4c30: 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69  ternalToUtfDStri
4c40: 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20  ng(NULL, zText, 
4c50: 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56  -1, &dCol);.  pV
4c60: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
4c70: 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e  ngObj(Tcl_DStrin
4c80: 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d  gValue(&dCol), -
4c90: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
4ca0: 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65  gFree(&dCol);.#e
4cb0: 6c 73 65 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c  lse.  pVal = Tcl
4cc0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
4cd0: 65 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  ext, -1);.#endif
4ce0: 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a  .  return pVal;.
4cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4d00: 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69  utine reads a li
4d10: 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20  ne of text from 
4d20: 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a  FILE in, stores.
4d30: 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d  ** the text in m
4d40: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4d50: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
4d60: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
4d70: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78  er.** to the tex
4d80: 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  t.  NULL is retu
4d90: 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66  rned at end of f
4da0: 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f  ile, or if mallo
4db0: 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a  c().** fails..**
4dc0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
4dd0: 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64 6c  e is like "readl
4de0: 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d  ine" but no comm
4df0: 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67  and-line editing
4e00: 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a  .** is done..**.
4e10: 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73  ** copied from s
4e20: 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d  hell.c from '.im
4e30: 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f  port' command.*/
4e40: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f  .static char *lo
4e50: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72  cal_getline(char
4e60: 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20   *zPrompt, FILE 
4e70: 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  *in){.  char *zL
4e80: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  ine;.  int nLine
4e90: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
4ea0: 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d   eol;..  nLine =
4eb0: 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20   100;.  zLine = 
4ec0: 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b  malloc( nLine );
4ed0: 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20  .  if( zLine==0 
4ee0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
4ef0: 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a  = 0;.  eol = 0;.
4f00: 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b    while( !eol ){
4f10: 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e  .    if( n+100>n
4f20: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c  Line ){.      nL
4f30: 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20  ine = nLine*2 + 
4f40: 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  100;.      zLine
4f50: 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65   = realloc(zLine
4f60: 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , nLine);.      
4f70: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
4f80: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
4f90: 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c     if( fgets(&zL
4fa0: 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20  ine[n], nLine - 
4fb0: 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n, in)==0 ){.   
4fc0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
4fd0: 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e         free(zLin
4fe0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
4ff0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
5000: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
5010: 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b  ;.      eol = 1;
5020: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5030: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
5040: 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20  Line[n] ){ n++; 
5050: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
5060: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
5070: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
5080: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
5090: 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20   0;.      eol = 
50a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  1;.    }.  }.  z
50b0: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20  Line = realloc( 
50c0: 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20  zLine, n+1 );.  
50d0: 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a  return zLine;.}.
50e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69  ./*.** The "sqli
50f0: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f  te" command belo
5100: 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  w creates a new 
5110: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  Tcl command for 
5120: 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  each.** connecti
5130: 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61  on it opens to a
5140: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
5150: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
5160: 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77   is invoked.** w
5170: 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74  henever one of t
5180: 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  hose connection-
5190: 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64  specific command
51a0: 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a  s is executed.**
51b0: 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78   in Tcl.  For ex
51c0: 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75  ample, if you ru
51d0: 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20  n Tcl code like 
51e0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
51f0: 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22    sqlite3 db1  "
5200: 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20  my_database".** 
5210: 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a        db1 close.
5220: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
5230: 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20  command opens a 
5240: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
5250: 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20  e "my_database" 
5260: 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20  database.** and 
5270: 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65  calls that conne
5280: 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68  ction "db1".  Th
5290: 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64  e second command
52a0: 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20   causes this.** 
52b0: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65  subroutine to be
52c0: 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61   invoked..*/.sta
52d0: 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64  tic int DbObjCmd
52e0: 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
52f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
5300: 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20  nt objc,Tcl_Obj 
5310: 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20  *const*objv){.  
5320: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
5330: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
5340: 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69   int choice;.  i
5350: 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  nt rc = TCL_OK;.
5360: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
5370: 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d  har *DB_strs[] =
5380: 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a   {.    "authoriz
5390: 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75  er",         "bu
53a0: 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sy",            
53b0: 20 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22    "cache",.    "
53c0: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20  changes",       
53d0: 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20       "close",   
53e0: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61            "colla
53f0: 74 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  te",.    "collat
5400: 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22  ion_needed",   "
5410: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20  commit_hook",   
5420: 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a      "complete",.
5430: 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20      "copy",     
5440: 20 20 20 20 20 20 20 20 20 20 22 65 72 72 6f 72            "error
5450: 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 22  code",         "
5460: 65 76 61 6c 22 2c 0a 20 20 20 20 22 65 78 69 73  eval",.    "exis
5470: 74 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ts",            
5480: 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20   "function",    
5490: 20 20 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65        "last_inse
54a0: 72 74 5f 72 6f 77 69 64 22 2c 0a 20 20 20 20 22  rt_rowid",.    "
54b0: 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20  nullvalue",     
54c0: 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22       "onecolumn"
54d0: 2c 20 20 20 20 20 20 20 20 20 22 70 72 6f 66 69  ,         "profi
54e0: 6c 65 22 2c 0a 20 20 20 20 22 70 72 6f 67 72 65  le",.    "progre
54f0: 73 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  ss",           "
5500: 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20  rekey",         
5510: 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f      "rollback_ho
5520: 6f 6b 22 2c 0a 20 20 20 20 22 73 6f 66 74 5f 68  ok",.    "soft_h
5530: 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 22  eap_limit",    "
5540: 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
5550: 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67      "total_chang
5560: 65 73 22 2c 0a 20 20 20 20 22 74 72 61 63 65 22  es",.    "trace"
5570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
5580: 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20  transaction",   
5590: 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b      "update_hook
55a0: 22 2c 20 20 20 20 20 20 20 0a 20 20 20 20 22 76  ",       .    "v
55b0: 65 72 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  ersion",        
55c0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
55d0: 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20           .  };. 
55e0: 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a   enum DB_enum {.
55f0: 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45      DB_AUTHORIZE
5600: 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42 55 53  R,        DB_BUS
5610: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  Y,             D
5620: 42 5f 43 41 43 48 45 2c 0a 20 20 20 20 44 42 5f  B_CACHE,.    DB_
5630: 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20  CHANGES,        
5640: 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20     DB_CLOSE,    
5650: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41          DB_COLLA
5660: 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41  TE,.    DB_COLLA
5670: 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42  TION_NEEDED,  DB
5680: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20  _COMMIT_HOOK,   
5690: 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a     DB_COMPLETE,.
56a0: 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20      DB_COPY,    
56b0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 52 52            DB_ERR
56c0: 4f 52 43 4f 44 45 2c 20 20 20 20 20 20 20 20 44  ORCODE,        D
56d0: 42 5f 45 56 41 4c 2c 0a 20 20 20 20 44 42 5f 45  B_EVAL,.    DB_E
56e0: 58 49 53 54 53 2c 20 20 20 20 20 20 20 20 20 20  XISTS,          
56f0: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20    DB_FUNCTION,  
5700: 20 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49         DB_LAST_I
5710: 4e 53 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20  NSERT_ROWID,.   
5720: 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20   DB_NULLVALUE,  
5730: 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c         DB_ONECOL
5740: 55 4d 4e 2c 20 20 20 20 20 20 20 20 44 42 5f 50  UMN,        DB_P
5750: 52 4f 46 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50  ROFILE,.    DB_P
5760: 52 4f 47 52 45 53 53 2c 20 20 20 20 20 20 20 20  ROGRESS,        
5770: 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20    DB_REKEY,     
5780: 20 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41         DB_ROLLBA
5790: 43 4b 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f  CK_HOOK,.    DB_
57a0: 53 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 2c  SOFT_HEAP_LIMIT,
57b0: 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20     DB_TIMEOUT,  
57c0: 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c          DB_TOTAL
57d0: 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 0a 20 20  _CHANGES,    .  
57e0: 20 20 44 42 5f 54 52 41 43 45 2c 20 20 20 20 20    DB_TRACE,     
57f0: 20 20 20 20 20 20 20 20 44 42 5f 54 52 41 4e 53          DB_TRANS
5800: 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 44 42 5f  ACTION,      DB_
5810: 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20  UPDATE_HOOK,    
5820: 20 20 0a 20 20 20 20 44 42 5f 56 45 52 53 49 4f    .    DB_VERSIO
5830: 4e 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27  N.  };.  /* don'
5840: 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67  t leave trailing
5850: 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e   commas on DB_en
5860: 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20  um, it confuses 
5870: 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70  the AIX xlc comp
5880: 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  iler */..  if( o
5890: 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc<2 ){.    Tcl
58a0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
58b0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
58c0: 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29  SUBCOMMAND ...")
58d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
58e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
58f0: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
5900: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
5910: 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20  jv[1], DB_strs, 
5920: 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68  "option", 0, &ch
5930: 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74  oice) ){.    ret
5940: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5950: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65   }..  switch( (e
5960: 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69  num DB_enum)choi
5970: 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24  ce ){..  /*    $
5980: 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43  db authorizer ?C
5990: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
59a0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
59b0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  ven callback to 
59c0: 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53  authorize each S
59d0: 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20  QL operation as 
59e0: 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69  it is.  ** compi
59f0: 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74  led.  5 argument
5a00: 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74  s are appended t
5a10: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62  o the callback b
5a20: 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a  efore it is.  **
5a30: 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20   invoked:.  **. 
5a40: 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75   **   (1) The au
5a50: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
5a60: 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45   (ex: SQLITE_CRE
5a70: 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54  ATE_TABLE, SQLIT
5a80: 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20  E_INSERT, ...). 
5a90: 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20   **   (2) First 
5aa0: 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65  descriptive name
5ab0: 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74   (depends on aut
5ac0: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29  horization type)
5ad0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f  .  **   (3) Seco
5ae0: 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e  nd descriptive n
5af0: 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e  ame.  **   (4) N
5b00: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
5b10: 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c  ase (ex: "main",
5b20: 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20   "temp").  **   
5b30: 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67  (5) Name of trig
5b40: 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e  ger that is doin
5b50: 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a  g the access.  *
5b60: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62  *.  ** The callb
5b70: 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72  ack should retur
5b80: 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c  n on of the foll
5b90: 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53  owing strings: S
5ba0: 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53  QLITE_OK,.  ** S
5bb0: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72  QLITE_IGNORE, or
5bc0: 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41   SQLITE_DENY.  A
5bd0: 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
5be0: 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f  value is an erro
5bf0: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  r..  **.  ** If 
5c00: 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69  this method is i
5c10: 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61  nvoked with no a
5c20: 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75  rguments, the cu
5c30: 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74  rrent authorizat
5c40: 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63  ion.  ** callbac
5c50: 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75  k string is retu
5c60: 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  rned..  */.  cas
5c70: 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a  e DB_AUTHORIZER:
5c80: 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
5c90: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
5ca0: 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  ION.    Tcl_Appe
5cb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5cc0: 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20   "authorization 
5cd0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
5ce0: 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29   this build", 0)
5cf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
5d00: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
5d10: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
5d20: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
5d30: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
5d40: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
5d50: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
5d60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5d70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
5d80: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
5d90: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
5da0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
5db0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5dc0: 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b   pDb->zAuth, 0);
5dd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5de0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
5df0: 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74  zAuth;.      int
5e00: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
5e10: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
5e20: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
5e30: 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20  Db->zAuth);.    
5e40: 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20    }.      zAuth 
5e50: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
5e60: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
5e70: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
5e80: 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20   zAuth && len>0 
5e90: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
5ea0: 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zAuth = Tcl_Allo
5eb0: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
5ec0: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
5ed0: 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 29 3b  ->zAuth, zAuth);
5ee0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5ef0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
5f00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
5f10: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
5f20: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  th ){.        pD
5f30: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
5f40: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
5f50: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
5f60: 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68  er(pDb->db, auth
5f70: 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b  _callback, pDb);
5f80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5f90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
5fa0: 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62  t_authorizer(pDb
5fb0: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
5fc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
5fd0: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
5fe0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75  ..  /*    $db bu
5ff0: 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  sy ?CALLBACK?.  
6000: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
6010: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
6020: 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74  k if an SQL stat
6030: 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74  ement attempts t
6040: 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f  o open.  ** a lo
6050: 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69  cked database fi
6060: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  le..  */.  case 
6070: 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69  DB_BUSY: {.    i
6080: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
6090: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
60a0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
60b0: 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29  bjv, "CALLBACK")
60c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
60d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
60e0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
60f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
6100: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20  ->zBusy ){.     
6110: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6120: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
6130: 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20  >zBusy, 0);.    
6140: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6150: 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79       char *zBusy
6160: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
6170: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
6180: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
6190: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
61a0: 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Busy);.      }. 
61b0: 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c       zBusy = Tcl
61c0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
61d0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
61e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73  ;.      if( zBus
61f0: 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  y && len>0 ){.  
6200: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
6210: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
6220: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
6230: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 42 75   strcpy(pDb->zBu
6240: 73 79 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20 20  sy, zBusy);.    
6250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6260: 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b   pDb->zBusy = 0;
6270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6280: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
6290: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
62a0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
62b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
62c0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
62d0: 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c  >db, DbBusyHandl
62e0: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
62f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
6300: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
6310: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
6320: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6330: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
6340: 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
6350: 61 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20  ache flush.  ** 
6360: 20 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69      $db cache si
6370: 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  ze n.  **.  ** F
6380: 6c 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65  lush the prepare
6390: 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  d statement cach
63a0: 65 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61  e, or set the ma
63b0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a  ximum number of.
63c0: 20 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74    ** cached stat
63d0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63  ements..  */.  c
63e0: 61 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a  ase DB_CACHE: {.
63f0: 20 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64      char *subCmd
6400: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  ;.    int n;..  
6410: 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b    if( objc<=2 ){
6420: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
6430: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
6440: 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20  1, objv, "cache 
6450: 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a  option ?arg?");.
6460: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6470: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6480: 20 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47    subCmd = Tcl_G
6490: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
64a0: 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20   objv[2], 0 );. 
64b0: 20 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d     if( *subCmd==
64c0: 27 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  'f' && strcmp(su
64d0: 62 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30  bCmd,"flush")==0
64e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
64f0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
6500: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
6510: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
6520: 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20  v, "flush");.   
6530: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6540: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
6550: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73  se{.        flus
6560: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
6570: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6580: 65 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64  else if( *subCmd
6590: 3d 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28  =='s' && strcmp(
65a0: 73 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d  subCmd,"size")==
65b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 ){.      if( o
65c0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
65d0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
65e0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
65f0: 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20  jv, "size n");. 
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 7d  L_ERROR;.      }
6620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
6630: 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c  ( TCL_ERROR==Tcl
6640: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
6650: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
6660: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  &n) ){.         
6670: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6680: 74 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  t( interp, "cann
6690: 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20  ot convert \"", 
66a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
66b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
66c0: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c  mObj(objv[3],0),
66d0: 20 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22   "\" to integer"
66e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
66f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6700: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6710: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
6720: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
6730: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
6740: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20  ( pDb );.       
6750: 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20       n = 0;.    
6760: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6770: 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  n>MAX_PREPARED_S
6780: 54 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20  TMTS ){.        
6790: 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50      n = MAX_PREP
67a0: 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20  ARED_STMTS;.    
67b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
67c0: 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d    pDb->maxStmt =
67d0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   n;.        }.  
67e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
67f0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
6800: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
6810: 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22   "bad option \""
6820: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  , .          Tcl
6830: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6840: 6a 28 6f 62 6a 76 5b 30 5d 2c 30 29 2c 20 22 5c  j(objv[0],0), "\
6850: 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68  ": must be flush
6860: 20 6f 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20   or size", 0);. 
6870: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6880: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6890: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
68a0: 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65  *     $db change
68b0: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  s.  **.  ** Retu
68c0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
68d0: 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
68e0: 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74  modified, insert
68f0: 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62  ed, or deleted b
6900: 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20  y.  ** the most 
6910: 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55  recent INSERT, U
6920: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
6930: 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69  statement, not i
6940: 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61  ncluding .  ** a
6950: 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
6960: 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
6970: 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ams..  */.  case
6980: 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20   DB_CHANGES: {. 
6990: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
69a0: 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ult;.    if( obj
69b0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
69c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
69d0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
69e0: 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
69f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6a00: 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d   }.    pResult =
6a10: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
6a20: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
6a30: 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
6a40: 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68  sult, sqlite3_ch
6a50: 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
6a60: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6a70: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f  .  /*    $db clo
6a80: 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75  se.  **.  ** Shu
6a90: 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61  tdown the databa
6aa0: 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  se.  */.  case D
6ab0: 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54  B_CLOSE: {.    T
6ac0: 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
6ad0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
6ae0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
6af0: 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20  jv[0], 0));.    
6b00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6b10: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
6b20: 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50  llate NAME SCRIP
6b30: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
6b40: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
6b50: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
6b60: 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
6b70: 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
6b80: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6b90: 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
6ba0: 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
6bb0: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
6bc0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
6bd0: 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f  ATE: {.    SqlCo
6be0: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
6bf0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
6c00: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72  ;.    char *zScr
6c10: 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63  ipt;.    int nSc
6c20: 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  ript;.    if( ob
6c30: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
6c40: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6c50: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
6c60: 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b   "NAME SCRIPT");
6c70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
6c80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6c90: 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
6ca0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6cb0: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
6cc0: 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47   zScript = Tcl_G
6cd0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6ce0: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70  objv[3], &nScrip
6cf0: 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  t);.    pCollate
6d00: 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29   = (SqlCollate*)
6d10: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
6d20: 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e  f(*pCollate) + n
6d30: 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20  Script + 1 );.  
6d40: 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d    if( pCollate==
6d50: 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
6d60: 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  RROR;.    pColla
6d70: 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  te->interp = int
6d80: 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  erp;.    pCollat
6d90: 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  e->pNext = pDb->
6da0: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43  pCollate;.    pC
6db0: 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20  ollate->zScript 
6dc0: 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61  = (char*)&pColla
6dd0: 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e  te[1];.    pDb->
6de0: 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c  pCollate = pColl
6df0: 61 74 65 3b 0a 20 20 20 20 73 74 72 63 70 79 28  ate;.    strcpy(
6e00: 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70  pCollate->zScrip
6e10: 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20  t, zScript);.   
6e20: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65   if( sqlite3_cre
6e30: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44  ate_collation(pD
6e40: 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51  b->db, zName, SQ
6e50: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
6e60: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63      pCollate, tc
6e70: 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a  lSqlCollate) ){.
6e80: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
6e90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
6ea0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
6eb0: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
6ec0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
6ed0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6ee0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
6ef0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
6f00: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
6f10: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52  ation_needed SCR
6f20: 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
6f30: 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63  eate a new SQL c
6f40: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
6f50: 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
6f60: 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68  Whenever.  ** th
6f70: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  at function is c
6f80: 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
6f90: 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
6fa0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
6fb0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
6fc0: 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20  LLATION_NEEDED: 
6fd0: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  {.    if( objc!=
6fe0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
6ff0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
7000: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 2, objv, "SC
7010: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
7020: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7030: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44      }.    if( pD
7040: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
7050: 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  d ){.      Tcl_D
7060: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
7070: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
7080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
7090: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
70a0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
70b0: 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  bj(objv[2]);.   
70c0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
70d0: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
70e0: 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  eeded);.    sqli
70f0: 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
7100: 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44  eded(pDb->db, pD
7110: 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65  b, tclCollateNee
7120: 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ded);.    break;
7130: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
7140: 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43  b commit_hook ?C
7150: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
7160: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
7170: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73  ven callback jus
7180: 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
7190: 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74 72  ing every SQL tr
71a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
71b0: 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  If the callback 
71c0: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
71d0: 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e  ion or returns n
71e0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
71f0: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
7200: 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20  on is aborted.  
7210: 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61  If CALLBACK is a
7220: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
7230: 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a  the callback.  *
7240: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20  * is disabled.. 
7250: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
7260: 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20  MMIT_HOOK: {.   
7270: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
7280: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
7290: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
72a0: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
72b0: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
72c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
72d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
72e0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
72f0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b   pDb->zCommit ){
7300: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
7310: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7320: 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20  , pDb->zCommit, 
7330: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
7340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
7350: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  r *zCommit;.    
7360: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
7370: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
7380: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
7390: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d  _Free(pDb->zComm
73a0: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
73b0: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c     zCommit = Tcl
73c0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
73d0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
73e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d  ;.      if( zCom
73f0: 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  mit && len>0 ){.
7400: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
7410: 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  mmit = Tcl_Alloc
7420: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
7430: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
7440: 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69  >zCommit, zCommi
7450: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
7460: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
7470: 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  ommit = 0;.     
7480: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
7490: 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
74a0: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
74b0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
74c0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
74d0: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
74e0: 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c  DbCommitHandler,
74f0: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
7500: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
7510: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
7520: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
7530: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7540: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
7550: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65  /*    $db comple
7560: 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a  te SQL.  **.  **
7570: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
7580: 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  SQL is a complet
7590: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
75a0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
75b0: 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61  f.  ** additiona
75c0: 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74  l lines of input
75d0: 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68   are needed.  Th
75e0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
75f0: 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d   the.  ** built-
7600: 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  in "info complet
7610: 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63  e" command of Tc
7620: 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  l..  */.  case D
7630: 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69  B_COMPLETE: {.#i
7640: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7650: 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54  T_COMPLETE.    T
7660: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
7670: 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  .    int isCompl
7680: 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ete;.    if( obj
7690: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
76a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
76b0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
76c0: 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
76d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
76e0: 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70      }.    isComp
76f0: 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lete = sqlite3_c
7700: 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74  omplete( Tcl_Get
7710: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
7720: 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20  jv[2], 0) );.   
7730: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
7740: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
7750: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
7760: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75  BooleanObj(pResu
7770: 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b  lt, isComplete);
7780: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
7790: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
77a0: 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63  $db copy conflic
77b0: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c  t-algorithm tabl
77c0: 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41  e filename ?SEPA
77d0: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
77e0: 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  CATOR?.  **.  **
77f0: 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20   Copy data into 
7800: 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e  table from filen
7810: 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20  ame, optionally 
7820: 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a  using SEPARATOR.
7830: 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73    ** as column s
7840: 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61  eparators.  If a
7850: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
7860: 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20   a null string, 
7870: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  or the.  ** valu
7880: 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54  e of NULLINDICAT
7890: 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e  OR, a NULL is in
78a0: 73 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63  serted for the c
78b0: 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66  olumn..  ** conf
78c0: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69  lict-algorithm i
78d0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c  s one of the sql
78e0: 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  ite conflict alg
78f0: 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20  orithms:.  **   
7900: 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74   rollback, abort
7910: 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
7920: 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20  replace.  ** On 
7930: 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
7940: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  the number of li
7950: 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e  nes processed, n
7960: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73  ot necessarily s
7970: 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20  ame.  ** as 'db 
7980: 63 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20  changes' due to 
7990: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
79a0: 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a  hm selected..  *
79b0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65  *.  ** This code
79c0: 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e   is basically an
79d0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f   implementation/
79e0: 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20  enhancement of. 
79f0: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20   ** the sqlite3 
7a00: 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74  shell.c ".import
7a10: 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a  " command..  **.
7a20: 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
7a30: 64 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76  d usage is equiv
7a40: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c  alent to the sql
7a50: 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74  ite2.x COPY stat
7a60: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63  ement,.  ** whic
7a70: 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64  h imports file d
7a80: 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
7a90: 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67   using the Postg
7aa0: 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20  reSQL COPY file 
7ab0: 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24  format:.  **   $
7ac0: 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74  db copy $conflit
7ad0: 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d  _algo $table_nam
7ae0: 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c  e $filename \t \
7af0: 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  \N.  */.  case D
7b00: 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68  B_COPY: {.    ch
7b10: 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20  ar *zTable;     
7b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
7b30: 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
7b40: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
7b50: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7b70: 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69  he file from whi
7b80: 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61  ch to extract da
7b90: 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ta */.    char *
7ba0: 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20  zConflict;      
7bb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
7bc0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20  flict algorithm 
7bd0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  to use */.    sq
7be0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
7bf0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  t;        /* A s
7c00: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
7c10: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
7c30: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
7c40: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c60: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
7c70: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
7c80: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
7c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ca0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7cb0: 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
7cc0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
7cd0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
7ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
7cf0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
7d00: 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d20: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7d30: 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20   in zSep[] */.  
7d40: 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20    int nNull;    
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d60: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7d70: 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20   in zNull[] */. 
7d80: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7da0: 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  * An SQL stateme
7db0: 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
7dc0: 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  zLine;          
7dd0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
7de0: 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20  e line of input 
7df0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f  from the file */
7e00: 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
7e10: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7e20: 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b   /* zLine[] brok
7e30: 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d  en up into colum
7e40: 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ns */.    char *
7e50: 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20  zCommit;        
7e60: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
7e70: 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a  commit changes *
7e80: 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20  /.    FILE *in; 
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ea0: 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66    /* The input f
7eb0: 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ile */.    int l
7ec0: 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20  ineno = 0;      
7ed0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
7ee0: 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66  umber of input f
7ef0: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
7f00: 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20  zLineNum[80];   
7f10: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
7f20: 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66 66  umber print buff
7f30: 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  er */.    Tcl_Ob
7f40: 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20  j *pResult;     
7f50: 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20        /* interp 
7f60: 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63  result */..    c
7f70: 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63  har *zSep;.    c
7f80: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20  har *zNull;.    
7f90: 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62  if( objc<5 || ob
7fa0: 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>7 ){.      Tc
7fb0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7fc0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
7fd0: 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c  .         "CONFL
7fe0: 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41  ICT-ALGORITHM TA
7ff0: 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45  BLE FILENAME ?SE
8000: 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
8010: 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20  DICATOR?");.    
8020: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8030: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
8040: 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20  ( objc>=6 ){.   
8050: 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65     zSep = Tcl_Ge
8060: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
8070: 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[5], 0);.    
8080: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65  }else{.      zSe
8090: 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a  p = "\t";.    }.
80a0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20      if( objc>=7 
80b0: 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d  ){.      zNull =
80c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
80d0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30  omObj(objv[6], 0
80e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
80f0: 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a      zNull = "";.
8100: 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c      }.    zConfl
8110: 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ict = Tcl_GetStr
8120: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8130: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62  2], 0);.    zTab
8140: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
8150: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
8160: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ], 0);.    zFile
8170: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
8180: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c  FromObj(objv[4],
8190: 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20   0);.    nSep = 
81a0: 73 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20  strlen(zSep);.  
81b0: 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e    nNull = strlen
81c0: 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28  (zNull);.    if(
81d0: 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   nSep==0 ){.    
81e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
81f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
8200: 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61  r: non-null sepa
8210: 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66  rator required f
8220: 6f 72 20 63 6f 70 79 22 2c 20 30 29 3b 0a 20 20  or copy", 0);.  
8230: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8240: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8250: 69 66 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d  if(sqlite3StrICm
8260: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f  p(zConflict, "ro
8270: 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26  llback") != 0 &&
8280: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  .       sqlite3S
8290: 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  trICmp(zConflict
82a0: 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d  , "abort"   ) !=
82b0: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c   0 &&.       sql
82c0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e  ite3StrICmp(zCon
82d0: 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20  flict, "fail"   
82e0: 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
82f0: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
8300: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e  (zConflict, "ign
8310: 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a  ore"  ) != 0 &&.
8320: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
8330: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
8340: 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20   "replace" ) != 
8350: 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
8360: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8370: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22  erp, "Error: \""
8380: 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20  , zConflict, .  
8390: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63            "\", c
83a0: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
83b0: 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  m must be one of
83c0: 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20  : rollback, ".  
83d0: 20 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74            "abort
83e0: 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
83f0: 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b  or replace", 0);
8400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8410: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8420: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
8430: 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
8440: 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20  T * FROM '%q'", 
8450: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
8460: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
8470: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8480: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
8490: 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  r: no such table
84a0: 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b  : ", zTable, 0);
84b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
84c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
84d0: 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
84e0: 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  n(zSql);.    rc 
84f0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
8500: 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
8510: 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a   0, &pStmt, 0);.
8520: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8530: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
8540: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
8550: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8560: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
8570: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
8580: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
8590: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
85a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
85b0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
85c0: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
85d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
85e0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
85f0: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
8600: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
8610: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8620: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
8630: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
8640: 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
8650: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
8660: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
8670: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8680: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
8690: 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b  t malloc()", 0);
86a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
86b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
86c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
86d0: 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53  ntf(nByte+50, zS
86e0: 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25  ql, "INSERT OR %
86f0: 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55  q INTO '%q' VALU
8700: 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20  ES(?",.         
8710: 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c  zConflict, zTabl
8720: 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
8730: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  en(zSql);.    fo
8740: 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
8750: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
8760: 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
8770: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
8780: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
8790: 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
87a0: 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
87b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
87c0: 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
87d0: 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74   zSql, 0, &pStmt
87e0: 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  , 0);.    free(z
87f0: 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
8800: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
8810: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8820: 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  p, "Error: ", sq
8830: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8840: 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
8850: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
8860: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
8870: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
8890: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72   fopen(zFile, "r
88a0: 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  b");.    if( in=
88b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
88c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
88d0: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
88e0: 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22  not open file: "
88f0: 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  , zFile, NULL);.
8900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
8910: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
8920: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8930: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8940: 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28   azCol = malloc(
8950: 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d   sizeof(azCol[0]
8960: 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20  )*(nCol+1) );.  
8970: 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29    if( azCol==0 )
8980: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
8990: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
89a0: 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20  , "Error: can't 
89b0: 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20  malloc()", 0);. 
89c0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
89d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
89e0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
89f0: 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  b->db, "BEGIN", 
8a00: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43  0, 0, 0);.    zC
8a10: 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22  ommit = "COMMIT"
8a20: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c  ;.    while( (zL
8a30: 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ine = local_getl
8a40: 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29  ine(0, in))!=0 )
8a50: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
8a60: 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  .      i = 0;.  
8a70: 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
8a80: 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a      azCol[0] = z
8a90: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
8aa0: 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a  i=0, z=zLine; *z
8ab0: 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; z++){.        
8ac0: 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20  if( *z==zSep[0] 
8ad0: 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53  && strncmp(z, zS
8ae0: 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a  ep, nSep)==0 ){.
8af0: 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30            *z = 0
8b00: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
8b10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
8b20: 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  <nCol ){.       
8b30: 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20       azCol[i] = 
8b40: 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20  &z[nSep];.      
8b50: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d        z += nSep-
8b60: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
8b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8b80: 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d  .      if( i+1!=
8b90: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
8ba0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
8bb0: 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f      zErr = mallo
8bc0: 63 28 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a  c(200 + strlen(z
8bd0: 46 69 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  File));.        
8be0: 73 70 72 69 6e 74 66 28 7a 45 72 72 2c 22 45 72  sprintf(zErr,"Er
8bf0: 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a  ror: %s line %d:
8c00: 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
8c10: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74  umns of data but
8c20: 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20   found %d",.    
8c30: 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69         zFile, li
8c40: 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29  neno, nCol, i+1)
8c50: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  ;.        Tcl_Ap
8c60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8c70: 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20  p, zErr, 0);.   
8c80: 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b       free(zErr);
8c90: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74  .        zCommit
8ca0: 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   = "ROLLBACK";. 
8cb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8cd0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
8ce0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68  ){.        /* ch
8cf0: 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74  eck for null dat
8d00: 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61  a, if so, bind a
8d10: 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  s null */.      
8d20: 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e 30 20 26    if ((nNull>0 &
8d30: 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69  & strcmp(azCol[i
8d40: 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20 7c 7c  ], zNull)==0) ||
8d50: 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d   strlen(azCol[i]
8d60: 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20 20 20  )==0) {.        
8d70: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
8d80: 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b  ull(pStmt, i+1);
8d90: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8da0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8db0: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
8dc0: 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d  t, i+1, azCol[i]
8dd0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
8de0: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
8df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8e00: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
8e10: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
8e20: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
8e30: 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  t);.      free(z
8e40: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
8e50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8e60: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
8e70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8e80: 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  p,"Error: ", sql
8e90: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
8ea0: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
8eb0: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c    zCommit = "ROL
8ec0: 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20  LBACK";.        
8ed0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8ee0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a     }.    free(az
8ef0: 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65  Col);.    fclose
8f00: 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (in);.    sqlite
8f10: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
8f20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
8f30: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f  xec(pDb->db, zCo
8f40: 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mmit, 0, 0, 0);.
8f50: 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74  .    if( zCommit
8f60: 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20  [0] == 'C' ){.  
8f70: 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20      /* success, 
8f80: 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75  set result as nu
8f90: 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
8fa0: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20  ocessed */.     
8fb0: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
8fc0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
8fd0: 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  rp);.      Tcl_S
8fe0: 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
8ff0: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  , lineno);.     
9000: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
9010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
9020: 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e  * failure, appen
9030: 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66  d lineno where f
9040: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
9050: 70 72 69 6e 74 66 28 7a 4c 69 6e 65 4e 75 6d 2c  printf(zLineNum,
9060: 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20  "%d",lineno);.  
9070: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9080: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66  sult(interp,", f
9090: 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63  ailed while proc
90a0: 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a  essing line: ",z
90b0: 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20  LineNum,0);.    
90c0: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
90d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
90e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
90f0: 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f  *    $db errorco
9100: 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  de.  **.  ** Ret
9110: 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
9120: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20  error code that 
9130: 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  was returned by 
9140: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
9150: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
9160: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a  ite3_exec()..  *
9170: 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f  /.  case DB_ERRO
9180: 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c  RCODE: {.    Tcl
9190: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
91a0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
91b0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63  Obj(sqlite3_errc
91c0: 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  ode(pDb->db)));.
91d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
91e0: 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20    .  /*.  **    
91f0: 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61  $db eval $sql ?a
9200: 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64  rray? ?{  ...cod
9210: 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20  e... }?.  **    
9220: 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73  $db onecolumn $s
9230: 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ql.  **.  ** The
9240: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
9250: 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61  n $sql is evalua
9260: 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72  ted.  For each r
9270: 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61  ow, the values a
9280: 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69  re.  ** placed i
9290: 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  n elements of th
92a0: 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61  e array named "a
92b0: 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64  rray" and ...cod
92c0: 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64  e... is executed
92d0: 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
92e0: 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65  " and "code" are
92f0: 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e   omitted, then n
9300: 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76  o callback is ev
9310: 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a  ery invoked..  *
9320: 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20  * If "array" is 
9330: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
9340: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
9350: 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76   are placed in v
9360: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68  ariables.  ** th
9370: 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  at have the same
9380: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65   name as the fie
9390: 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79  lds extracted by
93a0: 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a   the query..  **
93b0: 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c  .  ** The onecol
93c0: 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68  umn method is th
93d0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a  e equivalent of:
93e0: 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78  .  **     lindex
93f0: 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d   [$db eval $sql]
9400: 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44   0.  */.  case D
9410: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63  B_ONECOLUMN:.  c
9420: 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20 63  ase DB_EVAL:.  c
9430: 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20 7b  ase DB_EXISTS: {
9440: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
9450: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e  *zSql;      /* N
9460: 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ext SQL statemen
9470: 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  t to execute */.
9480: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
9490: 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57 68  zLeft;     /* Wh
94a0: 61 74 20 69 73 20 6c 65 66 74 20 61 66 74 65 72  at is left after
94b0: 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20 7a   first stmt in z
94c0: 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  Sql */.    sqlit
94d0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
94e0: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51    /* Compiled SQ
94f0: 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20  L statment */.  
9500: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61    Tcl_Obj *pArra
9510: 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  y;       /* Name
9520: 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20 77   of array into w
9530: 68 69 63 68 20 72 65 73 75 6c 74 73 20 61 72 65  hich results are
9540: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
9550: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
9560: 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74  ;      /* Script
9570: 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68   to run for each
9580: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
9590: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50     Tcl_Obj **apP
95a0: 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61 72  arm;      /* Par
95b0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65 65  ameters that nee
95c0: 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66 43  d a Tcl_DecrRefC
95d0: 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e  ount() */.    in
95e0: 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20  t nParm;        
95f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9600: 66 20 65 6e 74 72 69 65 73 20 75 73 65 64 20 69  f entries used i
9610: 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20  n apParm[] */.  
9620: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d    Tcl_Obj *aParm
9630: 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74  [10];    /* Stat
9640: 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 70 50  ic space for apP
9650: 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d  arm[] in the com
9660: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
9670: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20  Tcl_Obj *pRet;  
9680: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
9690: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a  to be returned *
96a0: 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72 65  /.    SqlPrepare
96b0: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b  dStmt *pPreStmt;
96c0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
96d0: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
96e0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
96f0: 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63 68  rc2;..    if( ch
9700: 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29 7b  oice==DB_EVAL ){
9710: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  .      if( objc<
9720: 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20  3 || objc>5 ){. 
9730: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
9740: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9750: 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41  2, objv, "SQL ?A
9760: 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49  RRAY-NAME? ?SCRI
9770: 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72  PT?");.        r
9780: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
97a0: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
97b0: 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  ();.      Tcl_In
97c0: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
97d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
97e0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
97f0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
9800: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9810: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
9820: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
9830: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9840: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 74      }.      pRet
9850: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
9860: 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54  choice==DB_EXIST
9870: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  S ){.        Tcl
9880: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
9890: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
98a0: 6c 65 61 6e 4f 62 6a 28 30 29 29 3b 0a 20 20 20  leanObj(0));.   
98b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
98c0: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
98d0: 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 53 63      pArray = pSc
98e0: 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ript = 0;.    }e
98f0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
9900: 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20  ){.      pArray 
9910: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69  = 0;.      pScri
9920: 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
9930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
9940: 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b  Array = objv[3];
9950: 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
9960: 65 74 53 74 72 69 6e 67 28 70 41 72 72 61 79 29  etString(pArray)
9970: 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72 61 79 20  [0]==0 ) pArray 
9980: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69  = 0;.      pScri
9990: 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20  pt = objv[4];.  
99a0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63    }..    Tcl_Inc
99b0: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32  rRefCount(objv[2
99c0: 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54  ]);.    zSql = T
99d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
99e0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
99f0: 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
9a00: 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30  TCL_OK && zSql[0
9a10: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ] ){.      int i
9a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a30: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9a40: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  unter */.      i
9a50: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9a70: 62 65 72 20 6f 66 20 62 69 6e 64 20 70 61 72 61  ber of bind para
9a80: 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20 70 53  meters in the pS
9a90: 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
9aa0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
9ab0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9ac0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
9ad0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
9ae0: 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  /.      Tcl_Obj 
9af0: 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b  **apColName = 0;
9b00: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
9b10: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
9b20: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20       int len;   
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b40: 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67 74 68  /* String length
9b50: 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20   of zSql */.  . 
9b60: 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66       /* Try to f
9b70: 69 6e 64 20 61 20 53 51 4c 20 73 74 61 74 65 6d  ind a SQL statem
9b80: 65 6e 74 20 74 68 61 74 20 68 61 73 20 61 6c 72  ent that has alr
9b90: 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c  eady been compil
9ba0: 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ed and.      ** 
9bb0: 77 68 69 63 68 20 6d 61 74 63 68 65 73 20 74 68  which matches th
9bc0: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 63 65 20  e next sequence 
9bd0: 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f  of SQL..      */
9be0: 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30  .      pStmt = 0
9bf0: 3b 0a 20 20 20 20 20 20 70 50 72 65 53 74 6d 74  ;.      pPreStmt
9c00: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
9c10: 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74  ;.      len = st
9c20: 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20  rlen(zSql);.    
9c30: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 26    if( pPreStmt &
9c40: 26 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65  & sqlite3_expire
9c50: 64 28 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  d(pPreStmt->pStm
9c60: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  t) ){.        fl
9c70: 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62  ushStmtCache(pDb
9c80: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  );.        pPreS
9c90: 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
9ca0: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 70 50 72  .      for(; pPr
9cb0: 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d  eStmt; pPreStmt=
9cc0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29  pPreStmt->pNext)
9cd0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
9ce0: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  = pPreStmt->nSql
9cf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
9d00: 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20  n>=n .          
9d10: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65    && memcmp(pPre
9d20: 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c  Stmt->zSql, zSql
9d30: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  , n)==0.        
9d40: 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d      && (zSql[n]=
9d50: 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d  =0 || zSql[n-1]=
9d60: 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b  =';').        ){
9d70: 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 6d 74  .          pStmt
9d80: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74   = pPreStmt->pSt
9d90: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c  mt;.          zL
9da0: 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65  eft = &zSql[pPre
9db0: 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20  Stmt->nSql];..  
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20          /* When 
9dd0: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
9de0: 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75  ment is found, u
9df0: 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68  nlink it from th
9e00: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
9e10: 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77  ache list.  It w
9e20: 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64  ill later be add
9e30: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  ed back to the b
9e40: 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20  eginning.       
9e50: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63     ** of the cac
9e60: 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72  he list in order
9e70: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52   to implement LR
9e80: 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20  U replacement.. 
9e90: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
9ea0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
9eb0: 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  mt->pPrev ){.   
9ec0: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
9ed0: 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  t->pPrev->pNext 
9ee0: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
9ef0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  t;.          }el
9f00: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
9f10: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
9f20: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
9f30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9f40: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
9f50: 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  tmt->pNext ){.  
9f60: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
9f70: 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  mt->pNext->pPrev
9f80: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
9f90: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ev;.          }e
9fa0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9fb0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
9fc0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
9fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9fe0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74          pDb->nSt
9ff0: 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  mt--;.          
a000: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
a010: 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
a020: 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61    /* If no prepa
a030: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61  red statement wa
a040: 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c  s found.  Compil
a050: 65 20 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20  e the SQL text. 
a060: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
a070: 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( pStmt==0 ){.  
a080: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
a090: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65  _OK!=sqlite3_pre
a0a0: 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
a0b0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
a0c0: 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20  &zLeft) ){.     
a0d0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
a0e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
a0f0: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
a100: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
a110: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  )));.          r
a120: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
a130: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a140: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a150: 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29    if( pStmt==0 )
a160: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a170: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
a180: 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e  e3_errcode(pDb->
a190: 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  db) ){.         
a1a0: 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d     /* A compile-
a1b0: 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68  time error in th
a1c0: 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  e statement.    
a1d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a1e0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
a1f0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
a200: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
a210: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
a220: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  db)));.         
a230: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
a240: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  R;.            b
a250: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a260: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a270: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d     /* The statem
a280: 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e  ent was a no-op.
a290: 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68    Continue to th
a2a0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
a2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
a2c0: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  in the SQL strin
a2d0: 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  g..            *
a2e0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  /.            zS
a2f0: 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20  ql = zLeft;.    
a300: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
a310: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a330: 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74  assert( pPreStmt
a340: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ==0 );.      }..
a350: 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 76 61        /* Bind va
a360: 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65  lues to paramete
a370: 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  rs that begin wi
a380: 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20 20 20  th $ or :.      
a390: 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61 72 20  */  .      nVar 
a3a0: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
a3b0: 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
a3c0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50 61  Stmt);.      nPa
a3d0: 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  rm = 0;.      if
a3e0: 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61 50  ( nVar>sizeof(aP
a3f0: 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61 72  arm)/sizeof(aPar
a400: 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  m[0]) ){.       
a410: 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f   apParm = (Tcl_O
a420: 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e  bj**)Tcl_Alloc(n
a430: 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50 61 72  Var*sizeof(apPar
a440: 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  m[0]));.      }e
a450: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 50  lse{.        apP
a460: 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20  arm = aParm;.   
a470: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
a480: 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
a490: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
a4a0: 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71   char *zVar = sq
a4b0: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
a4c0: 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  eter_name(pStmt,
a4d0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
a4e0: 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61   zVar!=0 && (zVa
a4f0: 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61  r[0]=='$' || zVa
a500: 72 5b 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20 20  r[0]==':') ){.  
a510: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
a520: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56  *pVar = Tcl_GetV
a530: 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a  ar2Ex(interp, &z
a540: 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20  Var[1], 0, 0);. 
a550: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 56 61           if( pVa
a560: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
a570: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
a580: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
a590: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
a5a0: 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79  zType = pVar->ty
a5b0: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
a5c0: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
a5d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
a5e0: 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b  ar c = zType[0];
a5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
a600: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
a610: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
a620: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
a630: 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20  >bytes==0 ){.   
a640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a650: 6c 79 20 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74  ly load a BLOB t
a660: 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76  ype if the Tcl v
a670: 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74  ariable is a byt
a680: 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20  earray and.     
a690: 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
a6a0: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
a6b0: 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  entation. */.   
a6c0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
a6d0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
a6e0: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
a6f0: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
a700: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
a710: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
a720: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
a730: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
a740: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
a750: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
a770: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
a780: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
a790: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62  }else if( (c=='b
a7a0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
a7b0: 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29  e,"boolean")==0)
a7c0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
a7d0: 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26        (c=='i' &&
a7e0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69   strcmp(zType,"i
a7f0: 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nt")==0) ){.    
a800: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
a810: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
a820: 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  rp, pVar, &n);. 
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
a840: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
a850: 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20  tmt, i, n);.    
a860: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
a870: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
a880: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
a890: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
a8a0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b         double r;
a8b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
a8c0: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
a8d0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
a8e0: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20  , &r);.         
a8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
a900: 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  d_double(pStmt, 
a910: 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20  i, r);.         
a920: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
a930: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
a940: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
a950: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
a960: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
a970: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a980: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
a990: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
a9a0: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
a9b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
a9c0: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
a9d0: 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20   i, v);.        
a9e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a9f0: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
aa00: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
aa10: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
aa20: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
aa30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
aa40: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
aa50: 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72  (pStmt, i, (char
aa60: 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49   *)data, n, SQLI
aa70: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
aa80: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
aa90: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
aaa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
aab0: 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20  apParm[nParm++] 
aac0: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
aad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
aae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
aaf0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
ab00: 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29  null( pStmt, i )
ab10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ab20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ab30: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  .      /* Comput
ab40: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
ab50: 2f 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73  /.      nCol = s
ab60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
ab70: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
ab80: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
ab90: 0a 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61  .        apColNa
aba0: 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29  me = (Tcl_Obj**)
abb0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
abc0: 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c  f(Tcl_Obj*)*nCol
abd0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
abe0: 61 70 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62  apColName==0 ) b
abf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f  reak;.        fo
ac00: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
ac10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
ac20: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62  pColName[i] = db
ac30: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
ac40: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
ac50: 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20  tmt,i));.       
ac60: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
ac70: 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  unt(apColName[i]
ac80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ac90: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
aca0: 66 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65  f results are be
acb0: 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e  ing stored in an
acc0: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c   array variable,
acd0: 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20   then create.   
ace0: 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28     ** the array(
acf0: 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61  *) entry for tha
ad00: 74 20 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2f  t array.      */
ad10: 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61  .      if( pArra
ad20: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
ad30: 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d  _Obj *pColList =
ad40: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
ad50: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
ad60: 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53  pStar = Tcl_NewS
ad70: 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31  tringObj("*", -1
ad80: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  );.        Tcl_I
ad90: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c  ncrRefCount(pCol
ada0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66  List);.        f
adb0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
adc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
add0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
ade0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
adf0: 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c   pColList, apCol
ae00: 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Name[i]);.      
ae10: 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f    }.        Tcl_
ae20: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
ae30: 70 2c 20 70 41 72 72 61 79 2c 20 70 53 74 61 72  p, pArray, pStar
ae40: 2c 20 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20  , pColList,0);. 
ae50: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
ae60: 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74  efCount(pColList
ae70: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  );.        Tcl_D
ae80: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61  ecrRefCount(pSta
ae90: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  r);.      }..   
aea0: 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68     /* Execute th
aeb0: 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20  e SQL.      */. 
aec0: 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
aed0: 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20  TCL_OK && pStmt 
aee0: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
aef0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
af00: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  t) ){.        fo
af10: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
af20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
af30: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20  cl_Obj *pVal;.  
af40: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
af50: 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74     /* Set pVal t
af60: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27  o contain the i'
af70: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69  th column of thi
af80: 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  s row. */.      
af90: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
afa0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
afb0: 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20  pStmt, i) ){.   
afc0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
afd0: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
afe0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62             int b
aff0: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63  ytes = sqlite3_c
b000: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
b010: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
b020: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
b030: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
b040: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
b050: 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 62  lob(pStmt, i), b
b060: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
b070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b090: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b0a0: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
b0b0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b0c0: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
b0d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
b0e0: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
b0f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
b100: 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20  =-2147483647 && 
b110: 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  v<=2147483647 ){
b120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b130: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49   pVal = Tcl_NewI
b140: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
b150: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b170: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Val = Tcl_NewWid
b180: 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  eIntObj(v);.    
b190: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b1a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b1c0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
b1d0: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f                do
b1f0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
b200: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
b210: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
b220: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
b230: 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
b240: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
b250: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b270: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
b280: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
b290: 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65       pVal = dbTe
b2a0: 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75  xtToObj(pDb->zNu
b2b0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
b2c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b2d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b2e0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
b300: 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  l = dbTextToObj(
b310: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
b320: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
b330: 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20  t, i));.        
b340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b350: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b360: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
b370: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
b380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
b390: 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a  f( pArray==0 ){.
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
b3b0: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
b3c0: 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  erp, apColName[i
b3d0: 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a  ], 0, pVal, 0);.
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
b3f0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
b400: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
b410: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
b420: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56  apColName[i], pV
b430: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
b440: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b450: 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65  }else if( choice
b460: 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
b470: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
b480: 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 29 3b  sert( pRet==0 );
b490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b4a0: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
b4b0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
b4c0: 20 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20   pVal;.         
b4d0: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
b4e0: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
b4f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b500: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
b510: 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20  BREAK;.         
b520: 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20     i = nCol;.   
b530: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b540: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53   choice==DB_EXIS
b550: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
b560: 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d    assert( pRet==
b570: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
b580: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b590: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
b5a0: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 29 3b  wBooleanObj(1));
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
b5c0: 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20  = TCL_BREAK;.   
b5d0: 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f           i = nCo
b5e0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  l;.          }el
b5f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
b600: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
b610: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
b620: 20 70 52 65 74 2c 20 70 56 61 6c 29 3b 0a 20 20   pRet, pVal);.  
b630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b640: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 69    }.  .        i
b650: 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20  f( pScript ){.  
b660: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c          rc = Tcl
b670: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
b680: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
b690: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
b6a0: 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 20 29  ==TCL_CONTINUE )
b6b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
b6c0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20   = TCL_OK;.     
b6d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
b6e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b6f0: 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  f( rc==TCL_BREAK
b700: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
b710: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d   TCL_OK;.      }
b720: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  ..      /* Free 
b730: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
b740: 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  objects */.     
b750: 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a   if( pScript ){.
b760: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
b770: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
b780: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63           Tcl_Dec
b790: 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e  rRefCount(apColN
b7a0: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ame[i]);.       
b7b0: 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46   }.        Tcl_F
b7c0: 72 65 65 28 28 63 68 61 72 2a 29 61 70 43 6f 6c  ree((char*)apCol
b7d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Name);.      }..
b7e0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68        /* Free th
b7f0: 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61  e bound string a
b800: 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65  nd blob paramete
b810: 72 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  rs */.      for(
b820: 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b 20 69 2b  i=0; i<nParm; i+
b830: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  +){.        Tcl_
b840: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 50  DecrRefCount(apP
b850: 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  arm[i]);.      }
b860: 0a 20 20 20 20 20 20 69 66 28 20 61 70 50 61 72  .      if( apPar
b870: 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20 20 20 20  m!=aParm ){.    
b880: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
b890: 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a 20 20 20  ar*)apParm);.   
b8a0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52     }..      /* R
b8b0: 65 73 65 74 20 74 68 65 20 73 74 61 74 65 6d 65  eset the stateme
b8c0: 6e 74 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  nt.  If the resu
b8d0: 6c 74 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  lt code is SQLIT
b8e0: 45 5f 53 43 48 45 4d 41 2c 20 74 68 65 6e 0a 20  E_SCHEMA, then. 
b8f0: 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68       ** flush th
b900: 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  e statement cach
b910: 65 20 61 6e 64 20 74 72 79 20 74 68 65 20 73 74  e and try the st
b920: 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 2e 0a 20  atement again.. 
b930: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
b940: 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  2 = sqlite3_rese
b950: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
b960: 69 66 28 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  if( SQLITE_SCHEM
b970: 41 3d 3d 72 63 32 20 29 7b 0a 20 20 20 20 20 20  A==rc2 ){.      
b980: 20 20 2f 2a 20 41 66 74 65 72 20 61 20 73 63 68    /* After a sch
b990: 65 6d 61 20 63 68 61 6e 67 65 2c 20 66 6c 75 73  ema change, flus
b9a0: 68 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  h the cache and 
b9b0: 74 72 79 20 74 6f 20 72 75 6e 20 74 68 65 0a 20  try to run the. 
b9c0: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
b9d0: 65 6e 74 20 61 67 61 69 6e 0a 20 20 20 20 20 20  ent again.      
b9e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c 75    */.        flu
b9f0: 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62  shStmtCache( pDb
ba00: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
ba10: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
ba20: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mt);.        if(
ba30: 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f   pPreStmt ) Tcl_
ba40: 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65  Free((char*)pPre
ba50: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 63  Stmt);.        c
ba60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
ba70: 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f  else if( SQLITE_
ba80: 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20 20 20 20  OK!=rc2 ){.     
ba90: 20 20 20 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74     /* If a run-t
baa0: 69 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ime error occurs
bab0: 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65 72 72  , report the err
bac0: 6f 72 20 61 6e 64 20 73 74 6f 70 20 72 65 61 64  or and stop read
bad0: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ing.        ** t
bae0: 68 65 20 53 51 4c 0a 20 20 20 20 20 20 20 20 2a  he SQL.        *
baf0: 2f 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  /.        Tcl_Se
bb00: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
bb10: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
bb20: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
bb30: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
bb40: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
bb50: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
bb60: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
bb70: 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  R;.        if( p
bb80: 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72  PreStmt ) Tcl_Fr
bb90: 65 65 28 28 63 68 61 72 2a 29 70 50 72 65 53 74  ee((char*)pPreSt
bba0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  mt);.        bre
bbb0: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
bbc0: 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74  if( pDb->maxStmt
bbd0: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  <=0 ){.        /
bbe0: 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
bbf0: 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65  s turned off, de
bc00: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74  allocated the st
bc10: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
bc20: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20     if( pPreStmt 
bc30: 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72  ) Tcl_Free((char
bc40: 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20  *)pPreStmt);.   
bc50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
bc60: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
bc70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc80: 20 20 20 2f 2a 20 45 76 65 72 79 74 68 69 6e 67     /* Everything
bc90: 20 77 6f 72 6b 65 64 20 61 6e 64 20 74 68 65 20   worked and the 
bca0: 63 61 63 68 65 20 69 73 20 6f 70 65 72 61 74 69  cache is operati
bcb0: 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a  onal..        **
bcc0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 71   Create a new Sq
bcd0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 73 74  lPreparedStmt st
bce0: 72 75 63 74 75 72 65 20 69 66 20 77 65 20 6e 65  ructure if we ne
bcf0: 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20 20 20 20  ed one..        
bd00: 2a 2a 20 28 49 66 20 77 65 20 61 6c 72 65 61 64  ** (If we alread
bd10: 79 20 68 61 76 65 20 6f 6e 65 20 77 65 20 63 61  y have one we ca
bd20: 6e 20 6a 75 73 74 20 72 65 75 73 65 20 69 74 2e  n just reuse it.
bd30: 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ).        */.   
bd40: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
bd50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
bd60: 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74 20 2d 20    len = zLeft - 
bd70: 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  zSql;.          
bd80: 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c 50  pPreStmt = (SqlP
bd90: 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63 6c  reparedStmt*)Tcl
bda0: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
bdb0: 70 50 72 65 53 74 6d 74 29 20 2b 20 6c 65 6e 20  pPreStmt) + len 
bdc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
bdd0: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 20 72   pPreStmt==0 ) r
bde0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bdf0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
be00: 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74  tmt->pStmt = pSt
be10: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  mt;.          pP
be20: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c  reStmt->nSql = l
be30: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  en;.          me
be40: 6d 63 70 79 28 70 50 72 65 53 74 6d 74 2d 3e 7a  mcpy(pPreStmt->z
be50: 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e 29 3b  Sql, zSql, len);
be60: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
be70: 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65 6e 5d 20 3d  tmt->zSql[len] =
be80: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
be90: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
bea0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
beb0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69  ment to the begi
bec0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63  nning of the cac
bed0: 68 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20  he list.        
bee0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  */.        pPreS
bef0: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  tmt->pNext = pDb
bf00: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
bf10: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50      pPreStmt->pP
bf20: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
bf30: 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69   if( pDb->stmtLi
bf40: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70  st ){.         p
bf50: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50  Db->stmtList->pP
bf60: 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  rev = pPreStmt;.
bf70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bf80: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
bf90: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20  = pPreStmt;.    
bfa0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
bfb0: 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tLast==0 ){.    
bfc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
bfd0: 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  b->nStmt==0 );. 
bfe0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
bff0: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
c000: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
c010: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
c020: 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30  rt( pDb->nStmt>0
c030: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
c040: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
c050: 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20 20 20 20  ++;.   .        
c060: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 74 6f  /* If we have to
c070: 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74  o many statement
c080: 20 69 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76   in cache, remov
c090: 65 20 74 68 65 20 73 75 72 70 6c 75 73 20 66 72  e the surplus fr
c0a0: 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  om the.        *
c0b0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  * end of the cac
c0c0: 68 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  he list..       
c0d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
c0e0: 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44  e( pDb->nStmt>pD
c0f0: 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20  b->maxStmt ){.  
c100: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c110: 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73 74  finalize(pDb->st
c120: 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  mtLast->pStmt);.
c130: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
c140: 74 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73  tmtLast = pDb->s
c150: 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a  tmtLast->pPrev;.
c160: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72            Tcl_Fr
c170: 65 65 28 28 63 68 61 72 2a 29 70 44 62 2d 3e 73  ee((char*)pDb->s
c180: 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b  tmtLast->pNext);
c190: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
c1a0: 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20  stmtLast->pNext 
c1b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
c1c0: 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20  Db->nStmt--;.   
c1d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
c1e0: 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 65 64        /* Proceed
c1f0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61   to the next sta
c200: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
c210: 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  zSql = zLeft;.  
c220: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
c230: 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d  RefCount(objv[2]
c240: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65 74  );..    if( pRet
c250: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
c260: 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
c270: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
c280: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
c290: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
c2a0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c2b0: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a  nt(pRet);.    }.
c2c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
c2d0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
c2e0: 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20  b function NAME 
c2f0: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
c300: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
c310: 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  L function calle
c320: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
c330: 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  r that function 
c340: 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20  is.  ** called, 
c350: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
c360: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
c370: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
c380: 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a  ase DB_FUNCTION:
c390: 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a   {.    SqlFunc *
c3a0: 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f  pFunc;.    Tcl_O
c3b0: 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20  bj *pScript;.   
c3c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
c3d0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
c3e0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
c3f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
c400: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
c410: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
c420: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c430: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
c440: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
c450: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
c460: 20 30 29 3b 0a 20 20 20 20 70 53 63 72 69 70 74   0);.    pScript
c470: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
c480: 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46  pFunc = findSqlF
c490: 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b  unc(pDb, zName);
c4a0: 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d  .    if( pFunc==
c4b0: 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
c4c0: 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46  RROR;.    if( pF
c4d0: 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a  unc->pScript ){.
c4e0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
c4f0: 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53  fCount(pFunc->pS
c500: 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20  cript);.    }.  
c510: 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74    pFunc->pScript
c520: 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20   = pScript;.    
c530: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
c540: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  (pScript);.    p
c550: 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a  Func->useEvalObj
c560: 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61  v = safeToUseEva
c570: 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53  lObjv(interp, pS
c580: 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d  cript);.    rc =
c590: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c5a0: 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62  function(pDb->db
c5b0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
c5c0: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
c5d0: 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46    pFunc, tclSqlF
c5e0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
c5f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c600: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
c610: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
c620: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
c630: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
c640: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
c650: 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41  b->db), TCL_VOLA
c660: 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65  TILE);.    }else
c670: 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20  {.      /* Must 
c680: 66 6c 75 73 68 20 61 6e 79 20 63 61 63 68 65 64  flush any cached
c690: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
c6a0: 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61       flushStmtCa
c6b0: 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20  che( pDb );.    
c6c0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
c6d0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
c6e0: 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53  $db nullvalue ?S
c6f0: 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  TRING?.  **.  **
c700: 20 43 68 61 6e 67 65 20 74 65 78 74 20 75 73 65   Change text use
c710: 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f  d when a NULL co
c720: 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  mes back from th
c730: 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f  e database. If ?
c740: 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20  STRING?.  ** is 
c750: 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
c760: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
c770: 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55  ring used for NU
c780: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
c790: 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69    ** If STRING i
c7a0: 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
c7b0: 53 54 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e  STRING is return
c7c0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20  ed..  **.  */.  
c7d0: 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55  case DB_NULLVALU
c7e0: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
c7f0: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
c800: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
c810: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
c820: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c  , 2, objv, "NULL
c830: 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72  VALUE");.      r
c840: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c850: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
c860: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
c870: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63  int len;.      c
c880: 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c  har *zNull = Tcl
c890: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
c8a0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
c8b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
c8c0: 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >zNull ){.      
c8d0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
c8e0: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zNull);.      }.
c8f0: 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20        if( zNull 
c900: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
c910: 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d      pDb->zNull =
c920: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
c930: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
c940: 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c  trncpy(pDb->zNul
c950: 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a  l, zNull, len);.
c960: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
c970: 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  ll[len] = '\0';.
c980: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c990: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20       pDb->zNull 
c9a0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
c9b0: 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   }.    Tcl_SetOb
c9c0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c9d0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d  dbTextToObj(pDb-
c9e0: 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72  >zNull));.    br
c9f0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
ca00: 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74   **     $db last
ca10: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20  _insert_rowid . 
ca20: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
ca30: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
ca40: 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f   is the ROWID fo
ca50: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
ca60: 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20  t insert..  */. 
ca70: 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e   case DB_LAST_IN
ca80: 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20  SERT_ROWID: {.  
ca90: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
caa0: 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77 69  lt;.    int rowi
cab0: 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  d;.    if( objc!
cac0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
cad0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cae0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
caf0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cb00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cb10: 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c  .    rowid = sql
cb20: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
cb30: 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b  _rowid(pDb->db);
cb40: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
cb50: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
cb60: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
cb70: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
cb80: 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20  lt, rowid);.    
cb90: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
cba0: 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45  .  ** The DB_ONE
cbb0: 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73  COLUMN method is
cbc0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67   implemented tog
cbd0: 65 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 56  ether with DB_EV
cbe0: 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20  AL..  */..  /*  
cbf0: 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f    $db progress ?
cc00: 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a  N CALLBACK?.  **
cc10: 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68   .  ** Invoke th
cc20: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
cc30: 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
cc40: 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
cc50: 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
cc60: 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
cc70: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
cc80: 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
cc90: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
cca0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
ccb0: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
ccc0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ccd0: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
cce0: 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20  Progress, 0);.  
ccf0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
cd00: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
cd10: 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67       char *zProg
cd20: 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  ress;.      int 
cd30: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e  len;.      int N
cd40: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f  ;.      if( TCL_
cd50: 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
cd60: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
cd70: 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 09 72  jv[2], &N) ){..r
cd80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cd90: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
cda0: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
cdb0: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
cdc0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
cdd0: 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a  gress);.      }.
cde0: 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20        zProgress 
cdf0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
ce00: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
ce10: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
ce20: 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65   zProgress && le
ce30: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
ce40: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20  Db->zProgress = 
ce50: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
ce60: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74   1 );.        st
ce70: 72 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72  rcpy(pDb->zProgr
ce80: 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 29 3b  ess, zProgress);
ce90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cea0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67        pDb->zProg
ceb0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  ress = 0;.      
cec0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
ced0: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
cee0: 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66  ALLBACK.      if
cef0: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
cf00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
cf10: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
cf20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cf30: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
cf40: 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44  er(pDb->db, N, D
cf50: 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72  bProgressHandler
cf60: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
cf70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
cf80: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
cf90: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30  ndler(pDb->db, 0
cfa0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
cfb0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
cfc0: 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
cfd0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
cfe0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41  , 2, objv, "N CA
cff0: 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20  LLBACK");.      
d000: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
d020: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
d030: 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c  $db profile ?CAL
d040: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
d050: 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
d060: 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
d070: 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
d080: 65 20 61 66 74 65 72 20 65 61 63 68 20 53 51 4c  e after each SQL
d090: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
d0a0: 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54  that has run.  T
d0b0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53  he text of the S
d0c0: 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e  QL and the amoun
d0d0: 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65  t of elapse time
d0e0: 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64   are.  ** append
d0f0: 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62  ed to CALLBACK b
d100: 65 66 6f 72 65 20 74 68 65 20 73 63 72 69 70 74  efore the script
d110: 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20   is run..  */.  
d120: 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a  case DB_PROFILE:
d130: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
d140: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
d150: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
d160: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
d170: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
d180: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d190: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
d1a0: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
d1b0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
d1c0: 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
d1d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d1e0: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  (interp, pDb->zP
d1f0: 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  rofile, 0);.    
d200: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
d210: 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66       char *zProf
d220: 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ile;.      int l
d230: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
d240: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
d250: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
d260: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a  pDb->zProfile);.
d270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50        }.      zP
d280: 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  rofile = Tcl_Get
d290: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
d2a0: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
d2b0: 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65      if( zProfile
d2c0: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
d2d0: 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69       pDb->zProfi
d2e0: 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  le = Tcl_Alloc( 
d2f0: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
d300: 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a     strcpy(pDb->z
d310: 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c  Profile, zProfil
d320: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
d330: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
d340: 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  rofile = 0;.    
d350: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
d360: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
d370: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
d380: 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
d390: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
d3a0: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
d3b0: 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70  qlite3_profile(p
d3c0: 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c  Db->db, DbProfil
d3d0: 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  eHandler, pDb);.
d3e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
d400: 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  file(pDb->db, 0,
d410: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
d420: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
d430: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
d440: 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65   **     $db reke
d450: 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y KEY.  **.  ** 
d460: 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79  Change the encry
d470: 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65  ption key on the
d480: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
d490: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
d4a0: 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20   case DB_REKEY: 
d4b0: 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  {.    int nKey;.
d4c0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
d4d0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
d4e0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
d4f0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
d500: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22  , 2, objv, "KEY"
d510: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d520: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
d530: 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f  .    pKey = Tcl_
d540: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
d550: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b  Obj(objv[2], &nK
d560: 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ey);.#ifdef SQLI
d570: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
d580: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
d590: 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65  key(pDb->db, pKe
d5a0: 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66  y, nKey);.    if
d5b0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
d5c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d5d0: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
d5e0: 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20  rStr(rc), 0);.  
d5f0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
d600: 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OR;.    }.#endif
d610: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
d620: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
d630: 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45  db timeout MILLE
d640: 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a  SECONDS.  **.  *
d650: 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20  * Delay for the 
d660: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d670: 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64  econds specified
d680: 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20   when a file is 
d690: 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  locked..  */.  c
d6a0: 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20  ase DB_TIMEOUT: 
d6b0: 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20  {.    int ms;.  
d6c0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
d6d0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
d6e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
d6f0: 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53  2, objv, "MILLIS
d700: 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20  ECONDS");.      
d710: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d720: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d730: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
d740: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
d750: 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
d760: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d770: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
d780: 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73  eout(pDb->db, ms
d790: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
d7a0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
d7b0: 20 24 64 62 20 73 6f 66 74 5f 68 65 61 70 5f 6c   $db soft_heap_l
d7c0: 69 6d 69 74 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  imit N.  **.  **
d7d0: 20 53 65 74 20 74 68 65 20 73 6f 66 74 2d 68 65   Set the soft-he
d7e0: 61 70 2d 6c 69 6d 69 74 20 66 6f 72 20 74 68 69  ap-limit for thi
d7f0: 73 20 74 68 72 65 61 64 2e 20 4e 6f 74 65 20 74  s thread. Note t
d800: 68 61 74 20 74 68 65 20 6c 69 6d 69 74 20 69 73  hat the limit is
d810: 20 0a 20 20 2a 2a 20 70 65 72 2d 74 68 72 65 61   .  ** per-threa
d820: 64 2c 20 6e 6f 74 20 70 65 72 2d 64 61 74 61 62  d, not per-datab
d830: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
d840: 20 44 42 5f 53 4f 46 54 5f 48 45 41 50 5f 4c 49   DB_SOFT_HEAP_LI
d850: 4d 49 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e  MIT: {.    int n
d860: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
d870: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
d880: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
d890: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 59  rp, 2, objv, "BY
d8a0: 54 45 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74  TES");.      ret
d8b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d8c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
d8d0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
d8e0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
d8f0: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  &n) ){.      ret
d900: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d910: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d920: 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
d930: 28 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73  (n);.    Tcl_Res
d940: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
d950: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
d960: 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
d970: 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e    $db total_chan
d980: 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
d990: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
d9a0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
d9b0: 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
d9c0: 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
d9d0: 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
d9e0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
d9f0: 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20   was created..  
da00: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54  */.  case DB_TOT
da10: 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  AL_CHANGES: {.  
da20: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
da30: 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
da40: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
da50: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
da60: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
da70: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
da80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
da90: 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
daa0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
dab0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
dac0: 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
dad0: 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74  ult, sqlite3_tot
dae0: 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  al_changes(pDb->
daf0: 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
db00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
db10: 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43  b trace ?CALLBAC
db20: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
db30: 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
db40: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
db50: 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f  LBACK routine fo
db60: 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
db70: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69  ment.  ** that i
db80: 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
db90: 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
dba0: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
dbb0: 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a  CALLBACK before.
dbc0: 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75    ** it is execu
dbd0: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
dbe0: 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20   DB_TRACE: {.   
dbf0: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
dc00: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
dc10: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
dc20: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
dc30: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
dc40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dc50: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
dc60: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
dc70: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
dc80: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
dc90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dca0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29   pDb->zTrace, 0)
dcb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
dcc0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
dcd0: 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69  *zTrace;.      i
dce0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
dcf0: 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
dd00: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
dd10: 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a  e(pDb->zTrace);.
dd20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
dd30: 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  race = Tcl_GetSt
dd40: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
dd50: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
dd60: 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20    if( zTrace && 
dd70: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
dd80: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54   pDb->zTrace = T
dd90: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
dda0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
ddb0: 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c  cpy(pDb->zTrace,
ddc0: 20 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20   zTrace);.      
ddd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
dde0: 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a  Db->zTrace = 0;.
ddf0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
de00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
de10: 45 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  E.      if( pDb-
de20: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
de30: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
de40: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
de50: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70   sqlite3_trace(p
de60: 44 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65 48  Db->db, DbTraceH
de70: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
de80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
de90: 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
dea0: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
deb0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
dec0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
ded0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
dee0: 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d  b transaction [-
def0: 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69  deferred|-immedi
df00: 61 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20  ate|-exclusive] 
df10: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
df20: 20 53 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   Start a new tra
df30: 6e 73 61 63 74 69 6f 6e 20 28 69 66 20 77 65 20  nsaction (if we 
df40: 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
df50: 69 6e 20 74 68 65 20 6d 69 64 73 74 20 6f 66 20  in the midst of 
df60: 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  a.  ** transacti
df70: 6f 6e 29 20 61 6e 64 20 65 78 65 63 75 74 65 20  on) and execute 
df80: 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 53  the TCL script S
df90: 43 52 49 50 54 2e 20 20 41 66 74 65 72 20 53 43  CRIPT.  After SC
dfa0: 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  RIPT.  ** comple
dfb0: 74 65 73 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d  tes, either comm
dfc0: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
dfd0: 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61  on or roll it ba
dfe0: 63 6b 20 69 66 20 53 43 52 49 50 54 0a 20 20 2a  ck if SCRIPT.  *
dff0: 2a 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  * throws an exce
e000: 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f  ption.  Or if no
e010: 20 6e 65 77 20 74 72 61 6e 73 61 74 69 6f 6e 20   new transation 
e020: 77 61 73 20 73 74 61 72 74 65 64 2c 20 64 6f 20  was started, do 
e030: 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61  nothing..  ** pa
e040: 73 73 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  ss the exception
e050: 20 6f 6e 20 75 70 20 74 68 65 20 73 74 61 63 6b   on up the stack
e060: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
e070: 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73   command was ins
e080: 70 69 72 65 64 20 62 79 20 44 61 76 65 20 54 68  pired by Dave Th
e090: 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52  omas's talk on R
e0a0: 75 62 79 20 61 74 20 74 68 65 0a 20 20 2a 2a 20  uby at the.  ** 
e0b0: 32 30 30 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70  2005 O'Reilly Op
e0c0: 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e  en Source Conven
e0d0: 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20  tion (OSCON)..  
e0e0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41  */.  case DB_TRA
e0f0: 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  NSACTION: {.    
e100: 69 6e 74 20 69 6e 54 72 61 6e 73 3b 0a 20 20 20  int inTrans;.   
e110: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
e120: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
e130: 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22 42 45 47  r *zBegin = "BEG
e140: 49 4e 22 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  IN";.    if( obj
e150: 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=3 && objc!=4 
e160: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
e170: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
e180: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50  , 2, objv, "[TYP
e190: 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20  E] SCRIPT");.   
e1a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e1b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
e1c0: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
e1d0: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
e1e0: 6a 76 5b 32 5d 3b 0a 20 20 20 20 7d 20 65 6c 73  jv[2];.    } els
e1f0: 65 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  e {.      static
e200: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59   const char *TTY
e210: 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  PE_strs[] = {.  
e220: 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64 22        "deferred"
e230: 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c  ,   "exclusive",
e240: 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30    "immediate", 0
e250: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
e260: 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20  enum TTYPE_enum 
e270: 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45 5f  {.        TTYPE_
e280: 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f  DEFERRED, TTYPE_
e290: 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45  EXCLUSIVE, TTYPE
e2a0: 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20  _IMMEDIATE.     
e2b0: 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74   };.      int tt
e2c0: 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ype;.      if( T
e2d0: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
e2e0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
e2f0: 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20  2], TTYPE_strs, 
e300: 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70  "transaction typ
e310: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a    0, &ttype) ){.
e340: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
e350: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
e360: 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  }.      switch( 
e370: 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d  (enum TTYPE_enum
e380: 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  )ttype ){.      
e390: 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45 46    case TTYPE_DEF
e3a0: 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d  ERRED:    /* no-
e3b0: 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20  op */;          
e3c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e3d0: 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
e3e0: 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42  _EXCLUSIVE:   zB
e3f0: 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58  egin = "BEGIN EX
e400: 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b  CLUSIVE";  break
e410: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
e420: 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20  TYPE_IMMEDIATE: 
e430: 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
e440: 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62  N IMMEDIATE";  b
e450: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e460: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
e470: 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  jv[3];.    }.   
e480: 20 69 6e 54 72 61 6e 73 20 3d 20 21 73 71 6c 69   inTrans = !sqli
e490: 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
e4a0: 69 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  it(pDb->db);.   
e4b0: 20 69 66 28 20 21 69 6e 54 72 61 6e 73 20 29 7b   if( !inTrans ){
e4c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
e4d0: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65  xec(pDb->db, zBe
e4e0: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  gin, 0, 0, 0);. 
e4f0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63     }.    rc = Tc
e500: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
e510: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
e520: 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e  .    if( !inTran
e530: 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  s ){.      const
e540: 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 20   char *zEnd;.   
e550: 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 45     if( rc==TCL_E
e560: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20  RROR ){.        
e570: 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  zEnd = "ROLLBACK
e580: 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ";.      } else 
e590: 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d  {.        zEnd =
e5a0: 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 20   "COMMIT";.     
e5b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
e5c0: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
e5d0: 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  End, 0, 0, 0);. 
e5e0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
e5f0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
e600: 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f    $db update_hoo
e610: 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20  k ?script?.  ** 
e620: 20 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f     $db rollback_
e630: 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
e640: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44  */.  case DB_UPD
e650: 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73  ATE_HOOK: .  cas
e660: 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f  e DB_ROLLBACK_HO
e670: 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65  OK: {..    /* se
e680: 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e  t ppHook to poin
e690: 74 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b  t at pUpdateHook
e6a0: 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f   or pRollbackHoo
e6b0: 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  k, depending on 
e6c0: 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20  .    ** whether 
e6d0: 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b  [$db update_hook
e6e0: 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61  ] or [$db rollba
e6f0: 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76  ck_hook] was inv
e700: 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oked..    */.   
e710: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f   Tcl_Obj **ppHoo
e720: 6b 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69  k; .    if( choi
e730: 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f  ce==DB_UPDATE_HO
e740: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f  OK ){.      ppHo
e750: 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61  ok = &pDb->pUpda
e760: 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73  teHook;.    }els
e770: 65 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20  e{.      ppHook 
e780: 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  = &pDb->pRollbac
e790: 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  kHook;.    }..  
e7a0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
e7b0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
e7c0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
e7d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
e7e0: 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
e7f0: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
e800: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e810: 0a 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b  .    if( *ppHook
e820: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
e830: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
e840: 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  p, *ppHook);.   
e850: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
e860: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  {.        Tcl_De
e870: 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f  crRefCount(*ppHo
e880: 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  ok);.        *pp
e890: 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hook = 0;.      
e8a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e8b0: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
e8c0: 20 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f   assert( !(*ppHo
e8d0: 6f 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ok) );.      if(
e8e0: 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67   Tcl_GetCharLeng
e8f0: 74 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b  th(objv[2])>0 ){
e900: 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b  .        *ppHook
e910: 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20   = objv[2];.    
e920: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
e930: 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20  ount(*ppHook);. 
e940: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e950: 20 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65    sqlite3_update
e960: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28  _hook(pDb->db, (
e970: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
e980: 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72  ?DbUpdateHandler
e990: 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20 73  :0), pDb);.    s
e9a0: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
e9b0: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44  hook(pDb->db,(pD
e9c0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
e9d0: 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c  ?DbRollbackHandl
e9e0: 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20  er:0),pDb);..   
e9f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
ea00: 2a 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e  *    $db version
ea10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
ea20: 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74  n the version st
ea30: 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61  ring for this da
ea40: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
ea50: 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20  ase DB_VERSION: 
ea60: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
ea70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
ea80: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76  r *)sqlite3_libv
ea90: 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54  ersion(), TCL_ST
eaa0: 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b  ATIC);.    break
eab0: 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45  ;.  }...  } /* E
eac0: 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48  nd of the SWITCH
ead0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
eae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
eaf0: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42  .**   sqlite3 DB
eb00: 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d  NAME FILENAME ?M
eb10: 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a  ODE? ?-key KEY?.
eb20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
eb30: 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61  e main Tcl comma
eb40: 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73  nd.  When the "s
eb50: 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61  qlite" Tcl comma
eb60: 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  nd is.** invoked
eb70: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
eb80: 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74  uns to process t
eb90: 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  hat command..**.
eba0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
ebb0: 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69  ument, DBNAME, i
ebc0: 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e  s an arbitrary n
ebd0: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a  ame for a new.**
ebe0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
ebf0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d  tion.  This comm
ec00: 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65  and creates a ne
ec10: 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a  w command named.
ec20: 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69  ** DBNAME that i
ec30: 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  s used to contro
ec40: 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  l that connectio
ec50: 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  n.  The database
ec60: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
ec70: 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  s deleted when t
ec80: 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e  he DBNAME comman
ec90: 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  d is deleted..**
eca0: 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
ecb0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
ecc0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
ecd0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
ece0: 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  ns.** the sqlite
ecf0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
ed00: 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
ed10: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74  ..**.** For test
ed20: 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65  ing purposes, we
ed30: 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74 68   also support th
ed40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
ed50: 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 65 6e 63  **  sqlite3 -enc
ed60: 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20  oding.**.**     
ed70: 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e 63    Return the enc
ed80: 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c 49  oding used by LI
ed90: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72  KE and GLOB oper
eda0: 61 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73 0a  ators.  Choices.
edb0: 2a 2a 20 20 20 20 20 20 20 61 72 65 20 55 54 46  **       are UTF
edc0: 2d 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e 0a  -8 and iso8859..
edd0: 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d  **.**  sqlite3 -
ede0: 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  version.**.**   
edf0: 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 76      Return the v
ee00: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66  ersion number of
ee10: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
ee20: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  ary..**.**  sqli
ee30: 74 65 33 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74  te3 -tcl-uses-ut
ee40: 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65  f.**.**       Re
ee50: 74 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d 70  turn "1" if comp
ee60: 69 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c 20  iled with a Tcl 
ee70: 75 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65 74  uses UTF-8.  Ret
ee80: 75 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20 20  urn "0" if.**   
ee90: 20 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20 62      not.  Used b
eea0: 79 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65 20  y tests to make 
eeb0: 73 75 72 65 20 74 68 65 20 6c 69 62 72 61 72 79  sure the library
eec0: 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a   was compiled .*
eed0: 2a 20 20 20 20 20 20 20 63 6f 72 72 65 63 74 6c  *       correctl
eee0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
eef0: 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64   DbMain(void *cd
ef00: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
ef10: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54  terp, int objc,T
ef20: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
ef30: 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  jv){.  SqliteDb 
ef40: 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79  *p;.  void *pKey
ef50: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79   = 0;.  int nKey
ef60: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
ef70: 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72  ar *zArg;.  char
ef80: 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e   *zErrMsg;.  con
ef90: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
efa0: 20 20 63 68 61 72 20 7a 42 75 66 5b 38 30 5d 3b    char zBuf[80];
efb0: 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
efc0: 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
efd0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
efe0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
eff0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
f000: 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  rg,"-version")==
f010: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
f020: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f030: 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rp,sqlite3_versi
f040: 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74  on,0);.      ret
f050: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
f060: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
f070: 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65  (zArg,"-has-code
f080: 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  c")==0 ){.#ifdef
f090: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
f0a0: 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  C.      Tcl_Appe
f0b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f0c0: 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20  "1",0);.#else.  
f0d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f0e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c  sult(interp,"0",
f0f0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
f100: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f110: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
f120: 72 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d  rcmp(zArg,"-tcl-
f130: 75 73 65 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b  uses-utf")==0 ){
f140: 0a 23 69 66 64 65 66 20 54 43 4c 5f 55 54 46 5f  .#ifdef TCL_UTF_
f150: 4d 41 58 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  MAX.      Tcl_Ap
f160: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f170: 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a  p,"1",0);.#else.
f180: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
f190: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30  Result(interp,"0
f1a0: 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ",0);.#endif.   
f1b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
f1c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f1d0: 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a  ( objc==5 || obj
f1e0: 63 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==6 ){.    zArg
f1f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f200: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a  FromObj(objv[obj
f210: 63 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  c-2], 0);.    if
f220: 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
f230: 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  key")==0 ){.    
f240: 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
f250: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
f260: 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26  (objv[objc-1], &
f270: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a  nKey);.      obj
f280: 63 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  c -= 2;.    }.  
f290: 7d 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  }.  if( objc!=3 
f2a0: 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
f2b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f2c0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
f2d0: 6a 76 2c 20 0a 23 69 66 64 65 66 20 53 51 4c 49  jv, .#ifdef SQLI
f2e0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
f2f0: 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e     "HANDLE FILEN
f300: 41 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d  AME ?-key CODEC-
f310: 4b 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20  KEY?".#else.    
f320: 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
f330: 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69  ME ?MODE?".#endi
f340: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74  f.    );.    ret
f350: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f360: 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30   }.  zErrMsg = 0
f370: 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44  ;.  p = (SqliteD
f380: 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  b*)Tcl_Alloc( si
f390: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
f3a0: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  ( p==0 ){.    Tc
f3b0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f3c0: 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  rp, "malloc fail
f3d0: 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ed", TCL_STATIC)
f3e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f3f0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65  _ERROR;.  }.  me
f400: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
f410: 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20  f(*p));.  zFile 
f420: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f430: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
f440: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  0);.  sqlite3_op
f450: 65 6e 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62  en(zFile, &p->db
f460: 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
f470: 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
f480: 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20  ode(p->db) ){.  
f490: 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 74 72 64    zErrMsg = strd
f4a0: 75 70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  up(sqlite3_errms
f4b0: 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73  g(p->db));.    s
f4c0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
f4d0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
f4e0: 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53   0;.  }.#ifdef S
f4f0: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
f500: 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d    sqlite3_key(p-
f510: 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  >db, pKey, nKey)
f520: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
f530: 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ->db==0 ){.    T
f540: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
f550: 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43  erp, zErrMsg, TC
f560: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
f570: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
f580: 29 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 45  )p);.    free(zE
f590: 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75  rrMsg);.    retu
f5a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f5b0: 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d  }.  p->maxStmt =
f5c0: 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54   NUM_PREPARED_ST
f5d0: 4d 54 53 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63  MTS;.  zArg = Tc
f5e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f5f0: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
f600: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
f610: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
f620: 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28  Arg, DbObjCmd, (
f630: 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
f640: 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eCmd);..  /* The
f650: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
f660: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
f670: 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65  e sqlite* pointe
f680: 72 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e 74 66  r.  */.  sprintf
f690: 28 7a 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e  (zBuf, "%p", p->
f6a0: 64 62 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63  db);.  if( strnc
f6b0: 6d 70 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20  mp(zBuf,"0x",2) 
f6c0: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
f6d0: 42 75 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e  Buf, "0x%p", p->
f6e0: 64 62 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  db);.  }.  Tcl_A
f6f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f700: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 0a 20  rp, zBuf, 0);.. 
f710: 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20   /* If compiled 
f720: 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
f730: 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 6e   turned on, then
f740: 20 72 65 67 69 73 74 65 72 20 74 68 65 20 22 6d   register the "m
f750: 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c 20  d5sum".  ** SQL 
f760: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  function..  */.#
f770: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
f780: 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  T.  {.    extern
f790: 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74   void Md5_Regist
f7a0: 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 69  er(sqlite3*);.#i
f7b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44  fdef SQLITE_MEMD
f7c0: 45 42 55 47 0a 20 20 20 20 69 6e 74 20 6d 61 6c  EBUG.    int mal
f7d0: 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c 69 74 65  locfail = sqlite
f7e0: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 0a 20  3_iMallocFail;. 
f7f0: 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c     sqlite3_iMall
f800: 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64  ocFail = 0;.#end
f810: 69 66 0a 20 20 20 20 4d 64 35 5f 52 65 67 69 73  if.    Md5_Regis
f820: 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23 69 66 64  ter(p->db);.#ifd
f830: 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
f840: 55 47 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  UG.    sqlite3_i
f850: 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6d 61 6c  MallocFail = mal
f860: 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64 69 66 0a  locfail;.#endif.
f870: 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a 20 20 70    }.#endif  .  p
f880: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
f890: 70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  p;.  return TCL_
f8a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
f8b0: 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
f8c0: 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
f8d0: 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
f8e0: 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
f8f0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
f900: 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
f910: 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
f920: 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
f930: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
f940: 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
f950: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
f960: 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
f970: 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
f980: 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
f990: 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
f9a0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
f9b0: 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
f9c0: 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
f9d0: 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
f9e0: 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
f9f0: 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
fa00: 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
fa10: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
fa20: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
fa30: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
fa40: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
fa50: 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
fa60: 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
fa70: 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
fa80: 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
fa90: 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
faa0: 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
fab0: 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
fac0: 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
fad0: 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
fae0: 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
faf0: 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
fb00: 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
fb10: 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
fb20: 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
fb30: 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
fb40: 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
fb50: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
fb60: 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
fb70: 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
fb80: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
fb90: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45  nformation..*/.E
fba0: 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
fbb0: 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
fbc0: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63  p *interp){.  Tc
fbd0: 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
fbe0: 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20  rp, "8.4", 0);. 
fbf0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
fc00: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
fc10: 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62  qlite3", (Tcl_Ob
fc20: 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
fc30: 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50  , 0, 0);.  Tcl_P
fc40: 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
fc50: 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43  , "sqlite3", PAC
fc60: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
fc70: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
fc80: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
fc90: 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a  qlite", (Tcl_Obj
fca0: 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
fcb0: 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
fcc0: 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
fcd0: 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43 4b 41   "sqlite", PACKA
fce0: 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72  GE_VERSION);.  r
fcf0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
fd00: 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
fd10: 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
fd20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
fd30: 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
fd40: 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
fd50: 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
fd60: 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
fd70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
fd80: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
fd90: 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
fda0: 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
fdb0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
fdc0: 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
fdd0: 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK; }..#ifndef S
fde0: 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
fdf0: 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  NLY.EXTERN int S
fe00: 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
fe10: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
fe20: 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
fe30: 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
fe40: 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
fe50: 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ite_Init(Tcl_Int
fe60: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
fe70: 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
fe80: 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54  t(interp); }.EXT
fe90: 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53  ERN int Sqlite_S
fea0: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
feb0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
fec0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
fed0: 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
fee0: 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
fef0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
ff00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
ff10: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
ff20: 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
ff30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff70: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  *****.** The cod
ff80: 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  e that follows i
ff90: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
ffa0: 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69  standalone TCL i
ffb0: 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2f 0a 0a  nterpreters.*/..
ffc0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63  /*.** If the mac
ffd0: 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c  ro TCLSH is one,
ffe0: 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64   then put in cod
fff0: 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a  e this for the.*
10000 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65  * "main" routine
10010 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69   that will initi
10020 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61  alize Tcl and ta
10030 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a  ke input from.**
10040 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e   standard input.
10050 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31  .*/.#if TCLSH==1
10060 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
10070 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65  inloop[] =.  "se
10080 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22  t line {}\n".  "
10090 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64  while {![eof std
100a0 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69  in]} {\n".    "i
100b0 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20  f {$line!=\"\"} 
100c0 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73  {\n".      "puts
100d0 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20   -nonewline \"> 
100e0 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73  \"\n".    "} els
100f0 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75  e {\n".      "pu
10100 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
10110 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e  % \"\n".    "}\n
10120 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74 64  ".    "flush std
10130 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65  out\n".    "appe
10140 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74  nd line [gets st
10150 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20  din]\n".    "if 
10160 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20  {[info complete 
10170 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20  $line]} {\n".   
10180 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b     "if {[catch {
10190 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65  uplevel #0 $line
101a0 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a  } result]} {\n".
101b0 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74          "puts st
101c0 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72  derr \"Error: $r
101d0 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20  esult\"\n".     
101e0 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73   "} elseif {$res
101f0 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ult!=\"\"} {\n".
10200 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72          "puts $r
10210 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22  esult\n".      "
10220 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20  }\n".      "set 
10230 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22  line {}\n".    "
10240 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
10250 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c    "append line \
10260 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  \n\n".    "}\n".
10270 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66    "}\n".;.#endif
10280 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ../*.** If the m
10290 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 74 77  acro TCLSH is tw
102a0 6f 2c 20 74 68 65 6e 20 67 65 74 20 74 68 65 20  o, then get the 
102b0 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f  main loop code o
102c0 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70  ut of.** the sep
102d0 61 72 61 74 65 20 66 69 6c 65 20 22 73 70 61 63  arate file "spac
102e0 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f  eanal_tcl.h"..*/
102f0 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74  .#if TCLSH==2.st
10300 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
10310 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64  oop[] = .#includ
10320 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c  e "spaceanal_tcl
10330 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64  .h".;.#endif..#d
10340 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e  efine TCLSH_MAIN
10350 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65   main   /* Neede
10360 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b  d to fake out mk
10370 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43  tclapp */.int TC
10380 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67  LSH_MAIN(int arg
10390 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
103a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
103b0 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e  nterp;.  Tcl_Fin
103c0 64 45 78 65 63 75 74 61 62 6c 65 28 61 72 67 76  dExecutable(argv
103d0 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d  [0]);.  interp =
103e0 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72   Tcl_CreateInter
103f0 70 28 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49  p();.  Sqlite3_I
10400 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66  nit(interp);.#if
10410 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
10420 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69    {.    extern i
10430 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49  nt Sqlitetest1_I
10440 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10450 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10460 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
10470 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10480 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10490 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
104a0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
104b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
104c0 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63  itetest4_Init(Tc
104d0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
104e0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
104f0 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f  etest5_Init(Tcl_
10500 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
10510 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
10520 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est6_Init(Tcl_In
10530 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
10540 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
10550 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f  tasync_Init(Tcl_
10560 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
10570 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69  tern int Md5_Ini
10580 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10590 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
105a0 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69  qlitetestsse_Ini
105b0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
105c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31  .    Sqlitetest1
105d0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
105e0 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49     Sqlitetest2_I
105f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
10600 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
10610 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
10620 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
10630 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
10640 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e  itetest5_Init(in
10650 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
10660 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65  etest6_Init(inte
10670 72 70 29 3b 0a 20 20 20 20 2f 2a 20 53 71 6c 69  rp);.    /* Sqli
10680 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74  tetestasync_Init
10690 28 69 6e 74 65 72 70 29 3b 20 2a 2f 0a 20 20 20  (interp); */.   
106a0 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70   Md5_Init(interp
106b0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
106c0 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74  _SSE.    Sqlitet
106d0 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65  estsse_Init(inte
106e0 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  rp);.#endif.  }.
106f0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67  #endif.  if( arg
10700 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32  c>=2 || TCLSH==2
10710 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10720 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
10730 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67  terp,"argv0",arg
10740 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f  v[1],TCL_GLOBAL_
10750 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
10760 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
10770 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f  gv", "", TCL_GLO
10780 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66  BAL_ONLY);.    f
10790 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c  or(i=3-TCLSH; i<
107a0 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
107b0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
107c0 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67  erp, "argv", arg
107d0 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[i],.          
107e0 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20  TCL_GLOBAL_ONLY 
107f0 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  | TCL_LIST_ELEME
10800 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f  NT | TCL_APPEND_
10810 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20  VALUE);.    }.  
10820 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26    if( TCLSH==1 &
10830 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69  & Tcl_EvalFile(i
10840 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21  nterp, argv[1])!
10850 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
10860 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
10870 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28  fo = Tcl_GetVar(
10880 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e  interp, "errorIn
10890 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  fo", TCL_GLOBAL_
108a0 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28  ONLY);.      if(
108b0 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66   zInfo==0 ) zInf
108c0 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75  o = interp->resu
108d0 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  lt;.      fprint
108e0 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73  f(stderr,"%s: %s
108f0 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66  \n", *argv, zInf
10900 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
10910 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
10920 69 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54  if( argc<=1 || T
10930 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54  CLSH==2 ){.    T
10940 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e  cl_GlobalEval(in
10950 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29  terp, zMainloop)
10960 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
10970 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43  ;.}.#endif /* TC
10980 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  LSH */..#endif /
10990 2a 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 43  * !defined(NO_TC
109a0 4c 29 20 2a 2f 0a                                L) */.