/ Hex Artifact Content
Login

Artifact c2303e1b1e6602b8cfef4dad00e4d76a47868c5e:


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: 33 39 20 32 30 30 35 2f 31 32 2f 31 35 20 31 35  39 2005/12/15 15
01c0: 3a 32 32 3a 31 30 20 64 61 6e 69 65 6c 6b 31 39  :22:10 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 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  /.  SqlCollate *
0e30: 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f  pCollate;      /
0e40: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
0e50: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
0e60: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
0e90: 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20   of most recent 
0ea0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a  sqlite3_exec() *
0eb0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f  /.  Tcl_Obj *pCo
0ec0: 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f  llateNeeded;   /
0ed0: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  * Collation need
0ee0: 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53  ed script */.  S
0ef0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
0f00: 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73  stmtList; /* Lis
0f10: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
0f20: 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c  atements*/.  Sql
0f30: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
0f40: 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20  mtLast; /* Last 
0f50: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
0f60: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d   list */.  int m
0f70: 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  axStmt;         
0f80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
0f90: 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  t maximum number
0fa0: 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   of stmtList */.
0fb0: 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20    int nStmt;    
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0fd0: 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  Number of statem
0fe0: 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74  ents in stmtList
0ff0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   */.};../*.** Lo
1000: 6f 6b 20 61 74 20 74 68 65 20 73 63 72 69 70 74  ok at the script
1010: 20 70 72 65 66 69 78 20 69 6e 20 70 43 6d 64 2e   prefix in pCmd.
1020: 20 20 57 65 20 77 69 6c 6c 20 62 65 20 65 78 65    We will be exe
1030: 63 75 74 69 6e 67 20 74 68 69 73 20 73 63 72 69  cuting this scri
1040: 70 74 0a 2a 2a 20 61 66 74 65 72 20 66 69 72 73  pt.** after firs
1050: 74 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20  t appending one 
1060: 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74  or more argument
1070: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
1080: 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65   analyzes.** the
1090: 20 73 63 72 69 70 74 20 74 6f 20 73 65 65 20 69   script to see i
10a0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
10b0: 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  use Tcl_EvalObjv
10c0: 28 29 20 6f 6e 20 74 68 65 20 73 63 72 69 70 74  () on the script
10d0: 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
10e0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
10f0: 20 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20   Tcl_EvalEx().  
1100: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69  Tcl_EvalObjv() i
1110: 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65 72  s much.** faster
1120: 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20  ..**.** Scripts 
1130: 74 68 61 74 20 61 72 65 20 73 61 66 65 20 74 6f  that are safe to
1140: 20 75 73 65 20 77 69 74 68 20 54 63 6c 5f 45 76   use with Tcl_Ev
1150: 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73 74  alObjv() consist
1160: 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e  s of a.** comman
1170: 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20  d name followed 
1180: 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  by zero or more 
1190: 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 20 6e  arguments with n
11a0: 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20  o [...] or $.** 
11b0: 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f  or {...} or ; to
11c0: 20 62 65 20 73 65 65 6e 20 61 6e 79 77 68 65 72   be seen anywher
11d0: 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63  e.  Most callbac
11e0: 6b 20 73 63 72 69 70 74 73 20 63 6f 6e 73 69 73  k scripts consis
11f0: 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20 73  t.** of just a s
1200: 69 6e 67 6c 65 20 70 72 6f 63 65 64 75 72 65 20  ingle procedure 
1210: 6e 61 6d 65 20 61 6e 64 20 74 68 65 79 20 6d 65  name and they me
1220: 65 74 20 74 68 69 73 20 72 65 71 75 69 72 65 6d  et this requirem
1230: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1240: 6e 74 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c  nt safeToUseEval
1250: 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70 20  Objv(Tcl_Interp 
1260: 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  *interp, Tcl_Obj
1270: 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65   *pCmd){.  /* We
1280: 20 63 6f 75 6c 64 20 74 72 79 20 74 6f 20 64 6f   could try to do
1290: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
12a0: 54 63 6c 5f 50 61 72 73 65 28 29 2e 20 20 42 75  Tcl_Parse().  Bu
12b0: 74 20 77 65 20 77 69 6c 6c 20 69 6e 73 74 65 61  t we will instea
12c0: 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61  d.  ** just do a
12d0: 20 73 65 61 72 63 68 20 66 6f 72 20 66 6f 72 62   search for forb
12e0: 69 64 64 65 6e 20 63 68 61 72 61 63 74 65 72 73  idden characters
12f0: 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  .  If any of the
1300: 20 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20   forbidden.  ** 
1310: 63 68 61 72 61 63 74 65 72 73 20 61 70 70 65 61  characters appea
1320: 72 20 69 6e 20 70 43 6d 64 2c 20 77 65 20 77 69  r in pCmd, we wi
1330: 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 73 74  ll report the st
1340: 72 69 6e 67 20 61 73 20 75 6e 73 61 66 65 2e 0a  ring as unsafe..
1350: 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61    */.  const cha
1360: 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  r *z;.  int n;. 
1370: 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69   z = Tcl_GetStri
1380: 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20  ngFromObj(pCmd, 
1390: 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  &n);.  while( n-
13a0: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e 74  - > 0 ){.    int
13b0: 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20   c = *(z++);.   
13c0: 20 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63   if( c=='$' || c
13d0: 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20  =='[' || c==';' 
13e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
13f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1400: 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c  *.** Find an Sql
1410: 46 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 77  Func structure w
1420: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61  ith the given na
1430: 6d 65 2e 20 20 4f 72 20 63 72 65 61 74 65 20 61  me.  Or create a
1440: 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61   new.** one if a
1450: 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 63  n existing one c
1460: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20  annot be found. 
1470: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1480: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75  r to the.** stru
1490: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
14a0: 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71   SqlFunc *findSq
14b0: 6c 46 75 6e 63 28 53 71 6c 69 74 65 44 62 20 2a  lFunc(SqliteDb *
14c0: 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  pDb, const char 
14d0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75  *zName){.  SqlFu
14e0: 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20  nc *p, *pNew;.  
14f0: 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20 3d 20  int i;.  pNew = 
1500: 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c  (SqlFunc*)Tcl_Al
1510: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
1520: 77 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  w) + strlen(zNam
1530: 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65 77  e) + 1 );.  pNew
1540: 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ->zName = (char*
1550: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f 72  )&pNew[1];.  for
1560: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
1570: 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61 6d  i++){ pNew->zNam
1580: 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a  e[i] = tolower(z
1590: 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20 70 4e  Name[i]); }.  pN
15a0: 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ew->zName[i] = 0
15b0: 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70  ;.  for(p=pDb->p
15c0: 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Func; p; p=p->pN
15d0: 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28 20 73  ext){ .    if( s
15e0: 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20  trcmp(p->zName, 
15f0: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  pNew->zName)==0 
1600: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72 65  ){.      Tcl_Fre
1610: 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b 0a  e((char*)pNew);.
1620: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a        return p;.
1630: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
1640: 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e  ->interp = pDb->
1650: 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d 3e  interp;.  pNew->
1660: 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70  pScript = 0;.  p
1670: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  New->pNext = pDb
1680: 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e  ->pFunc;.  pDb->
1690: 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20  pFunc = pNew;.  
16a0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
16b0: 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61  /*.** Finalize a
16c0: 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20 6f  nd free a list o
16d0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
16e0: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
16f0: 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43 61  void flushStmtCa
1700: 63 68 65 28 20 53 71 6c 69 74 65 44 62 20 2a 70  che( SqliteDb *p
1710: 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65 70 61  Db ){.  SqlPrepa
1720: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
1730: 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20 70 44  t;..  while(  pD
1740: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20  b->stmtList ){. 
1750: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1760: 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69  ize( pDb->stmtLi
1770: 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
1780: 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d   pPreStmt = pDb-
1790: 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 70  >stmtList;.    p
17a0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70  Db->stmtList = p
17b0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 4e  Db->stmtList->pN
17c0: 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  ext;.    Tcl_Fre
17d0: 65 28 20 28 63 68 61 72 2a 29 70 50 72 65 53 74  e( (char*)pPreSt
17e0: 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  mt );.  }.  pDb-
17f0: 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44  >nStmt = 0;.  pD
1800: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b  b->stmtLast = 0;
1810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63 61  .}../*.** TCL ca
1820: 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65 64 75  lls this procedu
1830: 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c 69 74  re when an sqlit
1840: 65 33 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d  e3 database comm
1850: 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74 65  and is.** delete
1860: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
1870: 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76 6f  d DbDeleteCmd(vo
1880: 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74  id *db){.  Sqlit
1890: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
18a0: 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73  teDb*)db;.  flus
18b0: 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b  hStmtCache(pDb);
18c0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
18d0: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69  (pDb->db);.  whi
18e0: 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29  le( pDb->pFunc )
18f0: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
1900: 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Func = pDb->pFun
1910: 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e  c;.    pDb->pFun
1920: 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74  c = pFunc->pNext
1930: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
1940: 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53  fCount(pFunc->pS
1950: 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f  cript);.    Tcl_
1960: 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e  Free((char*)pFun
1970: 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  c);.  }.  while(
1980: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29   pDb->pCollate )
1990: 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65  {.    SqlCollate
19a0: 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62   *pCollate = pDb
19b0: 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ->pCollate;.    
19c0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20  pDb->pCollate = 
19d0: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b  pCollate->pNext;
19e0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
19f0: 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a  har*)pCollate);.
1a00: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
1a10: 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Busy ){.    Tcl_
1a20: 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29  Free(pDb->zBusy)
1a30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
1a40: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54  >zTrace ){.    T
1a50: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
1a60: 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ace);.  }.  if( 
1a70: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
1a80: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
1a90: 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
1aa0: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75  }.  if( pDb->zAu
1ab0: 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  th ){.    Tcl_Fr
1ac0: 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a  ee(pDb->zAuth);.
1ad0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
1ae0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Null ){.    Tcl_
1af0: 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
1b00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
1b10: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a  >pUpdateHook ){.
1b20: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1b30: 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74  ount(pDb->pUpdat
1b40: 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  eHook);.  }.  if
1b50: 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  ( pDb->pCollateN
1b60: 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c  eeded ){.    Tcl
1b70: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
1b80: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
1b90: 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72  d);.  }.  Tcl_Fr
1ba0: 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a  ee((char*)pDb);.
1bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1bc0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1bd0: 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
1be0: 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77  file is locked w
1bf0: 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
1c00: 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a  o execute SQL..*
1c10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42  /.static int DbB
1c20: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
1c30: 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29  *cd, int nTries)
1c40: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
1c50: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
1c60: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  d;.  int rc;.  c
1c70: 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20  har zVal[30];.. 
1c80: 20 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22   sprintf(zVal, "
1c90: 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20  %d", nTries);.  
1ca0: 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c  rc = Tcl_VarEval
1cb0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
1cc0: 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a  b->zBusy, " ", z
1cd0: 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Val, (char*)0);.
1ce0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
1cf0: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
1d00: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
1d10: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
1d20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1d30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1d40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d50: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20  e is invoked as 
1d60: 74 68 65 20 27 70 72 6f 67 72 65 73 73 20 63 61  the 'progress ca
1d70: 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20  llback' for the 
1d80: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1d90: 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65  tic int DbProgre
1da0: 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ssHandler(void *
1db0: 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  cd){.  SqliteDb 
1dc0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
1dd0: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
1de0: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
1df0: 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72  zProgress );.  r
1e00: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
1e10: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
1e20: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28  Progress);.  if(
1e30: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
1e40: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
1e50: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
1e60: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
1e70: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
1e80: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1e90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1ea0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51  called by the SQ
1eb0: 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c  Lite trace handl
1ec0: 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65  er whenever a ne
1ed0: 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51  w.** block of SQ
1ee0: 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  L is executed.  
1ef0: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
1f00: 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73  n pDb->zTrace is
1f10: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74   executed..*/.st
1f20: 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63  atic void DbTrac
1f30: 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  eHandler(void *c
1f40: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
1f50: 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  Sql){.  SqliteDb
1f60: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
1f70: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74  b*)cd;.  Tcl_DSt
1f80: 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c  ring str;..  Tcl
1f90: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
1fa0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
1fb0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
1fc0: 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a  b->zTrace, -1);.
1fd0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
1fe0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
1ff0: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76   zSql);.  Tcl_Ev
2000: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
2010: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
2020: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
2030: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
2040: 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
2050: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
2060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2070: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2080: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
2090: 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72 20  profile handler 
20a0: 61 66 74 65 72 20 61 20 73 74 61 74 65 6d 65 6e  after a statemen
20b0: 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65 78 65  t.** SQL has exe
20c0: 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20  cuted.  The TCL 
20d0: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
20e0: 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61 6c 75  Profile is evalu
20f0: 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
2100: 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65 48 61  void DbProfileHa
2110: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
2120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2130: 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20  , sqlite_uint64 
2140: 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  tm){.  SqliteDb 
2150: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
2160: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72  *)cd;.  Tcl_DStr
2170: 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61 72 20  ing str;.  char 
2180: 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c  zTm[100];..  sql
2190: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
21a0: 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d  zeof(zTm)-1, zTm
21b0: 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20  , "%lld", tm);. 
21c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
21d0: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53  (&str);.  Tcl_DS
21e0: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
21f0: 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  , pDb->zProfile,
2200: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
2210: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
2220: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
2230: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
2240: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
2250: 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28  Tm);.  Tcl_Eval(
2260: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
2270: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
2280: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
2290: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
22a0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
22b0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d  (pDb->interp);.}
22c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
22d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
22e0: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
22f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20  n is committed. 
2300: 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69   The.** TCL scri
2310: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d  pt in pDb->zComm
2320: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  it is executed. 
2330: 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e   If it returns n
2340: 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66  on-zero or.** if
2350: 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78   it throws an ex
2360: 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61  ception, the tra
2370: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
2380: 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a  ed back instead.
2390: 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d  ** of being comm
23a0: 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  itted..*/.static
23b0: 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e   int DbCommitHan
23c0: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
23d0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
23e0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
23f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
2400: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
2410: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  >interp, pDb->zC
2420: 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
2430: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
2440: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
2450: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
2460: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
2470: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2480: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   0;.}..static vo
2490: 69 64 20 44 62 55 70 64 61 74 65 48 61 6e 64 6c  id DbUpdateHandl
24a0: 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a  er(.  void *p, .
24b0: 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73    int op,.  cons
24c0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20  t char *zDb, .  
24d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
24e0: 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
24f0: 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c  4 rowid.){.  Sql
2500: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
2510: 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63  liteDb *)p;.  Tc
2520: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
2530: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55 70  assert( pDb->pUp
2540: 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73  dateHook );.  as
2550: 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54 45  sert( op==SQLITE
2560: 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 53  _INSERT || op==S
2570: 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c 20  QLITE_UPDATE || 
2580: 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54  op==SQLITE_DELET
2590: 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54  E );..  pCmd = T
25a0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
25b0: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
25c0: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
25d0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54  Count(pCmd);.  T
25e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
25f0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
2600: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2610: 6a 28 0a 20 20 20 20 28 20 28 6f 70 3d 3d 53 51  j(.    ( (op==SQ
2620: 4c 49 54 45 5f 49 4e 53 45 52 54 29 3f 22 49 4e  LITE_INSERT)?"IN
2630: 53 45 52 54 22 3a 28 6f 70 3d 3d 53 51 4c 49 54  SERT":(op==SQLIT
2640: 45 5f 55 50 44 41 54 45 29 3f 22 55 50 44 41 54  E_UPDATE)?"UPDAT
2650: 45 22 3a 22 44 45 4c 45 54 45 22 29 2c 20 2d 31  E":"DELETE"), -1
2660: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
2670: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
2680: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
2690: 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31  tringObj(zDb, -1
26a0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
26b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
26c0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
26d0: 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d  tringObj(zTbl, -
26e0: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
26f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2700: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
2710: 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64  WideIntObj(rowid
2720: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
2730: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
2740: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
2750: 44 49 52 45 43 54 29 3b 0a 7d 0a 0a 73 74 61 74  DIRECT);.}..stat
2760: 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61  ic void tclColla
2770: 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  teNeeded(.  void
2780: 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65   *pCtx,.  sqlite
2790: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63  3 *db,.  int enc
27a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
27b0: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74  zName.){.  Sqlit
27c0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
27d0: 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54  teDb *)pCtx;.  T
27e0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
27f0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2800: 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  bj(pDb->pCollate
2810: 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49  Needed);.  Tcl_I
2820: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
2830: 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ipt);.  Tcl_List
2840: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2850: 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c  (0, pScript, Tcl
2860: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e  _NewStringObj(zN
2870: 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ame, -1));.  Tcl
2880: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
2890: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
28a0: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
28b0: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
28c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
28d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
28e0: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
28f0: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
2900: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
2910: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c  ted.** using TCL
2920: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
2930: 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c  ic int tclSqlCol
2940: 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43  late(.  void *pC
2950: 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20  tx,.  int nA,.  
2960: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a  const void *zA,.
2970: 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73    int nB,.  cons
2980: 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20  t void *zB.){.  
2990: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20  SqlCollate *p = 
29a0: 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43  (SqlCollate *)pC
29b0: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
29c0: 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54  Cmd;..  pCmd = T
29d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
29e0: 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b  p->zScript, -1);
29f0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
2a00: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
2a10: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2a20: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
2a30: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
2a40: 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29  ringObj(zA, nA))
2a50: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2a60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
2a70: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
2a80: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
2a90: 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45  B, nB));.  Tcl_E
2aa0: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
2ab0: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
2ac0: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
2ad0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
2ae0: 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmd);.  return (
2af0: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
2b00: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
2b10: 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rp)));.}../*.** 
2b20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2b30: 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61  called to evalua
2b40: 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69  te an SQL functi
2b50: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
2b60: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
2b70: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
2b80: 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71  id tclSqlFunc(sq
2b90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
2ba0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
2bb0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
2bc0: 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e  *argv){.  SqlFun
2bd0: 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75  c *p = sqlite3_u
2be0: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
2bf0: 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  );.  Tcl_Obj *pC
2c00: 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  md;.  int i;.  i
2c10: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72  nt rc;..  if( ar
2c20: 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  gc==0 ){.    /* 
2c30: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
2c40: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
2c50: 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20   function, call 
2c60: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e  Tcl_EvalObjEx on
2c70: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69   the.    ** scri
2c80: 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74  pt object direct
2c90: 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ly.  This allows
2ca0: 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65   the TCL compile
2cb0: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20  r to generate.  
2cc0: 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f    ** bytecode fo
2cd0: 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e  r the command on
2ce0: 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
2cf0: 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d  ation and thus m
2d00: 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  ake.    ** subse
2d10: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
2d20: 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a  s much faster. *
2d30: 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e  /.    pCmd = p->
2d40: 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c  pScript;.    Tcl
2d50: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
2d60: 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63  md);.    rc = Tc
2d70: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
2d80: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b  nterp, pCmd, 0);
2d90: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2da0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d  Count(pCmd);.  }
2db0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2dc0: 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d 65  there are argume
2dd0: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
2de0: 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c  ion, make a shal
2df0: 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a  low copy of the.
2e00: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62      ** script ob
2e10: 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68  ject, lappend th
2e20: 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65  e arguments, the
2e30: 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 63  n evaluate the c
2e40: 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  opy..    **.    
2e50: 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20  ** By "shallow" 
2e60: 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20  copy, we mean a 
2e70: 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c  only the outer l
2e80: 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64  ist Tcl_Obj is d
2e90: 75 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a  uplicated..    *
2ea0: 2a 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62  * The new Tcl_Ob
2eb0: 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  j contains point
2ec0: 65 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ers to the origi
2ed0: 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74  nal list element
2ee0: 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  s. .    ** That 
2ef0: 77 61 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76  way, when Tcl_Ev
2f00: 61 6c 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20  alObjv() is run 
2f10: 61 6e 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65  and shimmers the
2f20: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20   first element. 
2f30: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73     ** of the lis
2f40: 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54  t to tclCmdNameT
2f50: 79 70 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e  ype, that altern
2f60: 61 74 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ate representati
2f70: 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  on will.    ** b
2f80: 65 20 70 72 65 73 65 72 76 65 64 20 61 6e 64 20  e preserved and 
2f90: 72 65 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65  reused on the ne
2fa0: 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20  xt invocation.. 
2fb0: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62     */.    Tcl_Ob
2fc0: 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e  j **aArg;.    in
2fd0: 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20  t nArg;.    if( 
2fe0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
2ff0: 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70  ements(p->interp
3000: 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e  , p->pScript, &n
3010: 41 72 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20  Arg, &aArg) ){. 
3020: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3030: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
3040: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
3050: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
3060: 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72  ), -1); .      r
3070: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20  eturn;.    }    
3080: 20 0a 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c   .    pCmd = Tcl
3090: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67  _NewListObj(nArg
30a0: 2c 20 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c  , aArg);.    Tcl
30b0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
30c0: 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  md);.    for(i=0
30d0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
30e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
30f0: 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b  lue *pIn = argv[
3100: 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  i];.      Tcl_Ob
3110: 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20  j *pVal;.       
3120: 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53       .      /* S
3130: 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61  et pVal to conta
3140: 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  in the i'th colu
3150: 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20  mn of this row. 
3160: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
3170: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
3180: 79 70 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20  ype(pIn) ){.    
3190: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
31a0: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
31b0: 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71    int bytes = sq
31c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
31d0: 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  s(pIn);.        
31e0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
31f0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c  ByteArrayObj(sql
3200: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
3210: 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20  pIn), bytes);.  
3220: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3240: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
3250: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGER: {.        
3260: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76    sqlite_int64 v
3270: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3280: 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20  _int64(pIn);.   
3290: 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32         if( v>=-2
32a0: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
32b0: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
32c0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
32d0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
32e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
32f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
3300: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69  pVal = Tcl_NewWi
3310: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
3320: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3340: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
3350: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
3360: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
3370: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e r = sqlite3_va
3380: 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b  lue_double(pIn);
3390: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
33a0: 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  = Tcl_NewDoubleO
33b0: 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(r);.         
33c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
33d0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
33e0: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
33f0: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
3400: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3410: 22 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  "", 0);.        
3420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3430: 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75   }.        defau
3440: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lt: {.          
3450: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
3460: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
3470: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
3480: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
3490: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
34a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
34b0: 78 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b  xt(pIn), bytes);
34c0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
34d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34e0: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54    }.      rc = T
34f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3500: 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72  Element(p->inter
3510: 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a  p, pCmd, pVal);.
3520: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
3530: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
3540: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
3550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3560: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
3570: 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72  text, Tcl_GetStr
3580: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
3590: 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20  erp), -1); .    
35a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
35b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
35c0: 28 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a  ( !p->useEvalObj
35d0: 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63  v ){.      /* Tc
35e0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69  l_EvalObjEx() wi
35f0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
3600: 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62   call Tcl_EvalOb
3610: 6a 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20  jv() if pCmd.   
3620: 20 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20     ** is a list 
3630: 77 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67  without a string
3640: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
3650: 20 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69    To prevent thi
3660: 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  s from.      ** 
3670: 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20  happening, make 
3680: 73 75 72 65 20 70 43 6d 64 20 68 61 73 20 61 20  sure pCmd has a 
3690: 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70  valid string rep
36a0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  resentation */. 
36b0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
36c0: 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a  ng(pCmd);.    }.
36d0: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
36e0: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
36f0: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
3700: 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63  _DIRECT);.    Tc
3710: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3720: 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cmd);.  }..  if(
3730: 20 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52   rc && rc!=TCL_R
3740: 45 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c  ETURN ){.    sql
3750: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
3760: 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47  r(context, Tcl_G
3770: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
3780: 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20  ->interp), -1); 
3790: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
37a0: 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63  l_Obj *pVar = Tc
37b0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_GetObjResult(p
37c0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69  ->interp);.    i
37d0: 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61  nt n;.    u8 *da
37e0: 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  ta;.    char *zT
37f0: 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65  ype = pVar->type
3800: 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65  Ptr ? pVar->type
3810: 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a  Ptr->name : "";.
3820: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79      char c = zTy
3830: 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63  pe[0];.    if( c
3840: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
3850: 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79  zType,"bytearray
3860: 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62  ")==0 && pVar->b
3870: 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ytes==0 ){.     
3880: 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20   /* Only return 
3890: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
38a0: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
38b0: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
38c0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  nd.      ** has 
38d0: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
38e0: 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  entation. */.   
38f0: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
3900: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
3910: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
3920: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3930: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
3940: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
3950: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
3960: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62  }else if( (c=='b
3970: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
3980: 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29  e,"boolean")==0)
3990: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63   ||.          (c
39a0: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
39b0: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
39c0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   ){.      Tcl_Ge
39d0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  tIntFromObj(0, p
39e0: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
39f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3a00: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a  nt(context, n);.
3a10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
3a20: 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='d' && strcmp(z
3a30: 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Type,"double")==
3a40: 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  0 ){.      doubl
3a50: 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  e r;.      Tcl_G
3a60: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
3a70: 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  0, pVar, &r);.  
3a80: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3a90: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
3aa0: 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, r);.    }else
3ab0: 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73   if( c=='w' && s
3ac0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64  trcmp(zType,"wid
3ad0: 65 49 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  eInt")==0 ){.   
3ae0: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
3af0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57  ;.      Tcl_GetW
3b00: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  ideIntFromObj(0,
3b10: 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20   pVar, &v);.    
3b20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3b30: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
3b40: 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
3b50: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
3b60: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
3b70: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
3b80: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
3b90: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3ba0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
3bb0: 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c  (char *)data, n,
3bc0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
3bd0: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  T);.    }.  }.}.
3be0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3bf0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
3c00: 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ON./*.** This is
3c10: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
3c20: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  ion function.  I
3c30: 74 20 61 70 70 65 6e 64 73 20 74 68 65 20 61 75  t appends the au
3c40: 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20  thentication.** 
3c50: 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68  type code and th
3c60: 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  e two arguments 
3c70: 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69  to zCmd[] then i
3c80: 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c  nvokes the resul
3c90: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65  t.** on the inte
3ca0: 72 70 72 65 74 65 72 2e 20 20 54 68 65 20 72 65  rpreter.  The re
3cb0: 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20  ply is examined 
3cc0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
3cd0: 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63  the.** authentic
3ce0: 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73  ation fails or s
3cf0: 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74  ucceeds..*/.stat
3d00: 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c  ic int auth_call
3d10: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41  back(.  void *pA
3d20: 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a  rg,.  int code,.
3d30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
3d40: 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg1,.  const cha
3d50: 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73  r *zArg2,.  cons
3d60: 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20  t char *zArg3,. 
3d70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
3d80: 67 34 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  g4.){.  char *zC
3d90: 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ode;.  Tcl_DStri
3da0: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
3db0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
3dc0: 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65  zReply;.  Sqlite
3dd0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
3de0: 65 44 62 2a 29 70 41 72 67 3b 0a 0a 20 20 73 77  eDb*)pArg;..  sw
3df0: 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20  itch( code ){.  
3e00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3e10: 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20 20  PY              
3e20: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
3e30: 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20  COPY"; break;.  
3e40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
3e50: 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20  EATE_INDEX      
3e60: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
3e70: 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62  CREATE_INDEX"; b
3e80: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3e90: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
3ea0: 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  LE      : zCode=
3eb0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
3ec0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
3ed0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
3ee0: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20  EATE_TEMP_INDEX 
3ef0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
3f00: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
3f10: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
3f20: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
3f30: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a  E_TEMP_TABLE : z
3f40: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
3f50: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b  ATE_TEMP_TABLE";
3f60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3f70: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
3f80: 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f  EMP_TRIGGER: zCo
3f90: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
3fa0: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  E_TEMP_TRIGGER";
3fb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3fc0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
3fd0: 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64  EMP_VIEW  : zCod
3fe0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
3ff0: 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65  _TEMP_VIEW"; bre
4000: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4010: 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47  ITE_CREATE_TRIGG
4020: 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  ER    : zCode="S
4030: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
4040: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
4050: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
4060: 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20 20  EATE_VIEW       
4070: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4080: 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72  CREATE_VIEW"; br
4090: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
40a0: 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20  LITE_DELETE     
40b0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
40c0: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20  SQLITE_DELETE"; 
40d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
40e0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
40f0: 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  X        : zCode
4100: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  ="SQLITE_DROP_IN
4110: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
4120: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
4130: 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a  P_TABLE        :
4140: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
4150: 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  ROP_TABLE"; brea
4160: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4170: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
4180: 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  EX   : zCode="SQ
4190: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
41a0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
41b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
41c0: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20  OP_TEMP_TABLE   
41d0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
41e0: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22  DROP_TEMP_TABLE"
41f0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4200: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
4210: 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f  MP_TRIGGER : zCo
4220: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
4230: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62  TEMP_TRIGGER"; b
4240: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
4250: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
4260: 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d  VIEW    : zCode=
4270: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
4280: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; 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 52 49 47 47 45 52 20 20 20 20  DROP_TRIGGER    
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 52 49 47 47 45 52 22 3b  E_DROP_TRIGGER";
42d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
42e0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
42f0: 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  W         : zCod
4300: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
4310: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
4320: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53   case SQLITE_INS
4330: 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20 3a  ERT            :
4340: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49   zCode="SQLITE_I
4350: 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20  NSERT"; break;. 
4360: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
4370: 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20 20  RAGMA           
4380: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4390: 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b  _PRAGMA"; break;
43a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
43b0: 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
43c0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
43d0: 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b  TE_READ"; break;
43e0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
43f0: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
4400: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4410: 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61  TE_SELECT"; brea
4420: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4430: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20  TE_TRANSACTION  
4440: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
4450: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
4460: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4470: 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45  se SQLITE_UPDATE
4480: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
4490: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41  ode="SQLITE_UPDA
44a0: 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TE"; break;.    
44b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41  case SQLITE_ATTA
44c0: 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CH            : 
44d0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54  zCode="SQLITE_AT
44e0: 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TACH"; break;.  
44f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
4500: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
4510: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4520: 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  DETACH"; break;.
4530: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4540: 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20  ALTER_TABLE     
4550: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
4560: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20  E_ALTER_TABLE"; 
4570: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4580: 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20  SQLITE_REINDEX  
4590: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
45a0: 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  ="SQLITE_REINDEX
45b0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
45c0: 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a  se SQLITE_ANALYZ
45d0: 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  E           : zC
45e0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41 4c  ode="SQLITE_ANAL
45f0: 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  YZE"; break;.   
4600: 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20   default        
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
4620: 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62   zCode="????"; b
4630: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  reak;.  }.  Tcl_
4640: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4650: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
4660: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
4670: 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20  ->zAuth, -1);.  
4680: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
4690: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
46a0: 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74  Code);.  Tcl_DSt
46b0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
46c0: 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20  t(&str, zArg1 ? 
46d0: 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54  zArg1 : "");.  T
46e0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
46f0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
4700: 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22  rg2 ? zArg2 : ""
4710: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
4720: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
4730: 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67  tr, zArg3 ? zArg
4740: 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  3 : "");.  Tcl_D
4750: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
4760: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20  ent(&str, zArg4 
4770: 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20  ? zArg4 : "");. 
4780: 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c   rc = Tcl_Global
4790: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
47a0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
47b0: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
47c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
47d0: 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54  r);.  zReply = T
47e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
47f0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
4800: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  .  if( strcmp(zR
4810: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22  eply,"SQLITE_OK"
4820: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
4830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
4840: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
4850: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45  Reply,"SQLITE_DE
4860: 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  NY")==0 ){.    r
4870: 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b  c = SQLITE_DENY;
4880: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
4890: 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49  cmp(zReply,"SQLI
48a0: 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29  TE_IGNORE")==0 )
48b0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
48c0: 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73  E_IGNORE;.  }els
48d0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b  e{.    rc = 999;
48e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
48f0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
4900: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
4910: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  IZATION */../*.*
4920: 2a 20 7a 54 65 78 74 20 69 73 20 61 20 70 6f 69  * zText is a poi
4930: 6e 74 65 72 20 74 6f 20 74 65 78 74 20 6f 62 74  nter to text obt
4940: 61 69 6e 65 64 20 76 69 61 20 61 6e 20 73 71 6c  ained via an sql
4950: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
4960: 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72  ().** or similar
4970: 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69 73   interface. This
4980: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4990: 20 61 20 54 63 6c 20 73 74 72 69 6e 67 20 6f 62   a Tcl string ob
49a0: 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65  ject, .** refere
49b0: 6e 63 65 20 63 6f 75 6e 74 20 73 65 74 20 74 6f  nce count set to
49c0: 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   0, containing t
49d0: 68 65 20 74 65 78 74 2e 20 49 66 20 61 20 74 72  he text. If a tr
49e0: 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74  anslation.** bet
49f0: 77 65 65 6e 20 69 73 6f 38 38 35 39 20 61 6e 64  ween iso8859 and
4a00: 20 55 54 46 2d 38 20 69 73 20 72 65 71 75 69 72   UTF-8 is requir
4a10: 65 64 2c 20 69 74 20 69 73 20 70 72 65 66 6f 72  ed, it is prefor
4a20: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  med..*/.static T
4a30: 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f  cl_Obj *dbTextTo
4a40: 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73 74 20 2a  Obj(char const *
4a50: 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62  zText){.  Tcl_Ob
4a60: 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66 20  j *pVal;.#ifdef 
4a70: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
4a80: 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f 44 53 74  NEEDED.  Tcl_DSt
4a90: 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c  ring dCol;.  Tcl
4aa0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 43  _DStringInit(&dC
4ab0: 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72  ol);.  Tcl_Exter
4ac0: 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28  nalToUtfDString(
4ad0: 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  NULL, zText, -1,
4ae0: 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20   &dCol);.  pVal 
4af0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
4b00: 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  bj(Tcl_DStringVa
4b10: 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b  lue(&dCol), -1);
4b20: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
4b30: 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65  ee(&dCol);.#else
4b40: 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65  .  pVal = Tcl_Ne
4b50: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74  wStringObj(zText
4b60: 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
4b70: 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a  return pVal;.}..
4b80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4b90: 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20  ne reads a line 
4ba0: 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c  of text from FIL
4bb0: 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20  E in, stores.** 
4bc0: 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f  the text in memo
4bd0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
4be0: 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65   malloc() and re
4bf0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
4c00: 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20  ** to the text. 
4c10: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
4c20: 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65  d at end of file
4c30: 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29  , or if malloc()
4c40: 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  .** fails..**.**
4c50: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
4c60: 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e 65  s like "readline
4c70: 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64  " but no command
4c80: 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a  -line editing.**
4c90: 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
4ca0: 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68 65 6c  copied from shel
4cb0: 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72  l.c from '.impor
4cc0: 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74  t' command.*/.st
4cd0: 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c  atic char *local
4ce0: 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a  _getline(char *z
4cf0: 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e  Prompt, FILE *in
4d00: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  ){.  char *zLine
4d10: 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20  ;.  int nLine;. 
4d20: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f   int n;.  int eo
4d30: 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30  l;..  nLine = 10
4d40: 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c  0;.  zLine = mal
4d50: 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20  loc( nLine );.  
4d60: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
4d70: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30  eturn 0;.  n = 0
4d80: 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77  ;.  eol = 0;.  w
4d90: 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20  hile( !eol ){.  
4da0: 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e    if( n+100>nLin
4db0: 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  e ){.      nLine
4dc0: 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30   = nLine*2 + 100
4dd0: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20  ;.      zLine = 
4de0: 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e  realloc(zLine, n
4df0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
4e00: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
4e10: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
4e20: 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65  if( fgets(&zLine
4e30: 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20  [n], nLine - n, 
4e40: 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  in)==0 ){.      
4e50: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
4e60: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
4e70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4e80: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
4e90: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
4ea0: 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20       eol = 1;.  
4eb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ec0: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  .    while( zLin
4ed0: 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  e[n] ){ n++; }. 
4ee0: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
4ef0: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29  ine[n-1]=='\n' )
4f00: 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  {.      n--;.   
4f10: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
4f20: 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a  .      eol = 1;.
4f30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e      }.  }.  zLin
4f40: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69  e = realloc( zLi
4f50: 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74  ne, n+1 );.  ret
4f60: 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a  urn zLine;.}../*
4f70: 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22  .** The "sqlite"
4f80: 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63   command below c
4f90: 72 65 61 74 65 73 20 61 20 6e 65 77 20 54 63 6c  reates a new Tcl
4fa0: 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63   command for eac
4fb0: 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  h.** connection 
4fc0: 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53  it opens to an S
4fd0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
4fe0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4ff0: 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e   invoked.** when
5000: 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73  ever one of thos
5010: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65  e connection-spe
5020: 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69  cific commands i
5030: 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e  s executed.** in
5040: 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70   Tcl.  For examp
5050: 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20 54  le, if you run T
5060: 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69  cl code like thi
5070: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73  s:.**.**       s
5080: 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d 79 5f  qlite3 db1  "my_
5090: 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20 20  database".**    
50a0: 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a     db1 close.**.
50b0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d  ** The first com
50c0: 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e  mand opens a con
50d0: 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 22  nection to the "
50e0: 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64 61 74  my_database" dat
50f0: 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c  abase.** and cal
5100: 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69  ls that connecti
5110: 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20 73  on "db1".  The s
5120: 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61  econd command ca
5130: 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75 62  uses this.** sub
5140: 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69 6e  routine to be in
5150: 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  voked..*/.static
5160: 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28 76 6f   int DbObjCmd(vo
5170: 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65  id *cd, Tcl_Inte
5180: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
5190: 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f  objc,Tcl_Obj *co
51a0: 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c  nst*objv){.  Sql
51b0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
51c0: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
51d0: 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20  t choice;.  int 
51e0: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73  rc = TCL_OK;.  s
51f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5200: 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a   *DB_strs[] = {.
5210: 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72 22      "authorizer"
5220: 2c 20 20 20 20 20 20 20 20 20 22 62 75 73 79 22  ,         "busy"
5230: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
5240: 63 61 63 68 65 22 2c 0a 20 20 20 20 22 63 68 61  cache",.    "cha
5250: 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
5260: 20 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20    "close",      
5270: 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 65 22         "collate"
5280: 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e  ,.    "collation
5290: 5f 6e 65 65 64 65 64 22 2c 20 20 20 22 63 6f 6d  _needed",   "com
52a0: 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20  mit_hook",      
52b0: 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a 20 20 20   "complete",.   
52c0: 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20 20   "copy",        
52d0: 20 20 20 20 20 20 20 22 65 72 72 6f 72 63 6f 64         "errorcod
52e0: 65 22 2c 20 20 20 20 20 20 20 20 20 22 65 76 61  e",         "eva
52f0: 6c 22 2c 0a 20 20 20 20 22 65 78 69 73 74 73 22  l",.    "exists"
5300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66  ,             "f
5310: 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  unction",       
5320: 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f     "last_insert_
5330: 72 6f 77 69 64 22 2c 0a 20 20 20 20 22 6e 75 6c  rowid",.    "nul
5340: 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20  lvalue",        
5350: 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20 20    "onecolumn",  
5360: 20 20 20 20 20 20 20 22 70 72 6f 66 69 6c 65 22         "profile"
5370: 2c 0a 20 20 20 20 22 70 72 6f 67 72 65 73 73 22  ,.    "progress"
5380: 2c 20 20 20 20 20 20 20 20 20 20 20 22 72 65 6b  ,           "rek
5390: 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey",            
53a0: 20 22 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69   "soft_heap_limi
53b0: 74 22 2c 0a 20 20 20 20 22 74 69 6d 65 6f 75 74  t",.    "timeout
53c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 74  ",            "t
53d0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20  otal_changes",  
53e0: 20 20 20 22 74 72 61 63 65 22 2c 0a 20 20 20 20     "trace",.    
53f0: 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20  "transaction",  
5400: 20 20 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f        "update_ho
5410: 6f 6b 22 2c 20 20 20 20 20 20 20 22 76 65 72 73  ok",       "vers
5420: 69 6f 6e 22 2c 0a 20 20 20 20 30 20 20 20 20 20  ion",.    0     
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
5440: 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65    };.  enum DB_e
5450: 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54  num {.    DB_AUT
5460: 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20  HORIZER,        
5470: 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20 20 20  DB_BUSY,        
5480: 20 20 20 20 20 44 42 5f 43 41 43 48 45 2c 0a 20       DB_CACHE,. 
5490: 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20 20     DB_CHANGES,  
54a0: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c 4f 53           DB_CLOS
54b0: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42  E,            DB
54c0: 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20 20 44 42  _COLLATE,.    DB
54d0: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
54e0: 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f  D,  DB_COMMIT_HO
54f0: 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43 4f 4d 50  OK,      DB_COMP
5500: 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 50  LETE,.    DB_COP
5510: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,              
5520: 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20 20 20  DB_ERRORCODE,   
5530: 20 20 20 20 20 44 42 5f 45 56 41 4c 2c 0a 20 20       DB_EVAL,.  
5540: 20 20 44 42 5f 45 58 49 53 54 53 2c 20 20 20 20    DB_EXISTS,    
5550: 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43 54          DB_FUNCT
5560: 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 44 42 5f  ION,         DB_
5570: 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49  LAST_INSERT_ROWI
5580: 44 2c 0a 20 20 20 20 44 42 5f 4e 55 4c 4c 56 41  D,.    DB_NULLVA
5590: 4c 55 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f  LUE,         DB_
55a0: 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20  ONECOLUMN,      
55b0: 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 0a 20 20    DB_PROFILE,.  
55c0: 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20    DB_PROGRESS,  
55d0: 20 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59          DB_REKEY
55e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  ,            DB_
55f0: 53 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 2c  SOFT_HEAP_LIMIT,
5600: 0a 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c  .    DB_TIMEOUT,
5610: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f             DB_TO
5620: 54 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20 20  TAL_CHANGES,    
5630: 44 42 5f 54 52 41 43 45 2c 0a 20 20 20 20 44 42  DB_TRACE,.    DB
5640: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20  _TRANSACTION,   
5650: 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f      DB_UPDATE_HO
5660: 4f 4b 2c 20 20 20 20 20 20 44 42 5f 56 45 52 53  OK,      DB_VERS
5670: 49 4f 4e 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f  ION.  };.  /* do
5680: 6e 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69  n't leave traili
5690: 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f  ng commas on DB_
56a0: 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65  enum, it confuse
56b0: 73 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f  s the AIX xlc co
56c0: 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28  mpiler */..  if(
56d0: 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54   objc<2 ){.    T
56e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
56f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
5700: 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e   "SUBCOMMAND ...
5710: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
5720: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
5730: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
5740: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
5750: 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73  objv[1], DB_strs
5760: 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26  , "option", 0, &
5770: 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72  choice) ){.    r
5780: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5790: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
57a0: 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68  (enum DB_enum)ch
57b0: 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20  oice ){..  /*   
57c0: 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20   $db authorizer 
57d0: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
57e0: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
57f0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74  given callback t
5800: 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68  o authorize each
5810: 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61   SQL operation a
5820: 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  s it is.  ** com
5830: 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65  piled.  5 argume
5840: 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64  nts are appended
5850: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
5860: 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20   before it is.  
5870: 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a  ** invoked:.  **
5880: 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20  .  **   (1) The 
5890: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79  authorization ty
58a0: 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43  pe (ex: SQLITE_C
58b0: 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c  REATE_TABLE, SQL
58c0: 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29  ITE_INSERT, ...)
58d0: 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73  .  **   (2) Firs
58e0: 74 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  t descriptive na
58f0: 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61  me (depends on a
5900: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
5910: 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65  e).  **   (3) Se
5920: 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65  cond descriptive
5930: 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29   name.  **   (4)
5940: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
5950: 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e  abase (ex: "main
5960: 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20  ", "temp").  ** 
5970: 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72    (5) Name of tr
5980: 69 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f  igger that is do
5990: 69 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20  ing the access. 
59a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
59b0: 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74  lback should ret
59c0: 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f  urn on of the fo
59d0: 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a  llowing strings:
59e0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a   SQLITE_OK,.  **
59f0: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20   SQLITE_IGNORE, 
5a00: 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20  or SQLITE_DENY. 
5a10: 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
5a20: 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72  n value is an er
5a30: 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ror..  **.  ** I
5a40: 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73  f this method is
5a50: 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f   invoked with no
5a60: 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20   arguments, the 
5a70: 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a  current authoriz
5a80: 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62  ation.  ** callb
5a90: 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65  ack string is re
5aa0: 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  turned..  */.  c
5ab0: 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45  ase DB_AUTHORIZE
5ac0: 52 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  R: {.#ifdef SQLI
5ad0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
5ae0: 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70  ATION.    Tcl_Ap
5af0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5b00: 70 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  p, "authorizatio
5b10: 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  n not available 
5b20: 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20  in this build", 
5b30: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
5b40: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
5b50: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
5b60: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
5b70: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
5b80: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
5b90: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
5ba0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5bb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
5bc0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
5bd0: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
5be0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
5bf0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5c00: 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30  p, pDb->zAuth, 0
5c10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5c20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
5c30: 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69   *zAuth;.      i
5c40: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
5c50: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
5c60: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
5c70: 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20  (pDb->zAuth);.  
5c80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74      }.      zAut
5c90: 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  h = Tcl_GetStrin
5ca0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
5cb0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
5cc0: 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e  f( zAuth && len>
5cd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
5ce0: 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c  ->zAuth = Tcl_Al
5cf0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
5d00: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
5d10: 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68  Db->zAuth, zAuth
5d20: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5d30: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75          pDb->zAu
5d40: 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  th = 0;.      }.
5d50: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
5d60: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
5d70: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
5d80: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
5d90: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
5da0: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75  izer(pDb->db, au
5db0: 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62  th_callback, pDb
5dc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5de0: 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
5df0: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
5e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
5e10: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
5e20: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
5e30: 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  busy ?CALLBACK?.
5e40: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
5e50: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
5e60: 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74  ack if an SQL st
5e70: 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73  atement attempts
5e80: 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
5e90: 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20  locked database 
5ea0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  file..  */.  cas
5eb0: 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20  e DB_BUSY: {.   
5ec0: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
5ed0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
5ee0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
5ef0: 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b   objv, "CALLBACK
5f00: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
5f10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5f20: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
5f30: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
5f40: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
5f50: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
5f60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
5f70: 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20  b->zBusy, 0);.  
5f80: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
5f90: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75  .      char *zBu
5fa0: 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  sy;.      int le
5fb0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
5fc0: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20  ->zBusy ){.     
5fd0: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
5fe0: 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d  >zBusy);.      }
5ff0: 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54  .      zBusy = T
6000: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
6010: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
6020: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42  n);.      if( zB
6030: 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  usy && len>0 ){.
6040: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
6050: 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  sy = Tcl_Alloc( 
6060: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
6070: 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a     strcpy(pDb->z
6080: 42 75 73 79 2c 20 7a 42 75 73 79 29 3b 0a 20 20  Busy, zBusy);.  
6090: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
60a0: 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20     pDb->zBusy = 
60b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
60c0: 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
60d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
60e0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
60f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6100: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44  _busy_handler(pD
6110: 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e  b->db, DbBusyHan
6120: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
6130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6140: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
6150: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30  ndler(pDb->db, 0
6160: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6170: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
6180: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62   }..  /*     $db
6190: 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20 2a   cache flush.  *
61a0: 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20  *     $db cache 
61b0: 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a  size n.  **.  **
61c0: 20 46 6c 75 73 68 20 74 68 65 20 70 72 65 70 61   Flush the prepa
61d0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61  red statement ca
61e0: 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68 65 20  che, or set the 
61f0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
6200: 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20 73 74  f.  ** cached st
6210: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
6220: 20 63 61 73 65 20 44 42 5f 43 41 43 48 45 3a 20   case DB_CACHE: 
6230: 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75 62 43  {.    char *subC
6240: 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a  md;.    int n;..
6250: 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20      if( objc<=2 
6260: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
6270: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6280: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68  , 1, objv, "cach
6290: 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29  e option ?arg?")
62a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
62b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
62c0: 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54 63 6c      subCmd = Tcl
62d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
62e0: 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b  j( objv[2], 0 );
62f0: 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43 6d 64  .    if( *subCmd
6300: 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d 70 28  =='f' && strcmp(
6310: 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d  subCmd,"flush")=
6320: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
6330: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
6340: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
6350: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
6360: 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20  bjv, "flush");. 
6370: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
6380: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
6390: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
63a0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44  ushStmtCache( pD
63b0: 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b );.      }.   
63c0: 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75 62 43   }else if( *subC
63d0: 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72 63 6d  md=='s' && strcm
63e0: 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65 22 29  p(subCmd,"size")
63f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
6400: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
6410: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
6420: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
6430: 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b  objv, "size n");
6440: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6450: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
6460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6470: 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54  if( TCL_ERROR==T
6480: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
6490: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
64a0: 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  , &n) ){.       
64b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
64c0: 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 63 61  ult( interp, "ca
64d0: 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22 22  nnot convert \""
64e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
64f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
6500: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30  romObj(objv[3],0
6510: 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67 65  ), "\" to intege
6520: 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r", 0);.        
6530: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6540: 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OR;.        }els
6550: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
6560: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   n<0 ){.        
6570: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
6580: 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20  he( pDb );.     
6590: 20 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20         n = 0;.  
65a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
65b0: 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45 44  ( n>MAX_PREPARED
65c0: 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20 20  _STMTS ){.      
65d0: 20 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52        n = MAX_PR
65e0: 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20  EPARED_STMTS;.  
65f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6600: 20 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74      pDb->maxStmt
6610: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = n;.        }.
6620: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6630: 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
6640: 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72  endResult( inter
6650: 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c  p, "bad option \
6660: 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 54  "", .          T
6670: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
6680: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 30 29 2c 20  Obj(objv[0],0), 
6690: 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75  "\": must be flu
66a0: 73 68 20 6f 72 20 73 69 7a 65 22 2c 20 30 29 3b  sh or size", 0);
66b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
66c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
66d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
66e0: 20 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e   /*     $db chan
66f0: 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
6700: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
6710: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
6720: 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
6730: 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
6740: 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73   by.  ** the mos
6750: 74 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c  t recent INSERT,
6760: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
6770: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74  E statement, not
6780: 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a   including .  **
6790: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
67a0: 65 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f  e by trigger pro
67b0: 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  grams..  */.  ca
67c0: 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b  se DB_CHANGES: {
67d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
67e0: 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f  esult;.    if( o
67f0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc!=2 ){.      
6800: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6810: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
6820: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
6830: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6840: 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74     }.    pResult
6850: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
6860: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
6870: 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70   Tcl_SetIntObj(p
6880: 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f  Result, sqlite3_
6890: 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29  changes(pDb->db)
68a0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
68b0: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
68c0: 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  lose.  **.  ** S
68d0: 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61  hutdown the data
68e0: 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65  base.  */.  case
68f0: 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20   DB_CLOSE: {.   
6900: 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61   Tcl_DeleteComma
6910: 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  nd(interp, Tcl_G
6920: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6930: 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20  objv[0], 0));.  
6940: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6950: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
6960: 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52  collate NAME SCR
6970: 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
6980: 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63  eate a new SQL c
6990: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
69a0: 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
69b0: 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68  Whenever.  ** th
69c0: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  at function is c
69d0: 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
69e0: 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
69f0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
6a00: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
6a10: 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c  LLATE: {.    Sql
6a20: 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74  Collate *pCollat
6a30: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  e;.    char *zNa
6a40: 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  me;.    char *zS
6a50: 63 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e  cript;.    int n
6a60: 53 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20  Script;.    if( 
6a70: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
6a80: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
6a90: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
6aa0: 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22  v, "NAME SCRIPT"
6ab0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6ac0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6ad0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
6ae0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6af0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
6b00: 20 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c     zScript = Tcl
6b10: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6b20: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72  j(objv[3], &nScr
6b30: 69 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  ipt);.    pColla
6b40: 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65  te = (SqlCollate
6b50: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
6b60: 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b  eof(*pCollate) +
6b70: 20 6e 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a   nScript + 1 );.
6b80: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65      if( pCollate
6b90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
6ba0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c  _ERROR;.    pCol
6bb0: 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69  late->interp = i
6bc0: 6e 74 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c  nterp;.    pColl
6bd0: 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  ate->pNext = pDb
6be0: 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ->pCollate;.    
6bf0: 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70  pCollate->zScrip
6c00: 74 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  t = (char*)&pCol
6c10: 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62  late[1];.    pDb
6c20: 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f  ->pCollate = pCo
6c30: 6c 6c 61 74 65 3b 0a 20 20 20 20 73 74 72 63 70  llate;.    strcp
6c40: 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72  y(pCollate->zScr
6c50: 69 70 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20  ipt, zScript);. 
6c60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
6c70: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
6c80: 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  pDb->db, zName, 
6c90: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
6ca0: 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20        pCollate, 
6cb0: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29  tclSqlCollate) )
6cc0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  {.      Tcl_SetR
6cd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
6ce0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
6cf0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
6d00: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
6d10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6d20: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6d30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6d40: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
6d50: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53  llation_needed S
6d60: 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
6d70: 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
6d80: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
6d90: 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
6da0: 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20    Whenever.  ** 
6db0: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
6dc0: 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
6dd0: 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
6de0: 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
6df0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
6e00: 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  COLLATION_NEEDED
6e10: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
6e20: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
6e30: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6e40: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
6e50: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
6e60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6e70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6e80: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
6e90: 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ded ){.      Tcl
6ea0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
6eb0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
6ec0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  d);.    }.    pD
6ed0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
6ee0: 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  d = Tcl_Duplicat
6ef0: 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  eObj(objv[2]);. 
6f00: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
6f10: 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
6f20: 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71  eNeeded);.    sq
6f30: 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
6f40: 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20  needed(pDb->db, 
6f50: 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e  pDb, tclCollateN
6f60: 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61  eeded);.    brea
6f70: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
6f80: 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20  $db commit_hook 
6f90: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
6fa0: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
6fb0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a  given callback j
6fc0: 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ust before commi
6fd0: 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20  tting every SQL 
6fe0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
6ff0: 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63  * If the callbac
7000: 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  k throws an exce
7010: 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73  ption or returns
7020: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
7030: 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  the.  ** transac
7040: 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e  tion is aborted.
7050: 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73    If CALLBACK is
7060: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
7070: 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20  , the callback. 
7080: 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e   ** is disabled.
7090: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
70a0: 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20  COMMIT_HOOK: {. 
70b0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
70c0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
70d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
70e0: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
70f0: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
7100: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7110: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
7120: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
7130: 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
7140: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
7150: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7160: 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  rp, pDb->zCommit
7170: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
7180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
7190: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20  har *zCommit;.  
71a0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
71b0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
71c0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54  mit ){.        T
71d0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f  cl_Free(pDb->zCo
71e0: 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  mmit);.      }. 
71f0: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54       zCommit = T
7200: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7210: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
7220: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43  n);.      if( zC
7230: 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29  ommit && len>0 )
7240: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
7250: 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c  Commit = Tcl_All
7260: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
7270: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44         strcpy(pD
7280: 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d  b->zCommit, zCom
7290: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mit);.      }els
72a0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
72b0: 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  zCommit = 0;.   
72c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
72d0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
72e0: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
72f0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
7300: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d       sqlite3_com
7310: 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  mit_hook(pDb->db
7320: 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65  , DbCommitHandle
7330: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
7340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
7350: 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
7360: 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  k(pDb->db, 0, 0)
7370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7380: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
7390: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70    /*    $db comp
73a0: 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20  lete SQL.  **.  
73b0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
73c0: 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c  f SQL is a compl
73d0: 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
73e0: 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  t.  Return FALSE
73f0: 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f   if.  ** additio
7400: 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70  nal lines of inp
7410: 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20  ut are needed.  
7420: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
7430: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c  to the.  ** buil
7440: 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c  t-in "info compl
7450: 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20  ete" command of 
7460: 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  Tcl..  */.  case
7470: 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a   DB_COMPLETE: {.
7480: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7490: 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20  MIT_COMPLETE.   
74a0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
74b0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d  t;.    int isCom
74c0: 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f  plete;.    if( o
74d0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
74e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
74f0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
7500: 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
7510: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f  ;.    }.    isCo
7530: 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33  mplete = sqlite3
7540: 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47  _complete( Tcl_G
7550: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
7560: 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20  objv[2], 0) );. 
7570: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
7580: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
7590: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
75a0: 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65  etBooleanObj(pRe
75b0: 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65  sult, isComplete
75c0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72  );.#endif.    br
75d0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
75e0: 20 20 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c    $db copy confl
75f0: 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61  ict-algorithm ta
7600: 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45  ble filename ?SE
7610: 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
7620: 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20  DICATOR?.  **.  
7630: 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74  ** Copy data int
7640: 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c  o table from fil
7650: 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c  ename, optionall
7660: 79 20 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f  y using SEPARATO
7670: 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e  R.  ** as column
7680: 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66   separators.  If
7690: 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69   a column contai
76a0: 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  ns a null string
76b0: 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61  , or the.  ** va
76c0: 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43  lue of NULLINDIC
76d0: 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20  ATOR, a NULL is 
76e0: 69 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68 65  inserted for the
76f0: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f   column..  ** co
7700: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
7710: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   is one of the s
7720: 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61  qlite conflict a
7730: 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20  lgorithms:.  ** 
7740: 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f     rollback, abo
7750: 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65  rt, fail, ignore
7760: 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f  , replace.  ** O
7770: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
7780: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7790: 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c  lines processed,
77a0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
77b0: 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64   same.  ** as 'd
77c0: 62 20 63 68 61 6e 67 65 73 27 20 64 75 65 20 74  b changes' due t
77d0: 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  o conflict-algor
77e0: 69 74 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20  ithm selected.. 
77f0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
7800: 64 65 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20  de is basically 
7810: 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
7820: 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66  n/enhancement of
7830: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
7840: 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f  3 shell.c ".impo
7850: 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a  rt" command..  *
7860: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
7870: 61 6e 64 20 75 73 61 67 65 20 69 73 20 65 71 75  and usage is equ
7880: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73  ivalent to the s
7890: 71 6c 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74  qlite2.x COPY st
78a0: 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68  atement,.  ** wh
78b0: 69 63 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65  ich imports file
78c0: 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62   data into a tab
78d0: 6c 65 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73  le using the Pos
78e0: 74 67 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c  tgreSQL COPY fil
78f0: 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20  e format:.  **  
7900: 20 24 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c   $db copy $confl
7910: 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e  it_algo $table_n
7920: 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74  ame $filename \t
7930: 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65   \\N.  */.  case
7940: 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20   DB_COPY: {.    
7950: 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20  char *zTable;   
7960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7970: 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
7980: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
7990: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20    char *zFile;  
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79b0: 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77   The file from w
79c0: 68 69 63 68 20 74 6f 20 65 78 74 72 61 63 74 20  hich to extract 
79d0: 64 61 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72  data */.    char
79e0: 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20   *zConflict;    
79f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
7a00: 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68  onflict algorith
7a10: 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  m to use */.    
7a20: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
7a30: 74 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  tmt;        /* A
7a40: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
7a50: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7a70: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
7a80: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
7ab0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
7ac0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  e */.    int nBy
7ad0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
7ae0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7af0: 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51  f bytes in an SQ
7b00: 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  L string */.    
7b10: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7b30: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
7b40: 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20      int nSep;   
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
7b70: 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a  es in zSep[] */.
7b80: 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20      int nNull;  
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
7bb0: 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f  es in zNull[] */
7bc0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65   /* An SQL state
7bf0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  ment */.    char
7c00: 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20   *zLine;        
7c10: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
7c20: 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75  gle line of inpu
7c30: 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  t from the file 
7c40: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a  */.    char **az
7c50: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
7c60: 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72     /* zLine[] br
7c70: 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c  oken up into col
7c80: 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72  umns */.    char
7c90: 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20   *zCommit;      
7ca0: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
7cb0: 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73  o commit changes
7cc0: 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e   */.    FILE *in
7cd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ce0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74      /* The input
7cf0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
7d00: 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20   lineno = 0;    
7d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
7d20: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   number of input
7d30: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61   file */.    cha
7d40: 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20  r zLineNum[80]; 
7d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
7d60: 20 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75   number print bu
7d70: 66 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ffer */.    Tcl_
7d80: 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20  Obj *pResult;   
7d90: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72          /* inter
7da0: 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20  p result */..   
7db0: 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20   char *zSep;.   
7dc0: 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20   char *zNull;.  
7dd0: 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20    if( objc<5 || 
7de0: 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20  objc>7 ){.      
7df0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
7e00: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
7e10: 2c 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e  , .         "CON
7e20: 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20  FLICT-ALGORITHM 
7e30: 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f  TABLE FILENAME ?
7e40: 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c  SEPARATOR? ?NULL
7e50: 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20  INDICATOR?");.  
7e60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7e70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7e80: 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20  if( objc>=6 ){. 
7e90: 20 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f       zSep = Tcl_
7ea0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
7eb0: 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20  (objv[5], 0);.  
7ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
7ed0: 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20  Sep = "\t";.    
7ee0: 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d  }.    if( objc>=
7ef0: 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  7 ){.      zNull
7f00: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7f10: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c  FromObj(objv[6],
7f20: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
7f30: 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22        zNull = ""
7f40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e  ;.    }.    zCon
7f50: 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53  flict = Tcl_GetS
7f60: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
7f70: 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54  v[2], 0);.    zT
7f80: 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  able = Tcl_GetSt
7f90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
7fa0: 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69  [3], 0);.    zFi
7fb0: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
7fc0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34  ngFromObj(objv[4
7fd0: 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20  ], 0);.    nSep 
7fe0: 3d 20 73 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a  = strlen(zSep);.
7ff0: 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c      nNull = strl
8000: 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69  en(zNull);.    i
8010: 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
8020: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8030: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
8040: 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65  ror: non-null se
8050: 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64  parator required
8060: 20 66 6f 72 20 63 6f 70 79 22 2c 20 30 29 3b 0a   for copy", 0);.
8070: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8080: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8090: 20 20 69 66 28 73 71 6c 69 74 65 33 53 74 72 49    if(sqlite3StrI
80a0: 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  Cmp(zConflict, "
80b0: 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20  rollback") != 0 
80c0: 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  &&.       sqlite
80d0: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
80e0: 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20  ct, "abort"   ) 
80f0: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
8100: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
8110: 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20  onflict, "fail" 
8120: 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
8130: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
8140: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69  mp(zConflict, "i
8150: 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26  gnore"  ) != 0 &
8160: 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  &.       sqlite3
8170: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
8180: 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20 21  t, "replace" ) !
8190: 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  = 0 ) {.      Tc
81a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
81b0: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c  nterp, "Error: \
81c0: 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a  "", zConflict, .
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
81e0: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
81f0: 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  thm must be one 
8200: 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a  of: rollback, ".
8210: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 62 6f              "abo
8220: 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65  rt, fail, ignore
8230: 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30  , or replace", 0
8240: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8260: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
8270: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
8280: 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22  ECT * FROM '%q'"
8290: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
82a0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
82b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
82c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
82d0: 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62  ror: no such tab
82e0: 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30  le: ", zTable, 0
82f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8300: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8310: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72  .    nByte = str
8320: 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72  len(zSql);.    r
8330: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
8340: 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71  are(pDb->db, zSq
8350: 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29  l, 0, &pStmt, 0)
8360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
8370: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
8380: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
8390: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
83a0: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22  nterp, "Error: "
83b0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
83c0: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
83d0: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20       nCol = 0;. 
83e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
83f0: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
8400: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
8410: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
8420: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
8430: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
8440: 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
8450: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8460: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
8470: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  l = malloc( nByt
8480: 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20  e + 50 + nCol*2 
8490: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
84a0: 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
84b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
84c0: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
84d0: 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30  n't malloc()", 0
84e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
84f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8500: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
8510: 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20  rintf(nByte+50, 
8520: 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52  zSql, "INSERT OR
8530: 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41   %q INTO '%q' VA
8540: 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20  LUES(?",.       
8550: 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61    zConflict, zTa
8560: 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
8570: 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20  rlen(zSql);.    
8580: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
8590: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
85a0: 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
85b0: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
85c0: 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
85d0: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
85e0: 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
85f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8600: 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
8610: 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74  b, zSql, 0, &pSt
8620: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  mt, 0);.    free
8630: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
8640: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
8650: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8660: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
8670: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
8680: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
8690: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
86a0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
86b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
86c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e  OR;.    }.    in
86d0: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
86e0: 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69  "rb");.    if( i
86f0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  n==0 ){.      Tc
8700: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8710: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
8720: 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
8730: 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29   ", zFile, NULL)
8740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8750: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
8760: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8770: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8780: 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f     azCol = mallo
8790: 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b  c( sizeof(azCol[
87a0: 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a  0])*(nCol+1) );.
87b0: 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30      if( azCol==0
87c0: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
87d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
87e0: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
87f0: 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b  t malloc()", 0);
8800: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8810: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8820: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
8830: 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22  pDb->db, "BEGIN"
8840: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
8850: 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49  zCommit = "COMMI
8860: 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  T";.    while( (
8870: 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65  zLine = local_ge
8880: 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30  tline(0, in))!=0
8890: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
88a0: 7a 3b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a  z;.      i = 0;.
88b0: 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
88c0: 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d        azCol[0] =
88d0: 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f   zLine;.      fo
88e0: 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20  r(i=0, z=zLine; 
88f0: 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20  *z; z++){.      
8900: 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30    if( *z==zSep[0
8910: 5d 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20  ] && strncmp(z, 
8920: 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29  zSep, nSep)==0 )
8930: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d  {.          *z =
8940: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   0;.          i+
8950: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  +;.          if(
8960: 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20   i<nCol ){.     
8970: 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20         azCol[i] 
8980: 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20  = &z[nSep];.    
8990: 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65          z += nSe
89a0: 70 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  p-1;.          }
89b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
89c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31   }.      if( i+1
89d0: 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  !=nCol ){.      
89e0: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
89f0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c        zErr = mal
8a00: 6c 6f 63 28 32 30 30 20 2b 20 73 74 72 6c 65 6e  loc(200 + strlen
8a10: 28 7a 46 69 6c 65 29 29 3b 0a 20 20 20 20 20 20  (zFile));.      
8a20: 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72 2c 22    sprintf(zErr,"
8a30: 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25  Error: %s line %
8a40: 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
8a50: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62  olumns of data b
8a60: 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20  ut found %d",.  
8a70: 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20           zFile, 
8a80: 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b  lineno, nCol, i+
8a90: 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  1);.        Tcl_
8aa0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8ab0: 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20  erp, zErr, 0);. 
8ac0: 20 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72         free(zErr
8ad0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d  );.        zComm
8ae0: 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  it = "ROLLBACK";
8af0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
8b10: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
8b20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
8b30: 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64  check for null d
8b40: 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64  ata, if so, bind
8b50: 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   as null */.    
8b60: 20 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e 30      if ((nNull>0
8b70: 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c   && strcmp(azCol
8b80: 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20  [i], zNull)==0) 
8b90: 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b  || strlen(azCol[
8ba0: 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20  i])==0) {.      
8bb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
8bc0: 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31  _null(pStmt, i+1
8bd0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
8be0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8bf0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
8c00: 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b  tmt, i+1, azCol[
8c10: 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  i], -1, SQLITE_S
8c20: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
8c30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8c40: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
8c50: 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
8c60: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
8c70: 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65  tmt);.      free
8c80: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69  (zLine);.      i
8c90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8ca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
8cb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8cc0: 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73  erp,"Error: ", s
8cd0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
8ce0: 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
8cf0: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52      zCommit = "R
8d00: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
8d10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8d20: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
8d30: 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f  azCol);.    fclo
8d40: 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se(in);.    sqli
8d50: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
8d60: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
8d70: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
8d80: 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29  Commit, 0, 0, 0)
8d90: 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  ;..    if( zComm
8da0: 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a  it[0] == 'C' ){.
8db0: 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73        /* success
8dc0: 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20  , set result as 
8dd0: 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
8de0: 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
8df0: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
8e00: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
8e10: 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c  terp);.      Tcl
8e20: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
8e30: 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  lt, lineno);.   
8e40: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
8e50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8e60: 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70   /* failure, app
8e70: 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65  end lineno where
8e80: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
8e90: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 4e 75   sprintf(zLineNu
8ea0: 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a  m,"%d",lineno);.
8eb0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
8ec0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c  Result(interp,",
8ed0: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72   failed while pr
8ee0: 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22  ocessing line: "
8ef0: 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20  ,zLineNum,0);.  
8f00: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
8f10: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
8f20: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
8f30: 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72   **    $db error
8f40: 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  code.  **.  ** R
8f50: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69  eturn the numeri
8f60: 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  c error code tha
8f70: 74 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62  t was returned b
8f80: 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
8f90: 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  t.  ** call to s
8fa0: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20  qlite3_exec().. 
8fb0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52   */.  case DB_ER
8fc0: 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54  RORCODE: {.    T
8fd0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
8fe0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
8ff0: 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ntObj(sqlite3_er
9000: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29  rcode(pDb->db)))
9010: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
9020: 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  .   .  /*.  **  
9030: 20 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20    $db eval $sql 
9040: 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63  ?array? ?{  ...c
9050: 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20  ode... }?.  **  
9060: 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20    $db onecolumn 
9070: 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  $sql.  **.  ** T
9080: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
9090: 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c   in $sql is eval
90a0: 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68  uated.  For each
90b0: 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73   row, the values
90c0: 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64   are.  ** placed
90d0: 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   in elements of 
90e0: 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20  the array named 
90f0: 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63  "array" and ...c
9100: 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74  ode... is execut
9110: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
9120: 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61  ay" and "code" a
9130: 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e  re omitted, then
9140: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20   no callback is 
9150: 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20  every invoked.. 
9160: 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69   ** If "array" i
9170: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
9180: 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  g, then the valu
9190: 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e  es are placed in
91a0: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
91b0: 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61  that have the sa
91c0: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66  me name as the f
91d0: 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20  ields extracted 
91e0: 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  by the query..  
91f0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63  **.  ** The onec
9200: 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20  olumn method is 
9210: 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
9220: 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64  f:.  **     lind
9230: 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71  ex [$db eval $sq
9240: 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65  l] 0.  */.  case
9250: 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20   DB_ONECOLUMN:. 
9260: 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20   case DB_EVAL:. 
9270: 20 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a   case DB_EXISTS:
9280: 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73   {.    char cons
9290: 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a  t *zSql;      /*
92a0: 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   Next SQL statem
92b0: 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a  ent to execute *
92c0: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
92d0: 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *zLeft;     /* 
92e0: 57 68 61 74 20 69 73 20 6c 65 66 74 20 61 66 74  What is left aft
92f0: 65 72 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e  er first stmt in
9300: 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c   zSql */.    sql
9310: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
9320: 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20  ;   /* Compiled 
9330: 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a  SQL statment */.
9340: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72      Tcl_Obj *pAr
9350: 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ray;       /* Na
9360: 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f  me of array into
9370: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61   which results a
9380: 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  re written */.  
9390: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
93a0: 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69  pt;      /* Scri
93b0: 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61  pt to run for ea
93c0: 63 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ch result set */
93d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
93e0: 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50  pParm;      /* P
93f0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e  arameters that n
9400: 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65  eed a Tcl_DecrRe
9410: 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20  fCount() */.    
9420: 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20  int nParm;      
9430: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9440: 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65 64   of entries used
9450: 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a   in apParm[] */.
9460: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61      Tcl_Obj *aPa
9470: 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74  rm[10];    /* St
9480: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
9490: 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63  pParm[] in the c
94a0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
94b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
94c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
94d0: 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
94e0: 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61   */.    SqlPrepa
94f0: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
9500: 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  t;  /* Pointer t
9510: 6f 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  o a prepared sta
9520: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
9530: 74 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20  t rc2;..    if( 
9540: 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20  choice==DB_EVAL 
9550: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
9560: 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b  c<3 || objc>5 ){
9570: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
9580: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
9590: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20  , 2, objv, "SQL 
95a0: 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43  ?ARRAY-NAME? ?SC
95b0: 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20  RIPT?");.       
95c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
95d0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
95e0: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
95f0: 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  bj();.      Tcl_
9600: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
9610: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
9620: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
9630: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
9640: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9650: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
9660: 51 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  QL");.        re
9670: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
9690: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
96a0: 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49  ( choice==DB_EXI
96b0: 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 54  STS ){.        T
96c0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
96d0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
96e0: 6f 6f 6c 65 61 6e 4f 62 6a 28 30 29 29 3b 0a 20  ooleanObj(0));. 
96f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9700: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
9710: 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 70        pArray = p
9720: 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20  Script = 0;.    
9730: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
9740: 34 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61  4 ){.      pArra
9750: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63  y = 0;.      pSc
9760: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  ript = objv[3];.
9770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9780: 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33   pArray = objv[3
9790: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  ];.      if( Tcl
97a0: 5f 47 65 74 53 74 72 69 6e 67 28 70 41 72 72 61  _GetString(pArra
97b0: 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72 61  y)[0]==0 ) pArra
97c0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63  y = 0;.      pSc
97d0: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a  ript = objv[4];.
97e0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49      }..    Tcl_I
97f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ncrRefCount(objv
9800: 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  [2]);.    zSql =
9810: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9820: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
9830: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  );.    while( rc
9840: 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c  ==TCL_OK && zSql
9850: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
9860: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
9870: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
9880: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
9890: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
98b0: 75 6d 62 65 72 20 6f 66 20 62 69 6e 64 20 70 61  umber of bind pa
98c0: 72 61 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20  rameters in the 
98d0: 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69  pStmt */.      i
98e0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
98f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9900: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9910: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
9920: 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62   */.      Tcl_Ob
9930: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
9940: 30 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  0;   /* Array of
9950: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
9960: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20  .      int len; 
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67    /* String leng
9990: 74 68 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20  th of zSql */.  
99a0: 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  .      /* Try to
99b0: 20 66 69 6e 64 20 61 20 53 51 4c 20 73 74 61 74   find a SQL stat
99c0: 65 6d 65 6e 74 20 74 68 61 74 20 68 61 73 20 61  ement that has a
99d0: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70  lready been comp
99e0: 69 6c 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a  iled and.      *
99f0: 2a 20 77 68 69 63 68 20 6d 61 74 63 68 65 73 20  * which matches 
9a00: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 63  the next sequenc
9a10: 65 20 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20 20  e of SQL..      
9a20: 2a 2f 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d  */.      pStmt =
9a30: 20 30 3b 0a 20 20 20 20 20 20 70 50 72 65 53 74   0;.      pPreSt
9a40: 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
9a50: 73 74 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20  st;.      len = 
9a60: 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20  strlen(zSql);.  
9a70: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
9a80: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 78 70 69   && sqlite3_expi
9a90: 72 65 64 28 70 50 72 65 53 74 6d 74 2d 3e 70 53  red(pPreStmt->pS
9aa0: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tmt) ){.        
9ab0: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 70  flushStmtCache(p
9ac0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  Db);.        pPr
9ad0: 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  eStmt = 0;.     
9ae0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 70   }.      for(; p
9af0: 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d  PreStmt; pPreStm
9b00: 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  t=pPreStmt->pNex
9b10: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
9b20: 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  n = pPreStmt->nS
9b30: 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ql;.        if( 
9b40: 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20  len>=n .        
9b50: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50      && memcmp(pP
9b60: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53  reStmt->zSql, zS
9b70: 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20  ql, n)==0.      
9b80: 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e        && (zSql[n
9b90: 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31  ]==0 || zSql[n-1
9ba0: 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20  ]==';').        
9bb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 74  ){.          pSt
9bc0: 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  mt = pPreStmt->p
9bd0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
9be0: 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50  zLeft = &zSql[pP
9bf0: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a  reStmt->nSql];..
9c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
9c10: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
9c20: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
9c30: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
9c40: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
9c50: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74   cache list.  It
9c60: 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61   will later be a
9c70: 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  dded back to the
9c80: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
9c90: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63       ** of the c
9ca0: 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64  ache list in ord
9cb0: 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
9cc0: 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e  LRU replacement.
9cd0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
9ce0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
9cf0: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
9d00: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53             pPreS
9d10: 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  tmt->pPrev->pNex
9d20: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
9d30: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
9d40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9d50: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
9d60: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
9d70: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
9d80: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
9d90: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a  eStmt->pNext ){.
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65              pPre
9db0: 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Stmt->pNext->pPr
9dc0: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  ev = pPreStmt->p
9dd0: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
9de0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9df0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
9e00: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
9e10: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ev;.          }.
9e20: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
9e30: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
9e40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
9e50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20   }.      }.  .  
9e60: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65      /* If no pre
9e70: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
9e80: 77 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70  was found.  Comp
9e90: 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78 74  ile the SQL text
9ea0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9eb0: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
9ec0: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
9ed0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70  TE_OK!=sqlite3_p
9ee0: 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20  repare(pDb->db, 
9ef0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
9f00: 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20  , &zLeft) ){.   
9f10: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
9f20: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
9f30: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
9f40: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
9f50: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  db)));.         
9f60: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
9f70: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
9f80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9f90: 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30      if( pStmt==0
9fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
9fb0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
9fc0: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
9fd0: 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20  ->db) ){.       
9fe0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c       /* A compil
9ff0: 65 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20  e-time error in 
a000: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  the statement.  
a010: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
a020: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74           Tcl_Set
a030: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
a040: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
a050: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
a060: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20  ->db)));.       
a070: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
a080: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
a090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a0a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
a0c0: 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f  ement was a no-o
a0d0: 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  p.  Continue to 
a0e0: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
a0f0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  nt.            *
a100: 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72  * in the SQL str
a110: 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ing..           
a120: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
a130: 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  zSql = zLeft;.  
a140: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
a150: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
a160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a170: 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74    assert( pPreSt
a180: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  mt==0 );.      }
a190: 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20  ..      /* Bind 
a1a0: 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65  values to parame
a1b0: 74 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20  ters that begin 
a1c0: 77 69 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20  with $ or :.    
a1d0: 20 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61    */  .      nVa
a1e0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
a1f0: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
a200: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e  (pStmt);.      n
a210: 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Parm = 0;.      
a220: 69 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28  if( nVar>sizeof(
a230: 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50  aParm)/sizeof(aP
a240: 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  arm[0]) ){.     
a250: 20 20 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c     apParm = (Tcl
a260: 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63  _Obj**)Tcl_Alloc
a270: 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50  (nVar*sizeof(apP
a280: 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  arm[0]));.      
a290: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
a2a0: 70 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20  pParm = aParm;. 
a2b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
a2c0: 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69  (i=1; i<=nVar; i
a2d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
a2e0: 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20  st char *zVar = 
a2f0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
a300: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d  ameter_name(pStm
a310: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
a320: 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a  f( zVar!=0 && (z
a330: 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a  Var[0]=='$' || z
a340: 56 61 72 5b 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a  Var[0]==':') ){.
a350: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
a360: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
a370: 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20  tVar2Ex(interp, 
a380: 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b  &zVar[1], 0, 0);
a390: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
a3a0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Var ){.         
a3b0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
a3c0: 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a        u8 *data;.
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
a3e0: 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e   *zType = pVar->
a3f0: 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e  typePtr ? pVar->
a400: 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20  typePtr->name : 
a410: 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "";.            
a420: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
a430: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
a440: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
a450: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
a460: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
a470: 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20  r->bytes==0 ){. 
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a490: 4f 6e 6c 79 20 6c 6f 61 64 20 61 20 42 4c 4f 42  Only load a BLOB
a4a0: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
a4b0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
a4c0: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
a4d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
a4e0: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
a4f0: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  esentation. */. 
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
a510: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
a520: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72  rrayFromObj(pVar
a530: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
a540: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
a550: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c  d_blob(pStmt, i,
a560: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
a570: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
a580: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
a590: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
a5b0: 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[nParm++] = 
a5c0: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20  pVar;.          
a5d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
a5e0: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
a5f0: 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d  ype,"boolean")==
a600: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
a610: 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20          (c=='i' 
a620: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
a630: 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20  "int")==0) ){.  
a640: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
a650: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
a660: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b  terp, pVar, &n);
a670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
a680: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
a690: 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20  pStmt, i, n);.  
a6a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
a6b0: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
a6c0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
a6d0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
a6e0: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
a6f0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
a700: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
a710: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
a720: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20  ar, &r);.       
a730: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
a740: 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  ind_double(pStmt
a750: 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  , i, r);.       
a760: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
a770: 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28  =='w' && strcmp(
a780: 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29  zType,"wideInt")
a790: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a7a0: 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74       Tcl_WideInt
a7b0: 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   v;.            
a7c0: 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74    Tcl_GetWideInt
a7d0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
a7e0: 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  pVar, &v);.     
a7f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a800: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
a810: 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20  t, i, v);.      
a820: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a830: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
a840: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
a850: 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
a860: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
a870: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a880: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
a890: 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68  xt(pStmt, i, (ch
a8a0: 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51  ar *)data, n, SQ
a8b0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
a8d0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
a8e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
a8f0: 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b    apParm[nParm++
a900: 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20  ] = pVar;.      
a910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a920: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a930: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
a940: 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69  d_null( pStmt, i
a950: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
a960: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a970: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  }..      /* Comp
a980: 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ute column names
a990: 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d   */.      nCol =
a9a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a9b0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
a9c0: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
a9d0: 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f 6c  ){.        apCol
a9e0: 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a  Name = (Tcl_Obj*
a9f0: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
aa00: 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43  eof(Tcl_Obj*)*nC
aa10: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ol );.        if
aa20: 28 20 61 70 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  ( apColName==0 )
aa30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
aa40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
aa50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
aa60: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20   apColName[i] = 
aa70: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
aa80: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
aa90: 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20  pStmt,i));.     
aaa0: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
aab0: 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b  Count(apColName[
aac0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
aad0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
aae0: 20 49 66 20 72 65 73 75 6c 74 73 20 61 72 65 20   If results are 
aaf0: 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20  being stored in 
ab00: 61 6e 20 61 72 72 61 79 20 76 61 72 69 61 62 6c  an array variabl
ab10: 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20  e, then create. 
ab20: 20 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61       ** the arra
ab30: 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74  y(*) entry for t
ab40: 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 20 20  hat array.      
ab50: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
ab60: 72 61 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ray ){.        T
ab70: 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74  cl_Obj *pColList
ab80: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
ab90: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
aba0: 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65   *pStar = Tcl_Ne
abb0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20  wStringObj("*", 
abc0: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  -1);.        Tcl
abd0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
abe0: 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  olList);.       
abf0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
ac00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
ac10: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
ac20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
ac30: 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43  p, pColList, apC
ac40: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
ac50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63      }.        Tc
ac60: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
ac70: 65 72 70 2c 20 70 41 72 72 61 79 2c 20 70 53 74  erp, pArray, pSt
ac80: 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 30 29 3b  ar, pColList,0);
ac90: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
aca0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69  rRefCount(pColLi
acb0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  st);.        Tcl
acc0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
acd0: 74 61 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  tar);.      }.. 
ace0: 20 20 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20       /* Execute 
acf0: 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f  the SQL.      */
ad00: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63  .      while( rc
ad10: 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d  ==TCL_OK && pStm
ad20: 74 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  t && SQLITE_ROW=
ad30: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
ad40: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tmt) ){.        
ad50: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
ad60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
ad70: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
ad80: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
ad90: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
ada0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
adb0: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
adc0: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
add0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71        switch( sq
ade0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
adf0: 65 28 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20  e(pStmt, i) ){. 
ae00: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
ae10: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
ae30: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
ae40: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
ae50: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
ae60: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
ae70: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
ae80: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
ae90: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 2c  _blob(pStmt, i),
aea0: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
aeb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
aec0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
aed0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
aee0: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
af00: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
af10: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
af20: 36 34 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  64(pStmt, i);.  
af30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
af40: 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26  v>=-2147483647 &
af50: 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20  & v<=2147483647 
af60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
af70: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
af80: 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  wIntObj(v);.    
af90: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
afa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
afb0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57   pVal = Tcl_NewW
afc0: 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  ideIntObj(v);.  
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
aff0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
b000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
b010: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
b020: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b030: 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74  double r = sqlit
b040: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
b050: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
b060: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
b070: 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62   Tcl_NewDoubleOb
b080: 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(r);.          
b090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b0a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b0b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b0c0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20  _NULL: {.       
b0d0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62         pVal = db
b0e0: 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a  TextToObj(pDb->z
b0f0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Null);.         
b100: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b110: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b120: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
b130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b140: 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62  Val = dbTextToOb
b150: 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  j((char *)sqlite
b160: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
b170: 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20  tmt, i));.      
b180: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b190: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b1a0: 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
b1b0: 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70        if( pScrip
b1c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
b1d0: 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29   if( pArray==0 )
b1e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b1f0: 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
b200: 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65  nterp, apColName
b210: 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29  [i], 0, pVal, 0)
b220: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
b230: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
b240: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
b250: 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79  2(interp, pArray
b260: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
b270: 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pVal, 0);.      
b280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b290: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69    }else if( choi
b2a0: 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ce==DB_ONECOLUMN
b2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b2c0: 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20  assert( pRet==0 
b2d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
b2e0: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74              pRet
b300: 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20 20 20   = pVal;.       
b310: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
b320: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
b330: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b340: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
b350: 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20  L_BREAK;.       
b360: 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20       i = nCol;. 
b370: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
b380: 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58  f( choice==DB_EX
b390: 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ISTS ){.        
b3a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74      assert( pRet
b3b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
b3c0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
b3d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
b3e0: 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29  NewBooleanObj(1)
b3f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
b400: 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20  c = TCL_BREAK;. 
b410: 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e             i = n
b420: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Col;.          }
b430: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b440: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b450: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
b460: 70 2c 20 70 52 65 74 2c 20 70 56 61 6c 29 3b 0a  p, pRet, pVal);.
b470: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b480: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
b490: 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a   if( pScript ){.
b4a0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
b4b0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
b4c0: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
b4d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
b4e0: 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45  rc==TCL_CONTINUE
b4f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b500: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
b510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b520: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
b530: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
b540: 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  AK ){.        rc
b550: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20   = TCL_OK;.     
b560: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   }..      /* Fre
b570: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
b580: 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20  e objects */.   
b590: 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29     if( pScript )
b5a0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
b5b0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
b5c0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44  .          Tcl_D
b5d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f  ecrRefCount(apCo
b5e0: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
b5f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c     }.        Tcl
b600: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70 43  _Free((char*)apC
b610: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  olName);.      }
b620: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  ..      /* Free 
b630: 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67  the bound string
b640: 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65   and blob parame
b650: 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f  ters */.      fo
b660: 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b 20  r(i=0; i<nParm; 
b670: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63  i++){.        Tc
b680: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61  l_DecrRefCount(a
b690: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20 20  pParm[i]);.     
b6a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70 50   }.      if( apP
b6b0: 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20 20  arm!=aParm ){.  
b6c0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
b6d0: 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a 20  char*)apParm);. 
b6e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
b6f0: 20 52 65 73 65 74 20 74 68 65 20 73 74 61 74 65   Reset the state
b700: 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72 65  ment.  If the re
b710: 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53 51 4c  sult code is SQL
b720: 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68 65 6e  ITE_SCHEMA, then
b730: 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
b740: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61  the statement ca
b750: 63 68 65 20 61 6e 64 20 74 72 79 20 74 68 65 20  che and try the 
b760: 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 2e  statement again.
b770: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b780: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
b790: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
b7a0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 53 43 48    if( SQLITE_SCH
b7b0: 45 4d 41 3d 3d 72 63 32 20 29 7b 0a 20 20 20 20  EMA==rc2 ){.    
b7c0: 20 20 20 20 2f 2a 20 41 66 74 65 72 20 61 20 73      /* After a s
b7d0: 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 66 6c  chema change, fl
b7e0: 75 73 68 20 74 68 65 20 63 61 63 68 65 20 61 6e  ush the cache an
b7f0: 64 20 74 72 79 20 74 6f 20 72 75 6e 20 74 68 65  d try to run the
b800: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74  .        ** stat
b810: 65 6d 65 6e 74 20 61 67 61 69 6e 0a 20 20 20 20  ement again.    
b820: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
b830: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
b840: 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Db );.        sq
b850: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
b860: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Stmt);.        i
b870: 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63  f( pPreStmt ) Tc
b880: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50  l_Free((char*)pP
b890: 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  reStmt);.       
b8a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b8b0: 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
b8c0: 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20 20  E_OK!=rc2 ){.   
b8d0: 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75 6e       /* If a run
b8e0: 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63 75  -time error occu
b8f0: 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65  rs, report the e
b900: 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72 65  rror and stop re
b910: 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  ading.        **
b920: 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20 20   the SQL.       
b930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   */.        Tcl_
b940: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b950: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
b960: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
b970: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
b980: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
b990: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
b9a0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
b9b0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ROR;.        if(
b9c0: 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f   pPreStmt ) Tcl_
b9d0: 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65  Free((char*)pPre
b9e0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Stmt);.        b
b9f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
ba00: 65 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74  e if( pDb->maxSt
ba10: 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt<=0 ){.       
ba20: 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
ba30: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20   is turned off, 
ba40: 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20  deallocated the 
ba50: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
ba60: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
ba70: 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68  t ) Tcl_Free((ch
ba80: 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20  ar*)pPreStmt);. 
ba90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
baa0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
bab0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bac0: 20 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68 69       /* Everythi
bad0: 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74 68  ng worked and th
bae0: 65 20 63 61 63 68 65 20 69 73 20 6f 70 65 72 61  e cache is opera
baf0: 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20 20  tional..        
bb00: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
bb10: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
bb20: 73 74 72 75 63 74 75 72 65 20 69 66 20 77 65 20  structure if we 
bb30: 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20 20  need one..      
bb40: 20 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72 65    ** (If we alre
bb50: 61 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65 20  ady have one we 
bb60: 63 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20 69  can just reuse i
bb70: 74 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  t.).        */. 
bb80: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
bb90: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt==0 ){.      
bba0: 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74 20      len = zLeft 
bbb0: 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  - zSql;.        
bbc0: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71    pPreStmt = (Sq
bbd0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54  lPreparedStmt*)T
bbe0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
bbf0: 28 2a 70 50 72 65 53 74 6d 74 29 20 2b 20 6c 65  (*pPreStmt) + le
bc00: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  n );.          i
bc10: 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  f( pPreStmt==0 )
bc20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bc30: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  R;.          pPr
bc40: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70  eStmt->pStmt = p
bc50: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
bc60: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d  pPreStmt->nSql =
bc70: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   len;.          
bc80: 6d 65 6d 63 70 79 28 70 50 72 65 53 74 6d 74 2d  memcpy(pPreStmt-
bc90: 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e  >zSql, zSql, len
bca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  );.          pPr
bcb0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65 6e 5d  eStmt->zSql[len]
bcc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
bcd0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  .        /* Add 
bce0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
bcf0: 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65  tement to the be
bd00: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
bd10: 61 63 68 65 20 6c 69 73 74 0a 20 20 20 20 20 20  ache list.      
bd20: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 72    */.        pPr
bd30: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70  eStmt->pNext = p
bd40: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20  Db->stmtList;.  
bd50: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
bd60: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
bd70: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
bd80: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
bd90: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e   pDb->stmtList->
bda0: 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74  pPrev = pPreStmt
bdb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bdc0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
bdd0: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
bde0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73        if( pDb->s
bdf0: 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20  tmtLast==0 ){.  
be00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
be10: 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b  pDb->nStmt==0 );
be20: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
be30: 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53  stmtLast = pPreS
be40: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  tmt;.        }el
be50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
be60: 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74  sert( pDb->nStmt
be70: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  >0 );.        }.
be80: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74          pDb->nSt
be90: 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20 20  mt++;.   .      
bea0: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
beb0: 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d 65  too many stateme
bec0: 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65 6d  nt in cache, rem
bed0: 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73 20  ove the surplus 
bee0: 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20  from the.       
bef0: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 63   ** end of the c
bf00: 61 63 68 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  ache list..     
bf10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68     */.        wh
bf20: 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e  ile( pDb->nStmt>
bf30: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a  pDb->maxStmt ){.
bf40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bf50: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e  3_finalize(pDb->
bf60: 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29  stmtLast->pStmt)
bf70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
bf80: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d  >stmtLast = pDb-
bf90: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76  >stmtLast->pPrev
bfa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
bfb0: 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 2d  Free((char*)pDb-
bfc0: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74  >stmtLast->pNext
bfd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
bfe0: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78  ->stmtLast->pNex
bff0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
c000: 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20   pDb->nStmt--;. 
c010: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c020: 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65  ..      /* Proce
c030: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
c040: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
c050: 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a    zSql = zLeft;.
c060: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
c070: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b  crRefCount(objv[
c080: 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 52  2]);..    if( pR
c090: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  et ){.      if( 
c0a0: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
c0b0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
c0c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
c0d0: 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ret);.      }.  
c0e0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
c0f0: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
c100: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
c110: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
c120: 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d  $db function NAM
c130: 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
c140: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
c150: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  SQL function cal
c160: 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65  led NAME.  Whene
c170: 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f  ver that functio
c180: 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64  n is.  ** called
c190: 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20  , invoke SCRIPT 
c1a0: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
c1b0: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
c1c0: 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f   case DB_FUNCTIO
c1d0: 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63  N: {.    SqlFunc
c1e0: 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c   *pFunc;.    Tcl
c1f0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
c200: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
c210: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
c220: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
c230: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
c240: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45  , 2, objv, "NAME
c250: 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
c260: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c270: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  R;.    }.    zNa
c280: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
c290: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
c2a0: 5d 2c 20 30 29 3b 0a 20 20 20 20 70 53 63 72 69  ], 0);.    pScri
c2b0: 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
c2c0: 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71    pFunc = findSq
c2d0: 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65  lFunc(pDb, zName
c2e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
c2f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
c300: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20  _ERROR;.    if( 
c310: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29  pFunc->pScript )
c320: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  {.      Tcl_Decr
c330: 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
c340: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a  pScript);.    }.
c350: 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69      pFunc->pScri
c360: 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20  pt = pScript;.  
c370: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c380: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20  nt(pScript);.   
c390: 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f   pFunc->useEvalO
c3a0: 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45  bjv = safeToUseE
c3b0: 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20  valObjv(interp, 
c3c0: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63  pScript);.    rc
c3d0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
c3e0: 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e  e_function(pDb->
c3f0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  db, zName, -1, S
c400: 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20  QLITE_UTF8,.    
c410: 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71      pFunc, tclSq
c420: 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  lFunc, 0, 0);.  
c430: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c440: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
c450: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
c460: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
c470: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
c480: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
c490: 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
c4a0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65 6c  LATILE);.    }el
c4b0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75 73  se{.      /* Mus
c4c0: 74 20 66 6c 75 73 68 20 61 6e 79 20 63 61 63 68  t flush any cach
c4d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  ed statements */
c4e0: 0a 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74  .      flushStmt
c4f0: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
c500: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
c510: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
c520: 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20    $db nullvalue 
c530: 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20  ?STRING?.  **.  
c540: 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20 75  ** Change text u
c550: 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20  sed when a NULL 
c560: 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  comes back from 
c570: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
c580: 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69   ?STRING?.  ** i
c590: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
c5a0: 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
c5b0: 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20  string used for 
c5c0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
c5d0: 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47  ..  ** If STRING
c5e0: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
c5f0: 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74 75  n STRING is retu
c600: 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a  rned..  **.  */.
c610: 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41    case DB_NULLVA
c620: 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  LUE: {.    if( o
c630: 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
c640: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
c650: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
c660: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55  rp, 2, objv, "NU
c670: 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20  LLVALUE");.     
c680: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c690: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
c6a0: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
c6b0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
c6c0: 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54   char *zNull = T
c6d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
c6e0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
c6f0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  n);.      if( pD
c700: 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  b->zNull ){.    
c710: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
c720: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ->zNull);.      
c730: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c  }.      if( zNul
c740: 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  l && len>0 ){.  
c750: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
c760: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
c770: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
c780: 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a 4e   strncpy(pDb->zN
c790: 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29  ull, zNull, len)
c7a0: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ;.        pDb->z
c7b0: 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  Null[len] = '\0'
c7c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c7d0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
c7e0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
c7f0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74     }.    Tcl_Set
c800: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
c810: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44  , dbTextToObj(pD
c820: 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20  b->zNull));.    
c830: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
c840: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61  .  **     $db la
c850: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20  st_insert_rowid 
c860: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
c870: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
c880: 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  ch is the ROWID 
c890: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
c8a0: 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f  ent insert..  */
c8b0: 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f  .  case DB_LAST_
c8c0: 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a  INSERT_ROWID: {.
c8d0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
c8e0: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72 6f  sult;.    int ro
c8f0: 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  wid;.    if( obj
c900: 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
c910: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
c920: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
c930: 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
c940: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
c950: 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73   }.    rowid = s
c960: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
c970: 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62  rt_rowid(pDb->db
c980: 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
c990: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
c9a0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
c9b0: 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
c9c0: 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20  sult, rowid);.  
c9d0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
c9e0: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f  /*.  ** The DB_O
c9f0: 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20  NECOLUMN method 
ca00: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74  is implemented t
ca10: 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f  ogether with DB_
ca20: 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  EVAL..  */..  /*
ca30: 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73 73      $db progress
ca40: 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20   ?N CALLBACK?.  
ca50: 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  ** .  ** Invoke 
ca60: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
ca70: 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74 75  ck every N virtu
ca80: 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64  al machine opcod
ca90: 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74 69  es while executi
caa0: 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ng.  ** queries.
cab0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
cac0: 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20  PROGRESS: {.    
cad0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
cae0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
caf0: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
cb00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
cb10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
cb20: 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a  >zProgress, 0);.
cb30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
cb40: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
cb50: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
cb60: 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e  ogress;.      in
cb70: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74  t len;.      int
cb80: 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43   N;.      if( TC
cb90: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
cba0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
cbb0: 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a  objv[2], &N) ){.
cbc0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
cbd0: 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  R;.      };.    
cbe0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
cbf0: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
cc00: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
cc10: 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20  rogress);.      
cc20: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73  }.      zProgres
cc30: 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
cc40: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
cc50: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
cc60: 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20  f( zProgress && 
cc70: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
cc80: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
cc90: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
cca0: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
ccb0: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  strcpy(pDb->zPro
ccc0: 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73  gress, zProgress
ccd0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
cce0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
ccf0: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
cd00: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
cd10: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
cd20: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20  _CALLBACK.      
cd30: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
cd40: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ss ){.        pD
cd50: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
cd60: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
cd70: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
cd80: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c  dler(pDb->db, N,
cd90: 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
cda0: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
cdb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
cdc0: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
cdd0: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
cde0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
cdf0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
ce00: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
ce10: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
ce20: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20  rp, 2, objv, "N 
ce30: 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
ce40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ce50: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
ce60: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
ce70: 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43    $db profile ?C
ce80: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
ce90: 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
cea0: 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
ceb0: 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
cec0: 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53  ine after each S
ced0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
cee0: 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20  * that has run. 
cef0: 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
cf00: 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f   SQL and the amo
cf10: 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69  unt of elapse ti
cf20: 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65  me are.  ** appe
cf30: 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
cf40: 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69   before the scri
cf50: 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a  pt is run..  */.
cf60: 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c    case DB_PROFIL
cf70: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
cf80: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
cf90: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
cfa0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
cfb0: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
cfc0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
cfd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
cfe0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
cff0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
d000: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
d010: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
d020: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
d030: 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20  zProfile, 0);.  
d040: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d050: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
d060: 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74  ofile;.      int
d070: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
d080: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
d090: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
d0a0: 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29  e(pDb->zProfile)
d0b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d0c0: 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47  zProfile = Tcl_G
d0d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
d0e0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
d0f0: 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69        if( zProfi
d100: 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  le && len>0 ){. 
d110: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
d120: 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  file = Tcl_Alloc
d130: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
d140: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
d150: 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66  >zProfile, zProf
d160: 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ile);.      }els
d170: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
d180: 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  zProfile = 0;.  
d190: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
d1a0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
d1b0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
d1c0: 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
d1d0: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
d1e0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
d1f0: 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
d200: 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66  (pDb->db, DbProf
d210: 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  ileHandler, pDb)
d220: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d230: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
d240: 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
d250: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
d260: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
d270: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
d280: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65  .  **     $db re
d290: 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a  key KEY.  **.  *
d2a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63  * Change the enc
d2b0: 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74  ryption key on t
d2c0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
d2d0: 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  n database..  */
d2e0: 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59  .  case DB_REKEY
d2f0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  : {.    int nKey
d300: 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  ;.    void *pKey
d310: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
d320: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
d330: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
d340: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
d350: 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
d360: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
d370: 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63   }.    pKey = Tc
d380: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
d390: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
d3a0: 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  nKey);.#ifdef SQ
d3b0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
d3c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
d3d0: 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
d3e0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d3f0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d400: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d410: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
d420: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
d430: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
d440: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
d450: 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
d460: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
d470: 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c   $db timeout MIL
d480: 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20  LESECONDS.  **. 
d490: 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68   ** Delay for th
d4a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
d4b0: 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69  iseconds specifi
d4c0: 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69  ed when a file i
d4d0: 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20  s locked..  */. 
d4e0: 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54   case DB_TIMEOUT
d4f0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a  : {.    int ms;.
d500: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
d510: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
d520: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
d530: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 2, objv, "MILL
d540: 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
d550: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d560: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
d570: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
d580: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
d590: 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75  [2], &ms) ) retu
d5a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d5b0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
d5c0: 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20  imeout(pDb->db, 
d5d0: 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ms);.    break;.
d5e0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
d5f0: 20 20 20 24 64 62 20 73 6f 66 74 5f 68 65 61 70     $db soft_heap
d600: 5f 6c 69 6d 69 74 20 4e 0a 20 20 2a 2a 0a 20 20  _limit N.  **.  
d610: 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 66 74 2d  ** Set the soft-
d620: 68 65 61 70 2d 6c 69 6d 69 74 20 66 6f 72 20 74  heap-limit for t
d630: 68 69 73 20 74 68 72 65 61 64 2e 20 4e 6f 74 65  his thread. Note
d640: 20 74 68 61 74 20 74 68 65 20 6c 69 6d 69 74 20   that the limit 
d650: 69 73 20 0a 20 20 2a 2a 20 70 65 72 2d 74 68 72  is .  ** per-thr
d660: 65 61 64 2c 20 6e 6f 74 20 70 65 72 2d 64 61 74  ead, not per-dat
d670: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
d680: 73 65 20 44 42 5f 53 4f 46 54 5f 48 45 41 50 5f  se DB_SOFT_HEAP_
d690: 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 69 6e 74  LIMIT: {.    int
d6a0: 20 6e 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   n;.    if( objc
d6b0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
d6c0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
d6d0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
d6e0: 42 59 54 45 53 22 29 3b 0a 20 20 20 20 20 20 72  BYTES");.      r
d6f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d700: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
d710: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
d720: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
d730: 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 72  , &n) ){.      r
d740: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d750: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d760: 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
d770: 69 74 28 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 52  it(n);.    Tcl_R
d780: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
d790: 70 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  p);.    break;. 
d7a0: 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
d7b0: 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68      $db total_ch
d7c0: 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
d7d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
d7e0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
d7f0: 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
d800: 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
d810: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
d820: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
d830: 6c 65 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  le was created..
d840: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
d850: 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a  OTAL_CHANGES: {.
d860: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
d870: 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  sult;.    if( ob
d880: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
d890: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
d8a0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
d8b0: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
d8c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d8d0: 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20    }.    pResult 
d8e0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
d8f0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
d900: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
d910: 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74  esult, sqlite3_t
d920: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62  otal_changes(pDb
d930: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
d940: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
d950: 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42  $db trace ?CALLB
d960: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
d970: 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
d980: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
d990: 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
d9a0: 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  for each SQL sta
d9b0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74  tement.  ** that
d9c0: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
d9d0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53  he text of the S
d9e0: 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  QL is appended t
d9f0: 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72  o CALLBACK befor
da00: 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65  e.  ** it is exe
da10: 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  cuted..  */.  ca
da20: 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20  se DB_TRACE: {. 
da30: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
da40: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
da50: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
da60: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
da70: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
da80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
da90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
daa0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
dab0: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
dac0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
dad0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
dae0: 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  p, pDb->zTrace, 
daf0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
db00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
db10: 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20  r *zTrace;.     
db20: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
db30: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
db40: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
db50: 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
db60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
db70: 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74  zTrace = Tcl_Get
db80: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
db90: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
dba0: 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26      if( zTrace &
dbb0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
dbc0: 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
dbd0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
dbe0: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
dbf0: 74 72 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63  trcpy(pDb->zTrac
dc00: 65 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 20 20  e, zTrace);.    
dc10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dc20: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30   pDb->zTrace = 0
dc30: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
dc40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
dc50: 41 43 45 0a 20 20 20 20 20 20 69 66 28 20 70 44  ACE.      if( pD
dc60: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
dc70: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
dc80: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
dc90: 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
dca0: 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61 63  (pDb->db, DbTrac
dcb0: 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  eHandler, pDb);.
dcc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dcd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
dce0: 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  ce(pDb->db, 0, 0
dcf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
dd00: 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  f.    }.    brea
dd10: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
dd20: 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  $db transaction 
dd30: 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65  [-deferred|-imme
dd40: 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69 76 65  diate|-exclusive
dd50: 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  ] SCRIPT.  **.  
dd60: 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20 74  ** Start a new t
dd70: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66 20 77  ransaction (if w
dd80: 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
dd90: 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74 20 6f  y in the midst o
dda0: 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  f a.  ** transac
ddb0: 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63 75 74  tion) and execut
ddc0: 65 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74  e the TCL script
ddd0: 20 53 43 52 49 50 54 2e 20 20 41 66 74 65 72 20   SCRIPT.  After 
dde0: 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d 70  SCRIPT.  ** comp
ddf0: 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20 63 6f  letes, either co
de00: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
de10: 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74 20  tion or roll it 
de20: 62 61 63 6b 20 69 66 20 53 43 52 49 50 54 0a 20  back if SCRIPT. 
de30: 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20 65 78   ** throws an ex
de40: 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66 20  ception.  Or if 
de50: 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74 69 6f  no new transatio
de60: 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 64  n was started, d
de70: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a 20  o nothing..  ** 
de80: 70 61 73 73 20 74 68 65 20 65 78 63 65 70 74 69  pass the excepti
de90: 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73 74 61  on on up the sta
dea0: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ck..  **.  ** Th
deb0: 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 69  is command was i
dec0: 6e 73 70 69 72 65 64 20 62 79 20 44 61 76 65 20  nspired by Dave 
ded0: 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f 6e  Thomas's talk on
dee0: 20 52 75 62 79 20 61 74 20 74 68 65 0a 20 20 2a   Ruby at the.  *
def0: 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c 79 20  * 2005 O'Reilly 
df00: 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e 76  Open Source Conv
df10: 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a  ention (OSCON)..
df20: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
df30: 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20 20  RANSACTION: {.  
df40: 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 3b 0a 20    int inTrans;. 
df50: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72     Tcl_Obj *pScr
df60: 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ipt;.    const c
df70: 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22 42  har *zBegin = "B
df80: 45 47 49 4e 22 3b 0a 20 20 20 20 69 66 28 20 6f  EGIN";.    if( o
df90: 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
dfa0: 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  4 ){.      Tcl_W
dfb0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
dfc0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54  rp, 2, objv, "[T
dfd0: 59 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20  YPE] SCRIPT");. 
dfe0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
dff0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
e000: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
e010: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
e020: 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 7d 20 65  objv[2];.    } e
e030: 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lse {.      stat
e040: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54  ic const char *T
e050: 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a  TYPE_strs[] = {.
e060: 20 20 20 20 20 20 20 20 22 64 65 66 65 72 72 65          "deferre
e070: 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65  d",   "exclusive
e080: 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c  ",  "immediate",
e090: 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
e0a0: 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75    enum TTYPE_enu
e0b0: 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50  m {.        TTYP
e0c0: 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59 50  E_DEFERRED, TTYP
e0d0: 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59  E_EXCLUSIVE, TTY
e0e0: 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20  PE_IMMEDIATE.   
e0f0: 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
e100: 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28  ttype;.      if(
e110: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
e120: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
e130: 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73  v[2], TTYPE_strs
e140: 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  , "transaction t
e150: 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ype",.          
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 20 29      0, &ttype) )
e180: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
e190: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e1a0: 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68    }.      switch
e1b0: 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e  ( (enum TTYPE_en
e1c0: 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20  um)ttype ){.    
e1d0: 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 44      case TTYPE_D
e1e0: 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e  EFERRED:    /* n
e1f0: 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20  o-op */;        
e200: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
e210: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
e220: 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20  PE_EXCLUSIVE:   
e230: 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20  zBegin = "BEGIN 
e240: 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65  EXCLUSIVE";  bre
e250: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
e260: 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45   TTYPE_IMMEDIATE
e270: 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45  :   zBegin = "BE
e280: 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20  GIN IMMEDIATE"; 
e290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e2a0: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
e2b0: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20  objv[3];.    }. 
e2c0: 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 21 73 71     inTrans = !sq
e2d0: 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
e2e0: 6d 6d 69 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20  mmit(pDb->db);. 
e2f0: 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73 20     if( !inTrans 
e300: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e310: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
e320: 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  Begin, 0, 0, 0);
e330: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
e340: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
e350: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
e360: 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72  );.    if( !inTr
e370: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ans ){.      con
e380: 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20  st char *zEnd;. 
e390: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
e3a0: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
e3b0: 20 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41    zEnd = "ROLLBA
e3c0: 43 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  CK";.      } els
e3d0: 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64  e {.        zEnd
e3e0: 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20   = "COMMIT";.   
e3f0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e400: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
e410: 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 3b   zEnd, 0, 0, 0);
e420: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
e430: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
e440: 20 20 20 20 24 64 62 20 75 70 64 61 74 65 5f 68      $db update_h
e450: 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
e460: 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41  /.  case DB_UPDA
e470: 54 45 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69  TE_HOOK: {.    i
e480: 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
e490: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
e4a0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
e4b0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
e4c0: 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  , "?SCRIPT?");. 
e4d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e4e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
e4f0: 20 20 69 66 28 20 70 44 62 2d 3e 70 55 70 64 61    if( pDb->pUpda
e500: 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20  teHook ){.      
e510: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
e520: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 55  (interp, pDb->pU
e530: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 20 20  pdateHook);.    
e540: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
e550: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
e560: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
e570: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 20  UpdateHook);.   
e580: 20 20 20 20 20 70 44 62 2d 3e 70 55 70 64 61 74       pDb->pUpdat
e590: 65 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20  eHook = 0;.     
e5a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e5b0: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
e5c0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61    if( Tcl_GetCha
e5d0: 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29  rLength(objv[2])
e5e0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
e5f0: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 3d  b->pUpdateHook =
e600: 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20   objv[2];.      
e610: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
e620: 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  nt(pDb->pUpdateH
e630: 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ook);.        sq
e640: 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
e650: 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62 55 70 64  k(pDb->db, DbUpd
e660: 61 74 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  ateHandler, pDb)
e670: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75         sqlite3_u
e690: 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e  pdate_hook(pDb->
e6a0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
e6b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
e6c0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
e6d0: 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a   $db version.  *
e6e0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
e6f0: 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  e version string
e700: 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
e710: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
e720: 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20  DB_VERSION: {.  
e730: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
e740: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
e750: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
e760: 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  on(), TCL_STATIC
e770: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
e780: 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f  }...  } /* End o
e790: 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74 61  f the SWITCH sta
e7a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75  tement */.  retu
e7b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e7c0: 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45    sqlite3 DBNAME
e7d0: 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f   FILENAME ?MODE?
e7e0: 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a 2a   ?-key KEY?.**.*
e7f0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61  * This is the ma
e800: 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20  in Tcl command. 
e810: 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74   When the "sqlit
e820: 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69  e" Tcl command i
e830: 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68  s.** invoked, th
e840: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
e850: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  to process that 
e860: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  command..**.** T
e870: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
e880: 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e  t, DBNAME, is an
e890: 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20   arbitrary name 
e8a0: 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74  for a new.** dat
e8b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e8c0: 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  .  This command 
e8d0: 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f  creates a new co
e8e0: 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44  mmand named.** D
e8f0: 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73  BNAME that is us
e900: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  ed to control th
e910: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  at connection.  
e920: 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  The database.** 
e930: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65  connection is de
e940: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44  leted when the D
e950: 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73  BNAME command is
e960: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
e970: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
e980: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
e990: 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
e9a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
e9b0: 2a 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  * the sqlite dat
e9c0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 74 6f  abase that is to
e9d0: 20 62 65 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a   be accessed..**
e9e0: 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20  .** For testing 
e9f0: 70 75 72 70 6f 73 65 73 2c 20 77 65 20 61 6c 73  purposes, we als
ea00: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20 66 6f  o support the fo
ea10: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
ea20: 73 71 6c 69 74 65 33 20 2d 65 6e 63 6f 64 69 6e  sqlite3 -encodin
ea30: 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65  g.**.**       Re
ea40: 74 75 72 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e  turn the encodin
ea50: 67 20 75 73 65 64 20 62 79 20 4c 49 4b 45 20 61  g used by LIKE a
ea60: 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  nd GLOB operator
ea70: 73 2e 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20  s.  Choices.**  
ea80: 20 20 20 20 20 61 72 65 20 55 54 46 2d 38 20 61       are UTF-8 a
ea90: 6e 64 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a  nd iso8859..**.*
eaa0: 2a 20 20 73 71 6c 69 74 65 33 20 2d 76 65 72 73  *  sqlite3 -vers
eab0: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ion.**.**       
eac0: 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69  Return the versi
ead0: 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  on number of the
eae0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
eaf0: 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20  .**.**  sqlite3 
eb00: 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a 2a  -tcl-uses-utf.**
eb10: 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e  .**       Return
eb20: 20 22 31 22 20 69 66 20 63 6f 6d 70 69 6c 65 64   "1" if compiled
eb30: 20 77 69 74 68 20 61 20 54 63 6c 20 75 73 65 73   with a Tcl uses
eb40: 20 55 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20   UTF-8.  Return 
eb50: 22 30 22 20 69 66 0a 2a 2a 20 20 20 20 20 20 20  "0" if.**       
eb60: 6e 6f 74 2e 20 20 55 73 65 64 20 62 79 20 74 65  not.  Used by te
eb70: 73 74 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sts to make sure
eb80: 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73   the library was
eb90: 20 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20 20   compiled .**   
eba0: 20 20 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a      correctly..*
ebb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d  /.static int DbM
ebc0: 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  ain(void *cd, Tc
ebd0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ebe0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
ebf0: 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
ec00: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a  .  SqliteDb *p;.
ec10: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30    void *pKey = 0
ec20: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30  ;.  int nKey = 0
ec30: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
ec40: 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45  zArg;.  char *zE
ec50: 72 72 4d 73 67 3b 0a 20 20 63 6f 6e 73 74 20 63  rrMsg;.  const c
ec60: 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
ec70: 61 72 20 7a 42 75 66 5b 38 30 5d 3b 0a 20 20 69  ar zBuf[80];.  i
ec80: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
ec90: 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
eca0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
ecb0: 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69  jv[1], 0);.    i
ecc0: 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
ecd0: 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b  -version")==0 ){
ece0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
ecf0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73  dResult(interp,s
ed00: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30  qlite3_version,0
ed10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ed20: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
ed30: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
ed40: 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d  g,"-has-codec")=
ed50: 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
ed60: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
ed70: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ed80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c  sult(interp,"1",
ed90: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  0);.#else.      
eda0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
edb0: 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a  (interp,"0",0);.
edc0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
edd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
ede0: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
edf0: 28 7a 41 72 67 2c 22 2d 74 63 6c 2d 75 73 65 73  (zArg,"-tcl-uses
ee00: 2d 75 74 66 22 29 3d 3d 30 20 29 7b 0a 23 69 66  -utf")==0 ){.#if
ee10: 64 65 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 0a  def TCL_UTF_MAX.
ee20: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ee30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31  Result(interp,"1
ee40: 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ",0);.#else.    
ee50: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ee60: 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29  lt(interp,"0",0)
ee70: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
ee80: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
ee90: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62    }.  }.  if( ob
eea0: 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d 36  jc==5 || objc==6
eeb0: 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54   ){.    zArg = T
eec0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
eed0: 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d  Obj(objv[objc-2]
eee0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
eef0: 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22  rcmp(zArg,"-key"
ef00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4b  )==0 ){.      pK
ef10: 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ey = Tcl_GetByte
ef20: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
ef30: 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65 79  v[objc-1], &nKey
ef40: 29 3b 0a 20 20 20 20 20 20 6f 62 6a 63 20 2d 3d  );.      objc -=
ef50: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
ef60: 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
ef70: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
ef80: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
ef90: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
efa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
efb0: 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22  AS_CODEC.      "
efc0: 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20  HANDLE FILENAME 
efd0: 3f 2d 6b 65 79 20 43 4f 44 45 43 2d 4b 45 59 3f  ?-key CODEC-KEY?
efe0: 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 48  ".#else.      "H
eff0: 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f  ANDLE FILENAME ?
f000: 4d 4f 44 45 3f 22 0a 23 65 6e 64 69 66 0a 20 20  MODE?".#endif.  
f010: 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20    );.    return 
f020: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
f030: 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
f040: 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54  p = (SqliteDb*)T
f050: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
f060: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
f070: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  =0 ){.    Tcl_Se
f080: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
f090: 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c  "malloc failed",
f0a0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
f0b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f0c0: 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  OR;.  }.  memset
f0d0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
f0e0: 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  ));.  zFile = Tc
f0f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f100: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
f110: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a    sqlite3_open(z
f120: 46 69 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20  File, &p->db);. 
f130: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
f140: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
f150: 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45  p->db) ){.    zE
f160: 72 72 4d 73 67 20 3d 20 73 74 72 64 75 70 28 73  rrMsg = strdup(s
f170: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
f180: 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  >db));.    sqlit
f190: 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b  e3_close(p->db);
f1a0: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a  .    p->db = 0;.
f1b0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
f1c0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71  E_HAS_CODEC.  sq
f1d0: 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c  lite3_key(p->db,
f1e0: 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65   pKey, nKey);.#e
f1f0: 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62  ndif.  if( p->db
f200: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
f210: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
f220: 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f   zErrMsg, TCL_VO
f230: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c  LATILE);.    Tcl
f240: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b  _Free((char*)p);
f250: 0a 20 20 20 20 66 72 65 65 28 7a 45 72 72 4d 73  .    free(zErrMs
f260: 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  g);.    return T
f270: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f280: 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d  p->maxStmt = NUM
f290: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b  _PREPARED_STMTS;
f2a0: 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65  .  zArg = Tcl_Ge
f2b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
f2c0: 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63  bjv[1], 0);.  Tc
f2d0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
f2e0: 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
f2f0: 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72   DbObjCmd, (char
f300: 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
f310: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 74  );..  /* The ret
f320: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
f330: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 71   value of the sq
f340: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 20 20  lite* pointer.  
f350: 2a 2f 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  */.  sprintf(zBu
f360: 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62 29 3b  f, "%p", p->db);
f370: 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  .  if( strncmp(z
f380: 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b 0a 20  Buf,"0x",2) ){. 
f390: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
f3a0: 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62 29 3b   "0x%p", p->db);
f3b0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
f3c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f3d0: 7a 42 75 66 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  zBuf, 0);..  /* 
f3e0: 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  If compiled with
f3f0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 74 75 72   SQLITE_TEST tur
f400: 6e 65 64 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67  ned on, then reg
f410: 69 73 74 65 72 20 74 68 65 20 22 6d 64 35 73 75  ister the "md5su
f420: 6d 22 0a 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63  m".  ** SQL func
f430: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  tion..  */.#ifde
f440: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
f450: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
f460: 64 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73  d Md5_Register(s
f470: 71 6c 69 74 65 33 2a 29 3b 0a 23 69 66 64 65 66  qlite3*);.#ifdef
f480: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
f490: 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 66  .    int mallocf
f4a0: 61 69 6c 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d  ail = sqlite3_iM
f4b0: 61 6c 6c 6f 63 46 61 69 6c 3b 0a 20 20 20 20 73  allocFail;.    s
f4c0: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
f4d0: 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  il = 0;.#endif. 
f4e0: 20 20 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28     Md5_Register(
f4f0: 70 2d 3e 64 62 29 3b 0a 23 69 66 64 65 66 20 53  p->db);.#ifdef S
f500: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20  QLITE_MEMDEBUG. 
f510: 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c     sqlite3_iMall
f520: 6f 63 46 61 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66  ocFail = mallocf
f530: 61 69 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ail;.#endif.  }.
f540: 23 65 6e 64 69 66 20 20 0a 20 20 70 2d 3e 69 6e  #endif  .  p->in
f550: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
f560: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f570: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  }../*.** Provide
f580: 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69   a dummy Tcl_Ini
f590: 74 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65  tStubs if we are
f5a0: 20 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61   using this as a
f5b0: 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61   static.** libra
f5c0: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55  ry..*/.#ifndef U
f5d0: 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75  SE_TCL_STUBS.# u
f5e0: 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74  ndef  Tcl_InitSt
f5f0: 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c  ubs.# define Tcl
f600: 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63  _InitStubs(a,b,c
f610: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
f620: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
f630: 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e a PACKAGE_VERS
f640: 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ION macro define
f650: 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
f660: 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f  .** defined auto
f670: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65  matically by the
f680: 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20   TEA makefile.  
f690: 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69  But other makefi
f6a0: 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65  les.** do not de
f6b0: 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e  fine it..*/.#ifn
f6c0: 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
f6d0: 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43  ION.# define PAC
f6e0: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c  KAGE_VERSION SQL
f6f0: 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64  ITE_VERSION.#end
f700: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
f710: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
f720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c  ..**.** This Tcl
f730: 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73   module contains
f740: 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e   only a single n
f750: 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  ew Tcl command n
f760: 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a  amed "sqlite"..*
f770: 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69  * (Hence there i
f780: 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20  s no namespace. 
f790: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
f7a0: 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61  nt in using a na
f7b0: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68  mespace.** if th
f7c0: 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  e extension only
f7d0: 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65   supplies one ne
f7e0: 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73  w name!)  The "s
f7f0: 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69  qlite" command i
f800: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65  s.** used to ope
f810: 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64  n a new SQLite d
f820: 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68  atabase.  See th
f830: 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69  e DbMain() routi
f840: 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20  ne above.** for 
f850: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
f860: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45 58 54 45 52  mation..*/.EXTER
f870: 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e  N int Sqlite3_In
f880: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
f890: 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e  nterp){.  Tcl_In
f8a0: 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
f8b0: 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c  "8.4", 0);.  Tcl
f8c0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
f8d0: 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
f8e0: 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64  e3", (Tcl_ObjCmd
f8f0: 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c  Proc*)DbMain, 0,
f900: 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72   0);.  Tcl_PkgPr
f910: 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73  ovide(interp, "s
f920: 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45  qlite3", PACKAGE
f930: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 54 63 6c  _VERSION);.  Tcl
f940: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
f950: 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
f960: 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  e", (Tcl_ObjCmdP
f970: 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
f980: 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f  0);.  Tcl_PkgPro
f990: 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71  vide(interp, "sq
f9a0: 6c 69 74 65 22 2c 20 50 41 43 4b 41 47 45 5f 56  lite", PACKAGE_V
f9b0: 45 52 53 49 4f 4e 29 3b 0a 20 20 72 65 74 75 72  ERSION);.  retur
f9c0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45  n TCL_OK;.}.EXTE
f9d0: 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
f9e0: 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
f9f0: 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
fa00: 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
fa10: 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52  interp); }.EXTER
fa20: 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61  N int Sqlite3_Sa
fa30: 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
fa40: 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
fa50: 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54  rn TCL_OK; }.EXT
fa60: 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74  ERN int Tclsqlit
fa70: 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  e3_SafeInit(Tcl_
fa80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
fa90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
faa0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fab0: 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a  E_3_SUFFIX_ONLY.
fac0: 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
fad0: 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
fae0: 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
faf0: 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
fb00: 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52  interp); }.EXTER
fb10: 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  N int Tclsqlite_
fb20: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
fb30: 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
fb40: 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
fb50: 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20  terp); }.EXTERN 
fb60: 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49  int Sqlite_SafeI
fb70: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
fb80: 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
fb90: 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
fba0: 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53   int Tclsqlite_S
fbb0: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
fbc0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
fbd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65  urn TCL_OK; }.#e
fbe0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c  ndif..#ifdef TCL
fbf0: 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  SH./************
fc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc40: 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
fc50: 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73  at follows is us
fc60: 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e  ed to build stan
fc70: 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72  dalone TCL inter
fc80: 70 72 65 74 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a  preters.*/../*.*
fc90: 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
fca0: 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65  CLSH is one, the
fcb0: 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68  n put in code th
fcc0: 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d  is for the.** "m
fcd0: 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61  ain" routine tha
fce0: 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a  t will initializ
fcf0: 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69  e Tcl and take i
fd00: 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61  nput from.** sta
fd10: 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a  ndard input..*/.
fd20: 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61  #if TCLSH==1.sta
fd30: 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  tic char zMainlo
fd40: 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69  op[] =.  "set li
fd50: 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c  ne {}\n".  "whil
fd60: 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d  e {![eof stdin]}
fd70: 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24   {\n".    "if {$
fd80: 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  line!=\"\"} {\n"
fd90: 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
fda0: 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e  newline \"> \"\n
fdb0: 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c  ".    "} else {\
fdc0: 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d  n".      "puts -
fdd0: 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22  nonewline \"% \"
fde0: 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20  \n".    "}\n".  
fdf0: 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c    "flush stdout\
fe00: 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c  n".    "append l
fe10: 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d  ine [gets stdin]
fe20: 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e  \n".    "if {[in
fe30: 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e  fo complete $lin
fe40: 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  e]} {\n".      "
fe50: 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
fe60: 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65  vel #0 $line} re
fe70: 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  sult]} {\n".    
fe80: 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72      "puts stderr
fe90: 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c   \"Error: $resul
fea0: 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20  t\"\n".      "} 
feb0: 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21  elseif {$result!
fec0: 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20  =\"\"} {\n".    
fed0: 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c      "puts $resul
fee0: 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22  t\n".      "}\n"
fef0: 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65  .      "set line
ff00: 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c   {}\n".    "} el
ff10: 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61  se {\n".      "a
ff20: 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e  ppend line \\n\n
ff30: 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d  ".    "}\n".  "}
ff40: 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  \n".;.#endif../*
ff50: 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f  .** If the macro
ff60: 20 54 43 4c 53 48 20 69 73 20 74 77 6f 2c 20 74   TCLSH is two, t
ff70: 68 65 6e 20 67 65 74 20 74 68 65 20 6d 61 69 6e  hen get the main
ff80: 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f   loop code out o
ff90: 66 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74  f.** the separat
ffa0: 65 20 66 69 6c 65 20 22 73 70 61 63 65 61 6e 61  e file "spaceana
ffb0: 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66  l_tcl.h"..*/.#if
ffc0: 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63   TCLSH==2.static
ffd0: 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b   char zMainloop[
ffe0: 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73  ] = .#include "s
fff0: 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a  paceanal_tcl.h".
10000 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ;.#endif..#defin
10010 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69  e TCLSH_MAIN mai
10020 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f  n   /* Needed to
10030 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61   fake out mktcla
10040 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f  pp */.int TCLSH_
10050 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63  MAIN(int argc, c
10060 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54  har **argv){.  T
10070 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10080 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65  p;.  Tcl_FindExe
10090 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29  cutable(argv[0])
100a0 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c  ;.  interp = Tcl
100b0 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b  _CreateInterp();
100c0 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  .  Sqlite3_Init(
100d0 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20  interp);.#ifdef 
100e0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a  SQLITE_TEST.  {.
100f0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10100 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
10110 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10120 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
10130 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63  itetest2_Init(Tc
10140 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10150 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10160 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f  etest3_Init(Tcl_
10170 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
10180 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
10190 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est4_Init(Tcl_In
101a0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
101b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
101c0 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t5_Init(Tcl_Inte
101d0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
101e0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36   int Sqlitetest6
101f0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10200 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10210 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
10220 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
10230 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
10240 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63   int Md5_Init(Tc
10250 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10260 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10270 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63  etestsse_Init(Tc
10280 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20  l_Interp*);..   
10290 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
102a0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
102b0 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28  qlitetest2_Init(
102c0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
102d0 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e  itetest3_Init(in
102e0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
102f0 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65  etest4_Init(inte
10300 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
10310 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70  est5_Init(interp
10320 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
10330 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t6_Init(interp);
10340 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61  .    Sqlitetesta
10350 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  sync_Init(interp
10360 29 3b 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74 28  );.    Md5_Init(
10370 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20  interp);.#ifdef 
10380 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20 53  SQLITE_SSE.    S
10390 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69  qlitetestsse_Ini
103a0 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
103b0 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
103c0 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43  f( argc>=2 || TC
103d0 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  LSH==2 ){.    in
103e0 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  t i;.    Tcl_Set
103f0 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
10400 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
10410 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
10420 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
10430 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
10440 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
10450 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
10460 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
10470 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
10480 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
10490 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
104a0 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
104b0 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
104c0 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
104d0 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
104e0 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
104f0 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
10500 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
10510 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
10520 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10530 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
10540 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
10550 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
10560 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
10570 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
10580 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70  ) zInfo = interp
10590 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20  ->result;.      
105a0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
105b0 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76  %s: %s\n", *argv
105c0 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , zInfo);.      
105d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
105e0 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d    }.  if( argc<=
105f0 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b  1 || TCLSH==2 ){
10600 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  .    Tcl_GlobalE
10610 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69  val(interp, zMai
10620 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nloop);.  }.  re
10630 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
10640 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23 65   /* TCLSH */..#e
10650 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10660 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a              (NO_TCL) */.