/ Hex Artifact Content
Login

Artifact 00cefd8c37cc934e13cb5238ed53f090391aa99a:


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 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  n of SQLite..*/.
0200: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22  #include "tcl.h"
0210: 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  .#include <errno
0220: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20  .h>../*.** Some 
0230: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 63 6c 75  additional inclu
0240: 64 65 20 66 69 6c 65 73 20 61 72 65 20 6e 65 65  de files are nee
0250: 64 65 64 20 69 66 20 74 68 69 73 20 66 69 6c 65  ded if this file
0260: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 6e   is not.** appen
0270: 64 65 64 20 74 6f 20 74 68 65 20 61 6d 61 6c 67  ded to the amalg
0280: 61 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  amation..*/.#ifn
0290: 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47  def SQLITE_AMALG
02a0: 41 4d 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64  AMATION.# includ
02b0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
02c0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  # include <stdli
02d0: 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c  b.h>.# include <
02e0: 73 74 72 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c  string.h>.# incl
02f0: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0300: 20 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e   include <ctype.
0310: 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  h>.#endif../*. *
0320: 20 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74   Windows needs t
0330: 6f 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d  o know which sym
0340: 62 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20  bols to export. 
0350: 20 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a   Unix does not..
0360: 20 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20   * BUILD_sqlite 
0370: 73 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69  should be undefi
0380: 6e 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a  ned for Unix.. *
0390: 2f 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73  /.#ifdef BUILD_s
03a0: 71 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c  qlite.#undef TCL
03b0: 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23  _STORAGE_CLASS.#
03c0: 64 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41  define TCL_STORA
03d0: 47 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f  GE_CLASS DLLEXPO
03e0: 52 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49  RT.#endif /* BUI
03f0: 4c 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64  LD_sqlite */..#d
0400: 65 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52  efine NUM_PREPAR
0410: 45 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66  ED_STMTS 10.#def
0420: 69 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44  ine MAX_PREPARED
0430: 5f 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a  _STMTS 100../*.*
0440: 2a 20 49 66 20 54 43 4c 20 75 73 65 73 20 55 54  * If TCL uses UT
0450: 46 2d 38 20 61 6e 64 20 53 51 4c 69 74 65 20 69  F-8 and SQLite i
0460: 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
0470: 75 73 65 20 69 73 6f 38 38 35 39 2c 20 74 68 65  use iso8859, the
0480: 6e 20 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20  n we.** have to 
0490: 64 6f 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  do a translation
04a0: 20 77 68 65 6e 20 67 6f 69 6e 67 20 62 65 74 77   when going betw
04b0: 65 65 6e 20 74 68 65 20 74 77 6f 2e 20 20 53 65  een the two.  Se
04c0: 74 20 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52  t the .** UTF_TR
04d0: 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  ANSLATION_NEEDED
04e0: 20 6d 61 63 72 6f 20 74 6f 20 69 6e 64 69 63 61   macro to indica
04f0: 74 65 20 74 68 61 74 20 77 65 20 6e 65 65 64 20  te that we need 
0500: 74 6f 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72  to do.** this tr
0510: 61 6e 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  anslation.  .*/.
0520: 23 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c 5f  #if defined(TCL_
0530: 55 54 46 5f 4d 41 58 29 20 26 26 20 21 64 65 66  UTF_MAX) && !def
0540: 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38  ined(SQLITE_UTF8
0550: 29 0a 23 20 64 65 66 69 6e 65 20 55 54 46 5f 54  ).# define UTF_T
0560: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
0570: 44 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  D 1.#endif../*.*
0580: 2a 20 4e 65 77 20 53 51 4c 20 66 75 6e 63 74 69  * New SQL functi
0590: 6f 6e 73 20 63 61 6e 20 62 65 20 63 72 65 61 74  ons can be creat
05a0: 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74  ed as TCL script
05b0: 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 66 75  s.  Each such fu
05c0: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73  nction.** is des
05d0: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
05e0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
05f0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0600: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0610: 75 63 74 20 53 71 6c 46 75 6e 63 20 53 71 6c 46  uct SqlFunc SqlF
0620: 75 6e 63 3b 0a 73 74 72 75 63 74 20 53 71 6c 46  unc;.struct SqlF
0630: 75 6e 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  unc {.  Tcl_Inte
0640: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a  rp *interp;   /*
0650: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
0660: 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  et to execute th
0670: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
0680: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
0690: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 54 63 6c  ;     /* The Tcl
06a0: 5f 4f 62 6a 20 72 65 70 72 65 73 65 6e 74 61 74  _Obj representat
06b0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70  ion of the scrip
06c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45 76  t */.  int useEv
06d0: 61 6c 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20  alObjv;      /* 
06e0: 54 72 75 65 20 69 66 20 69 74 20 69 73 20 73 61  True if it is sa
06f0: 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76  fe to use Tcl_Ev
0700: 61 6c 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72  alObjv */.  char
0710: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
0720: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69    /* Name of thi
0730: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
0740: 53 71 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20  SqlFunc *pNext; 
0750: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75        /* Next fu
0760: 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69  nction on the li
0770: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a  st of them all *
0780: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20  /.};../*.** New 
0790: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
07a0: 63 65 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ces function can
07b0: 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54   be created as T
07c0: 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63  CL scripts.  Eac
07d0: 68 20 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69  h such.** functi
07e0: 6f 6e 20 69 73 20 64 65 73 63 72 69 62 65 64 20  on is described 
07f0: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0800: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0810: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
0820: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0830: 43 6f 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61  Collate SqlColla
0840: 74 65 3b 0a 73 74 72 75 63 74 20 53 71 6c 43 6f  te;.struct SqlCo
0850: 6c 6c 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e  llate {.  Tcl_In
0860: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20  terp *interp;   
0870: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
0880: 70 72 65 74 20 74 6f 20 65 78 65 63 75 74 65 20  pret to execute 
0890: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
08a0: 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b    char *zScript;
08b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
08c0: 63 72 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20  cript to be run 
08d0: 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  */.  SqlCollate 
08e0: 2a 70 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65  *pNext;    /* Ne
08f0: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0900: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0910: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0920: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
0930: 65 6e 74 73 20 61 72 65 20 63 61 63 68 65 64 20  ents are cached 
0940: 66 6f 72 20 66 61 73 74 65 72 20 65 78 65 63 75  for faster execu
0950: 74 69 6f 6e 2e 20 20 45 61 63 68 20 70 72 65 70  tion.  Each prep
0960: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
0970: 74 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62  t is described b
0980: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  y an instance of
0990: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
09a0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
09b0: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 50  edef struct SqlP
09c0: 72 65 70 61 72 65 64 53 74 6d 74 20 53 71 6c 50  reparedStmt SqlP
09d0: 72 65 70 61 72 65 64 53 74 6d 74 3b 0a 73 74 72  reparedStmt;.str
09e0: 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  uct SqlPreparedS
09f0: 74 6d 74 20 7b 0a 20 20 53 71 6c 50 72 65 70 61  tmt {.  SqlPrepa
0a00: 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20  redStmt *pNext; 
0a10: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b   /* Next in link
0a20: 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c  ed list */.  Sql
0a30: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
0a40: 72 65 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rev;  /* Previou
0a50: 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  s on the list */
0a60: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
0a70: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54  *pStmt;     /* T
0a80: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
0a90: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
0aa0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
0ab0: 20 20 20 20 2f 2a 20 63 68 61 72 73 20 69 6e 20      /* chars in 
0ac0: 7a 53 71 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73  zSql[] */.  cons
0ad0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20  t char *zSql;   
0ae0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
0af0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
0b00: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 6d  t */.  int nParm
0b10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0b20: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 50 61 72  /* Size of apPar
0b30: 6d 20 61 72 72 61 79 20 2a 2f 0a 20 20 54 63 6c  m array */.  Tcl
0b40: 5f 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20  _Obj **apParm;  
0b50: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
0b60: 66 20 72 65 66 65 72 65 6e 63 65 64 20 6f 62 6a  f referenced obj
0b70: 65 63 74 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a  ect pointers */.
0b80: 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  };..typedef stru
0b90: 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  ct IncrblobChann
0ba0: 65 6c 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  el IncrblobChann
0bb0: 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65  el;../*.** There
0bc0: 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
0bd0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
0be0: 72 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 69  re for each SQLi
0bf0: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  te database.** t
0c00: 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65  hat has been ope
0c10: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  ned by the SQLit
0c20: 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e  e TCL interface.
0c30: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0c40: 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c 69  ct SqliteDb Sqli
0c50: 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53 71 6c  teDb;.struct Sql
0c60: 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65  iteDb {.  sqlite
0c70: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
0c80: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61       /* The "rea
0c90: 6c 22 20 64 61 74 61 62 61 73 65 20 73 74 72 75  l" database stru
0ca0: 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46  cture. MUST BE F
0cb0: 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  IRST */.  Tcl_In
0cc0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20  terp *interp;   
0cd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
0ce0: 72 70 72 65 74 65 72 20 75 73 65 64 20 66 6f 72  rpreter used for
0cf0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
0d00: 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b  /.  char *zBusy;
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0d20: 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * The busy callb
0d30: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
0d40: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0d60: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63  he commit hook c
0d70: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0d80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63  */.  char *zTrac
0d90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
0da0: 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63 61 6c  /* The trace cal
0db0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0dc0: 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c  .  char *zProfil
0dd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
0de0: 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c   The profile cal
0df0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0e00: 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65  .  char *zProgre
0e10: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss;           /*
0e20: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
0e30: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0e40: 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b  /.  char *zAuth;
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0e60: 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  * The authorizat
0e70: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ion callback rou
0e80: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69  tine */.  int di
0e90: 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20  sableAuth;      
0ea0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
0eb0: 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69  the authorizer i
0ec0: 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  f it exists */. 
0ed0: 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20   char *zNull;   
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0ef0: 65 78 74 20 74 6f 20 73 75 62 73 74 69 74 75 74  ext to substitut
0f00: 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c  e for an SQL NUL
0f10: 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c  L value */.  Sql
0f20: 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20  Func *pFunc;    
0f30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
0f40: 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  of SQL functions
0f50: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
0f60: 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20  UpdateHook;     
0f70: 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20   /* Update hook 
0f80: 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20  script (if any) 
0f90: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  */.  Tcl_Obj *pR
0fa0: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20  ollbackHook;    
0fb0: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b  /* Rollback hook
0fc0: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
0fd0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
0fe0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20  UnlockNotify;   
0ff0: 20 2f 2a 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66   /* Unlock notif
1000: 79 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  y script (if any
1010: 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  ) */.  SqlCollat
1020: 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20  e *pCollate;    
1030: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c    /* List of SQL
1040: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
1050: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ions */.  int rc
1060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1070: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1080: 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65  ode of most rece
1090: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
10a0: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
10b0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20  pCollateNeeded; 
10c0: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e    /* Collation n
10d0: 65 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a  eeded script */.
10e0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
10f0: 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20  t *stmtList; /* 
1100: 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64  List of prepared
1110: 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20   statements*/.  
1120: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
1130: 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61  *stmtLast; /* La
1140: 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  st statement in 
1150: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  the list */.  in
1160: 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20 20  t maxStmt;      
1170: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1180: 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d  next maximum num
1190: 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74 20  ber of stmtList 
11a0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20  */.  int nStmt; 
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61  /* Number of sta
11d0: 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c  tements in stmtL
11e0: 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  ist */.  Incrblo
11f0: 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62  bChannel *pIncrb
1200: 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69  lob;/* Linked li
1210: 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62  st of open incrb
1220: 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  lob channels */.
1230: 20 20 69 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f    int nStep, nSo
1240: 72 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt;          /* 
1250: 53 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6d  Statistics for m
1260: 6f 73 74 20 72 65 63 65 6e 74 20 6f 70 65 72 61  ost recent opera
1270: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  tion */.  int nT
1280: 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20  ransaction;     
1290: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12a0: 66 20 6e 65 73 74 65 64 20 5b 74 72 61 6e 73 61  f nested [transa
12b0: 63 74 69 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a  ction] methods *
12c0: 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63  /.};..struct Inc
12d0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20  rblobChannel {. 
12e0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
12f0: 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73 71  Blob;      /* sq
1300: 6c 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c  lite3 blob handl
1310: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
1320: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
1330: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
1340: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1350: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65  on */.  int iSee
1360: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1370: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65 65    /* Current see
1380: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54 63  k offset */.  Tc
1390: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65  l_Channel channe
13a0: 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e  l;      /* Chann
13b0: 65 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  el identifier */
13c0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
13d0: 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20  el *pNext;   /* 
13e0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
13f0: 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  ll open incrblob
1400: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49   channels */.  I
1410: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1420: 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b  pPrev;   /* Link
1430: 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f  ed list of all o
1440: 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  pen incrblob cha
1450: 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  nnels */.};../*.
1460: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
1470: 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20  ing length that 
1480: 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68  is limited to wh
1490: 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  at can be stored
14a0: 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20   in.** lower 30 
14b0: 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74  bits of a 32-bit
14c0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e   signed integer.
14d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
14e0: 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68  trlen30(const ch
14f0: 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20  ar *z){.  const 
1500: 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20  char *z2 = z;.  
1510: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32  while( *z2 ){ z2
1520: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ++; }.  return 0
1530: 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74  x3fffffff & (int
1540: 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 0a 23  )(z2 - z);.}...#
1550: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1560: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a  IT_INCRBLOB./*.*
1570: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72  * Close all incr
1580: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70  blob channels op
1590: 65 6e 65 64 20 75 73 69 6e 67 20 64 61 74 61 62  ened using datab
15a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ase connection p
15b0: 44 62 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  Db..** This is c
15c0: 61 6c 6c 65 64 20 77 68 65 6e 20 73 68 75 74 74  alled when shutt
15d0: 69 6e 67 20 64 6f 77 6e 20 74 68 65 20 64 61 74  ing down the dat
15e0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1600: 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68   closeIncrblobCh
1610: 61 6e 6e 65 6c 73 28 53 71 6c 69 74 65 44 62 20  annels(SqliteDb 
1620: 2a 70 44 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f  *pDb){.  Incrblo
1630: 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49  bChannel *p;.  I
1640: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1650: 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d  pNext;..  for(p=
1660: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20  pDb->pIncrblob; 
1670: 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
1680: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
1690: 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a  t;..    /* Note:
16a0: 20 43 61 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73   Calling unregis
16b0: 74 65 72 20 68 65 72 65 20 63 61 6c 6c 20 54 63  ter here call Tc
16c0: 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69  l_Close on the i
16d0: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c  ncrblob channel,
16e0: 20 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 64   .    ** which d
16f0: 65 6c 65 74 65 73 20 74 68 65 20 49 6e 63 72 62  eletes the Incrb
1700: 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63  lobChannel struc
1710: 74 75 72 65 20 61 74 20 2a 70 2e 20 53 6f 20 64  ture at *p. So d
1720: 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c  o not.    ** cal
1730: 6c 20 54 63 6c 5f 46 72 65 65 28 29 20 68 65 72  l Tcl_Free() her
1740: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  e..    */.    Tc
1750: 6c 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61 6e  l_UnregisterChan
1760: 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  nel(pDb->interp,
1770: 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20   p->channel);.  
1780: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
1790: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
17a0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f  blob channel..*/
17b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
17c0: 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74  blobClose(Client
17d0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
17e0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
17f0: 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c  nterp){.  Incrbl
1800: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
1810: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1820: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
1830: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1840: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d  e3_blob_close(p-
1850: 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74  >pBlob);.  sqlit
1860: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d  e3 *db = p->pDb-
1870: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  >db;..  /* Remov
1880: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 66 72  e the channel fr
1890: 6f 6d 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e  om the SqliteDb.
18a0: 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20  pIncrblob list. 
18b0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  */.  if( p->pNex
18c0: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
18d0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
18e0: 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rev;.  }.  if( p
18f0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
1900: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
1910: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
1920: 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e   if( p->pDb->pIn
1930: 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20  crblob==p ){.   
1940: 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c   p->pDb->pIncrbl
1950: 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  ob = p->pNext;. 
1960: 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68   }..  /* Free th
1970: 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  e IncrblobChanne
1980: 6c 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  l structure */. 
1990: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
19a0: 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  *)p);..  if( rc!
19b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19c0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
19d0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
19e0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
19f0: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
1a00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1a20: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a30: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
1a40: 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65   from an increme
1a50: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1a60: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1a70: 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a   incrblobInput(.
1a80: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
1a90: 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 63 68  tanceData, .  ch
1aa0: 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20  ar *buf, .  int 
1ab0: 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a  bufSize,.  int *
1ac0: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
1ad0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1ae0: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
1af0: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
1b00: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52  ceData;.  int nR
1b10: 65 61 64 20 3d 20 62 75 66 53 69 7a 65 3b 20 20  ead = bufSize;  
1b20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b30: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1b40: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  d */.  int nBlob
1b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b60: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
1b70: 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f  e of the blob */
1b80: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  /* sqlite error 
1bb0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62  code */..  nBlob
1bc0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1bd0: 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b  bytes(p->pBlob);
1be0: 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b  .  if( (p->iSeek
1bf0: 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b  +nRead)>nBlob ){
1c00: 0a 20 20 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c  .    nRead = nBl
1c10: 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d  ob-p->iSeek;.  }
1c20: 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 3d 30 20  .  if( nRead<=0 
1c30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1c40: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
1c50: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
1c60: 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a  ->pBlob, (void *
1c70: 29 62 75 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e  )buf, nRead, p->
1c80: 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63  iSeek);.  if( rc
1c90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ca0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
1cb0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
1cc0: 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  n -1;.  }..  p->
1cd0: 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a  iSeek += nRead;.
1ce0: 20 20 72 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a    return nRead;.
1cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
1d00: 61 74 61 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d  ata to an increm
1d10: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
1d20: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1d30: 74 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74  t incrblobOutput
1d40: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  (.  ClientData i
1d50: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20  nstanceData, .  
1d60: 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c  CONST char *buf,
1d70: 20 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c   .  int toWrite,
1d80: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
1d90: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
1da0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
1db0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1dc0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
1dd0: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74    int nWrite = t
1de0: 6f 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f  oWrite;        /
1df0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1e00: 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
1e10: 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e30: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
1e40: 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20  e blob */.  int 
1e50: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
1e70: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
1e80: 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  nBlob = sqli
1e90: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
1ea0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  ->pBlob);.  if( 
1eb0: 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65  (p->iSeek+nWrite
1ec0: 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a  )>nBlob ){.    *
1ed0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
1ee0: 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72  INVAL;.    retur
1ef0: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n -1;.  }.  if( 
1f00: 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20  nWrite<=0 ){.   
1f10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1f20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1f30: 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c  lob_write(p->pBl
1f40: 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c  ob, (void *)buf,
1f50: 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65   nWrite, p->iSee
1f60: 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  k);.  if( rc!=SQ
1f70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
1f80: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
1f90: 49 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  IO;.    return -
1fa0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
1fb0: 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  ek += nWrite;.  
1fc0: 72 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d  return nWrite;.}
1fd0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20  ../*.** Seek an 
1fe0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
1ff0: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
2000: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
2010: 53 65 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61  Seek(.  ClientDa
2020: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
2030: 20 0a 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c   .  long offset,
2040: 0a 20 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c  .  int seekMode,
2050: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
2060: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
2070: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
2080: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
2090: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
20a0: 0a 20 20 73 77 69 74 63 68 28 20 73 65 65 6b 4d  .  switch( seekM
20b0: 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
20c0: 53 45 45 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20  SEEK_SET:.      
20d0: 70 2d 3e 69 53 65 65 6b 20 3d 20 6f 66 66 73 65  p->iSeek = offse
20e0: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
20f0: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 43 55      case SEEK_CU
2100: 52 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  R:.      p->iSee
2110: 6b 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20  k += offset;.   
2120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2130: 73 65 20 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20  se SEEK_END:.   
2140: 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71     p->iSeek = sq
2150: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
2160: 28 70 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66  (p->pBlob) + off
2170: 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  set;.      break
2180: 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  ;..    default: 
2190: 61 73 73 65 72 74 28 21 22 42 61 64 20 73 65 65  assert(!"Bad see
21a0: 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20  kMode");.  }..  
21b0: 72 65 74 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b  return p->iSeek;
21c0: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
21d0: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 28 43   incrblobWatch(C
21e0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
21f0: 63 65 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65  ceData, int mode
2200: 29 7b 20 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a  ){ .  /* NO-OP *
2210: 2f 20 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  / .}.static int 
2220: 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43  incrblobHandle(C
2230: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
2240: 63 65 44 61 74 61 2c 20 69 6e 74 20 64 69 72 2c  ceData, int dir,
2250: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 50 74   ClientData *hPt
2260: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  r){.  return TCL
2270: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69  _ERROR;.}..stati
2280: 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70  c Tcl_ChannelTyp
2290: 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  e IncrblobChanne
22a0: 6c 54 79 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63  lType = {.  "inc
22b0: 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  rblob",         
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22d0: 2a 20 74 79 70 65 4e 61 6d 65 20 20 20 20 20 20  * typeName      
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f         */.  TCL_
2300: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f  CHANNEL_VERSION_
2310: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2320: 2a 20 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20  * version       
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2350: 62 6c 6f 62 43 6c 6f 73 65 2c 20 20 20 20 20 20  blobClose,      
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2370: 2a 20 63 6c 6f 73 65 50 72 6f 63 20 20 20 20 20  * closeProc     
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
23a0: 62 6c 6f 62 49 6e 70 75 74 2c 20 20 20 20 20 20  blobInput,      
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c0: 2a 20 69 6e 70 75 74 50 72 6f 63 20 20 20 20 20  * inputProc     
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
23f0: 62 6c 6f 62 4f 75 74 70 75 74 2c 20 20 20 20 20  blobOutput,     
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2410: 2a 20 6f 75 74 70 75 74 50 72 6f 63 20 20 20 20  * outputProc    
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2440: 62 6c 6f 62 53 65 65 6b 2c 20 20 20 20 20 20 20  blobSeek,       
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2460: 2a 20 73 65 65 6b 50 72 6f 63 20 20 20 20 20 20  * seekProc      
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24b0: 2a 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20  * setOptionProc 
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2500: 2a 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20  * getOptionProc 
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2530: 62 6c 6f 62 57 61 74 63 68 2c 20 20 20 20 20 20  blobWatch,      
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2550: 2a 20 77 61 74 63 68 50 72 6f 63 20 28 74 68 69  * watchProc (thi
2560: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20  s is a no-op)   
2570: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2580: 62 6c 6f 62 48 61 6e 64 6c 65 2c 20 20 20 20 20  blobHandle,     
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25a0: 2a 20 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 20  * getHandleProc 
25b0: 28 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20  (always returns 
25c0: 65 72 72 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20  error) */.  0,  
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25f0: 2a 20 63 6c 6f 73 65 32 50 72 6f 63 20 20 20 20  * close2Proc    
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2640: 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20  * blockModeProc 
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2690: 2a 20 66 6c 75 73 68 50 72 6f 63 20 20 20 20 20  * flushProc     
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e0: 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63 20 20 20  * handlerProc   
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2730: 2a 20 77 69 64 65 53 65 65 6b 50 72 6f 63 20 20  * wideSeekProc  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a         */.};../*
2760: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
2770: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
2780: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2790: 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43   createIncrblobC
27a0: 68 61 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e  hannel(.  Tcl_In
27b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20  terp *interp, . 
27c0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
27d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27e0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
27f0: 20 2a 7a 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e   *zTable, .  con
2800: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
2810: 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
2820: 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73  4 iRow,.  int is
2830: 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e  Readonly.){.  In
2840: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
2850: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2860: 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c  = pDb->db;.  sql
2870: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
2880: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2890: 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45  t flags = TCL_RE
28a0: 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e  ADABLE|(isReadon
28b0: 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49  ly ? 0 : TCL_WRI
28c0: 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68  TABLE);..  /* Th
28d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
28e0: 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65 20  sed to name the 
28f0: 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62  channels: "incrb
2900: 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d  lob_[incr count]
2910: 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69 6e  " */.  static in
2920: 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63  t count = 0;.  c
2930: 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d  har zChannel[64]
2940: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2950: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20  3_blob_open(db, 
2960: 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
2970: 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52  lumn, iRow, !isR
2980: 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29  eadonly, &pBlob)
2990: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
29a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
29b0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
29c0: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
29d0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
29e0: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
29f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2a10: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
2a20: 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  nnel *)Tcl_Alloc
2a30: 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62  (sizeof(Incrblob
2a40: 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e  Channel));.  p->
2a50: 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  iSeek = 0;.  p->
2a60: 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a  pBlob = pBlob;..
2a70: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2a80: 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e  tf(sizeof(zChann
2a90: 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22  el), zChannel, "
2aa0: 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b  incrblob_%d", ++
2ab0: 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61  count);.  p->cha
2ac0: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74  nnel = Tcl_Creat
2ad0: 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c  eChannel(&Incrbl
2ae0: 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a  obChannelType, z
2af0: 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67  Channel, p, flag
2b00: 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73 74  s);.  Tcl_Regist
2b10: 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  erChannel(interp
2b20: 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a  , p->channel);..
2b30: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
2b40: 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74  w channel into t
2b50: 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63  he SqliteDb.pInc
2b60: 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20  rblob list. */. 
2b70: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d   p->pNext = pDb-
2b80: 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d  >pIncrblob;.  p-
2b90: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66  >pPrev = 0;.  if
2ba0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
2bb0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
2bc0: 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62  v = p;.  }.  pDb
2bd0: 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b  ->pIncrblob = p;
2be0: 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b  .  p->pDb = pDb;
2bf0: 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ..  Tcl_SetResul
2c00: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
2c10: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
2c20: 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29  Name(p->channel)
2c30: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
2c40: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2c50: 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c  ;.}.#else  /* el
2c60: 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20 22 23  se clause for "#
2c70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c80: 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a  IT_INCRBLOB" */.
2c90: 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 49    #define closeI
2ca0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
2cb0: 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  pDb).#endif../*.
2cc0: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73  ** Look at the s
2cd0: 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20  cript prefix in 
2ce0: 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62  pCmd.  We will b
2cf0: 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
2d00: 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72   script.** after
2d10: 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67   first appending
2d20: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67   one or more arg
2d30: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f  uments.  This ro
2d40: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a  utine analyzes.*
2d50: 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20  * the script to 
2d60: 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66  see if it is saf
2d70: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
2d80: 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73  lObjv() on the s
2d90: 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20  cript.** rather 
2da0: 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65  than the more ge
2db0: 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78  neral Tcl_EvalEx
2dc0: 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ().  Tcl_EvalObj
2dd0: 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66  v() is much.** f
2de0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72  aster..**.** Scr
2df0: 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61  ipts that are sa
2e00: 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54  fe to use with T
2e10: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f  cl_EvalObjv() co
2e20: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63  nsists of a.** c
2e30: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c  ommand name foll
2e40: 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20  owed by zero or 
2e50: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77  more arguments w
2e60: 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20  ith no [...] or 
2e70: 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72  $.** or {...} or
2e80: 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e   ; to be seen an
2e90: 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61  ywhere.  Most ca
2ea0: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63  llback scripts c
2eb0: 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73  onsist.** of jus
2ec0: 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  t a single proce
2ed0: 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  dure name and th
2ee0: 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71  ey meet this req
2ef0: 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  uirement..*/.sta
2f00: 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73  tic int safeToUs
2f10: 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e  eEvalObjv(Tcl_In
2f20: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
2f30: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20  l_Obj *pCmd){.  
2f40: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20  /* We could try 
2f50: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
2f60: 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29  with Tcl_Parse()
2f70: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69  .  But we will i
2f80: 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74  nstead.  ** just
2f90: 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
2fa0: 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61   forbidden chara
2fb0: 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f  cters.  If any o
2fc0: 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a  f the forbidden.
2fd0: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
2fe0: 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20  appear in pCmd, 
2ff0: 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  we will report t
3000: 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73  he string as uns
3010: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  afe..  */.  cons
3020: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
3030: 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65   n;.  z = Tcl_Ge
3040: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
3050: 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c  Cmd, &n);.  whil
3060: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
3070: 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29    int c = *(z++)
3080: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27  ;.    if( c=='$'
3090: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
30a0: 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b  =';' ) return 0;
30b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
30c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
30d0: 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74  n SqlFunc struct
30e0: 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ure with the giv
30f0: 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65  en name.  Or cre
3100: 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65  ate a new.** one
3110: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
3120: 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  one cannot be fo
3130: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  und.  Return a p
3140: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
3150: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3160: 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66  tatic SqlFunc *f
3170: 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74  indSqlFunc(Sqlit
3180: 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  eDb *pDb, const 
3190: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
31a0: 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65  SqlFunc *p, *pNe
31b0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e  w;.  int i;.  pN
31c0: 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54  ew = (SqlFunc*)T
31d0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
31e0: 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e  (*pNew) + strlen
31f0: 33 30 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b  30(zName) + 1 );
3200: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d  .  pNew->zName =
3210: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
3220: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
3230: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65  me[i]; i++){ pNe
3240: 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f  w->zName[i] = to
3250: 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b  lower(zName[i]);
3260: 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65   }.  pNew->zName
3270: 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  [i] = 0;.  for(p
3280: 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20  =pDb->pFunc; p; 
3290: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20  p=p->pNext){ .  
32a0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e    if( strcmp(p->
32b0: 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61  zName, pNew->zNa
32c0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
32d0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
32e0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74  pNew);.      ret
32f0: 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn p;.    }.  }
3300: 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20  .  pNew->interp 
3310: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  = pDb->interp;. 
3320: 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d   pNew->pScript =
3330: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   0;.  pNew->pNex
3340: 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  t = pDb->pFunc;.
3350: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
3360: 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  New;.  return pN
3370: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  ew;.}../*.** Fin
3380: 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61  alize and free a
3390: 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65   list of prepare
33a0: 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a  d statements.*/.
33b0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73  static void flus
33c0: 68 53 74 6d 74 43 61 63 68 65 28 20 53 71 6c 69  hStmtCache( Sqli
33d0: 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20 20 53  teDb *pDb ){.  S
33e0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
33f0: 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69  pPreStmt;..  whi
3400: 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69  le(  pDb->stmtLi
3410: 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
3420: 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d  3_finalize( pDb-
3430: 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74  >stmtList->pStmt
3440: 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74   );.    pPreStmt
3450: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
3460: 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c  ;.    pDb->stmtL
3470: 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ist = pDb->stmtL
3480: 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
3490: 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61 72 2a  Tcl_Free( (char*
34a0: 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d  )pPreStmt );.  }
34b0: 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20  .  pDb->nStmt = 
34c0: 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61  0;.  pDb->stmtLa
34d0: 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  st = 0;.}../*.**
34e0: 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20   TCL calls this 
34f0: 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61  procedure when a
3500: 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62 61  n sqlite3 databa
3510: 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  se command is.**
3520: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
3530: 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74  tic void DbDelet
3540: 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a  eCmd(void *db){.
3550: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3560: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b  = (SqliteDb*)db;
3570: 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68  .  flushStmtCach
3580: 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49  e(pDb);.  closeI
3590: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
35a0: 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pDb);.  sqlite3_
35b0: 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a  close(pDb->db);.
35c0: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46    while( pDb->pF
35d0: 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75  unc ){.    SqlFu
35e0: 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d  nc *pFunc = pDb-
35f0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d  >pFunc;.    pDb-
3600: 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e  >pFunc = pFunc->
3610: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44  pNext;.    Tcl_D
3620: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
3630: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
3640: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
3650: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
3660: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
3670: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
3680: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
3690: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
36a0: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
36b0: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
36c0: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
36d0: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
36e0: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
36f0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
3700: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3710: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
3720: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
3730: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3740: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
3750: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
3760: 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  le ){.    Tcl_Fr
3770: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
3780: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3790: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
37a0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
37b0: 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
37c0: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
37d0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
37e0: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Null);.  }.  if(
37f0: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
3800: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
3810: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
3820: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d  UpdateHook);.  }
3830: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c  .  if( pDb->pRol
3840: 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20  lbackHook ){.   
3850: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3860: 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  t(pDb->pRollback
3870: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3880: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
3890: 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f  eded ){.    Tcl_
38a0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
38b0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
38c0: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65  );.  }.  Tcl_Fre
38d0: 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d  e((char*)pDb);.}
38e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
38f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3900: 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  hen a database f
3910: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68  ile is locked wh
3920: 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
3930: 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f   execute SQL..*/
3940: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75  .static int DbBu
3950: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
3960: 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b  cd, int nTries){
3970: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3980: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
3990: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
39a0: 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20  ar zVal[30];..  
39b0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
39c0: 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20 7a  (sizeof(zVal), z
39d0: 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65  Val, "%d", nTrie
39e0: 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56  s);.  rc = Tcl_V
39f0: 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  arEval(pDb->inte
3a00: 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20  rp, pDb->zBusy, 
3a10: 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72  " ", zVal, (char
3a20: 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  *)0);.  if( rc!=
3a30: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
3a40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
3a50: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
3a60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3a70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
3a80: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
3a90: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
3aa0: 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a  S_CALLBACK./*.**
3ab0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3ac0: 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20   invoked as the 
3ad0: 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61  'progress callba
3ae0: 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74 61  ck' for the data
3af0: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
3b00: 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48 61  int DbProgressHa
3b10: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
3b20: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3b30: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
3b40: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
3b50: 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f  ssert( pDb->zPro
3b60: 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20  gress );.  rc = 
3b70: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
3b80: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67  terp, pDb->zProg
3b90: 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21  ress);.  if( rc!
3ba0: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
3bb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
3bc0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
3bd0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3be0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
3bf0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
3c00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3c10: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  _TRACE./*.** Thi
3c20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3c30: 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  led by the SQLit
3c40: 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20  e trace handler 
3c50: 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a  whenever a new.*
3c60: 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69  * block of SQL i
3c70: 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
3c80: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
3c90: 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78  Db->zTrace is ex
3ca0: 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ecuted..*/.stati
3cb0: 63 20 76 6f 69 64 20 44 62 54 72 61 63 65 48 61  c void DbTraceHa
3cc0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
3cd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
3ce0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
3cf0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3d00: 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  cd;.  Tcl_DStrin
3d10: 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53  g str;..  Tcl_DS
3d20: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
3d30: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
3d40: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
3d50: 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54  zTrace, -1);.  T
3d60: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
3d70: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53  Element(&str, zS
3d80: 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28  ql);.  Tcl_Eval(
3d90: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
3da0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
3db0: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
3dc0: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
3dd0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
3de0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d  (pDb->interp);.}
3df0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3e00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
3e10: 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CE./*.** This ro
3e20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3e30: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 70 72  by the SQLite pr
3e40: 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66  ofile handler af
3e50: 74 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  ter a statement.
3e60: 2a 2a 20 53 51 4c 20 68 61 73 20 65 78 65 63 75  ** SQL has execu
3e70: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
3e80: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72  ript in pDb->zPr
3e90: 6f 66 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74  ofile is evaluat
3ea0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
3eb0: 69 64 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64  id DbProfileHand
3ec0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
3ed0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
3ee0: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d  sqlite_uint64 tm
3ef0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
3f00: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3f10: 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  cd;.  Tcl_DStrin
3f20: 67 20 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54  g str;.  char zT
3f30: 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  m[100];..  sqlit
3f40: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3f50: 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20  of(zTm)-1, zTm, 
3f60: 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54  "%lld", tm);.  T
3f70: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
3f80: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
3f90: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
3fa0: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d  pDb->zProfile, -
3fb0: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
3fc0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
3fd0: 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63  str, zSql);.  Tc
3fe0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
3ff0: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d  lement(&str, zTm
4000: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
4010: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
4020: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
4030: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
4040: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
4050: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
4060: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23  Db->interp);.}.#
4070: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
4080: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4090: 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
40a0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
40b0: 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c  ted.  The.** TCL
40c0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
40d0: 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75  zCommit is execu
40e0: 74 65 64 2e 20 20 49 66 20 69 74 20 72 65 74 75  ted.  If it retu
40f0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a  rns non-zero or.
4100: 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73 20  ** if it throws 
4110: 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68  an exception, th
4120: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
4130: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73   rolled back ins
4140: 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67  tead.** of being
4150: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73   committed..*/.s
4160: 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d  tatic int DbComm
4170: 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  itHandler(void *
4180: 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  cd){.  SqliteDb 
4190: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
41a0: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
41b0: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  .  rc = Tcl_Eval
41c0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
41d0: 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  b->zCommit);.  i
41e0: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
41f0: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
4200: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
4210: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
4220: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
4230: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
4240: 69 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61  ic void DbRollba
4250: 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ckHandler(void *
4260: 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53  clientData){.  S
4270: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4280: 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74  SqliteDb*)client
4290: 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70  Data;.  assert(p
42a0: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
42b0: 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b  k);.  if( TCL_OK
42c0: 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  !=Tcl_EvalObjEx(
42d0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
42e0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c  ->pRollbackHook,
42f0: 20 30 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42   0) ){.    Tcl_B
4300: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
4310: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  Db->interp);.  }
4320: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4330: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
4340: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
4350: 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
4360: 49 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64  IFY).static void
4370: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
4380: 74 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74  tifyVars(Tcl_Int
4390: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
43a0: 20 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29   iArg, int nArg)
43b0: 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34  {.  char zBuf[64
43c0: 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  ];.  sprintf(zBu
43d0: 66 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a  f, "%d", iArg);.
43e0: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
43f0: 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c  erp, "sqlite_unl
4400: 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c  ock_notify_arg",
4410: 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41   zBuf, TCL_GLOBA
4420: 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e  L_ONLY);.  sprin
4430: 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e  tf(zBuf, "%d", n
4440: 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  Arg);.  Tcl_SetV
4450: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
4460: 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  te_unlock_notify
4470: 5f 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66  _argcount", zBuf
4480: 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
4490: 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  Y);.}.#else.# de
44a0: 66 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f  fine setTestUnlo
44b0: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79  ckNotifyVars(x,y
44c0: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ,z).#endif..#ifd
44d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
44e0: 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
44f0: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c  tatic void DbUnl
4500: 6f 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a  ockNotify(void *
4510: 2a 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  *apArg, int nArg
4520: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
4530: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
4540: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ++){.    const i
4550: 6e 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f  nt flags = (TCL_
4560: 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f  EVAL_GLOBAL|TCL_
4570: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
4580: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
4590: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70  = (SqliteDb *)ap
45a0: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54  Arg[i];.    setT
45b0: 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56  estUnlockNotifyV
45c0: 61 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  ars(pDb->interp,
45d0: 20 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61   i, nArg);.    a
45e0: 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c  ssert( pDb->pUnl
45f0: 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20  ockNotify);.    
4600: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
4610: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
4620: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66  pUnlockNotify, f
4630: 6c 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44  lags);.    Tcl_D
4640: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
4650: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
4660: 0a 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63  .    pDb->pUnloc
4670: 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d  kNotify = 0;.  }
4680: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
4690: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
46a0: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
46b0: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
46c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
46d0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
46e0: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
46f0: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
4700: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4710: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
4720: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
4730: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
4740: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a  >pUpdateHook );.
4750: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
4760: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
4770: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
4780: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
4790: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
47a0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
47b0: 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65  Obj(pDb->pUpdate
47c0: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
47d0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
47e0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
47f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4800: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4810: 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70  ngObj(.    ( (op
4820: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  ==SQLITE_INSERT)
4830: 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53  ?"INSERT":(op==S
4840: 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55  QLITE_UPDATE)?"U
4850: 50 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29  PDATE":"DELETE")
4860: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4870: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4880: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
4890: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
48a0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
48b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
48c0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
48d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
48e0: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
48f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4900: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
4910: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72  _NewWideIntObj(r
4920: 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76  owid));.  Tcl_Ev
4930: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
4940: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
4950: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 7d 0a 0a  VAL_DIRECT);.}..
4960: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43  static void tclC
4970: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20  ollateNeeded(.  
4980: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71  void *pCtx,.  sq
4990: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
49a0: 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68   enc,.  const ch
49b0: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53  ar *zName.){.  S
49c0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
49d0: 53 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b  SqliteDb *)pCtx;
49e0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
49f0: 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  ipt = Tcl_Duplic
4a00: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c  ateObj(pDb->pCol
4a10: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54  lateNeeded);.  T
4a20: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4a30: 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f  pScript);.  Tcl_
4a40: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4a50: 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c  ment(0, pScript,
4a60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4a70: 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  j(zName, -1));. 
4a80: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
4a90: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72  Db->interp, pScr
4aa0: 69 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44  ipt, 0);.  Tcl_D
4ab0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ecrRefCount(pScr
4ac0: 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ipt);.}../*.** T
4ad0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4ae0: 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74  alled to evaluat
4af0: 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69  e an SQL collati
4b00: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  on function impl
4b10: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
4b20: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
4b30: 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71  static int tclSq
4b40: 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64  lCollate(.  void
4b50: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41   *pCtx,.  int nA
4b60: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
4b70: 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20  zA,.  int nB,.  
4b80: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29  const void *zB.)
4b90: 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  {.  SqlCollate *
4ba0: 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20  p = (SqlCollate 
4bb0: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
4bc0: 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64  j *pCmd;..  pCmd
4bd0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4be0: 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20  Obj(p->zScript, 
4bf0: 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
4c00: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4c10: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4c20: 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74  ndElement(p->int
4c30: 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  erp, pCmd, Tcl_N
4c40: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20  ewStringObj(zA, 
4c50: 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  nA));.  Tcl_List
4c60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4c70: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
4c80: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4c90: 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54  bj(zB, nB));.  T
4ca0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
4cb0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
4cc0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
4cd0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4ce0: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75  nt(pCmd);.  retu
4cf0: 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74  rn (atoi(Tcl_Get
4d00: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
4d10: 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a  interp)));.}../*
4d20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4d30: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
4d40: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75  aluate an SQL fu
4d50: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
4d60: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20  ed.** using TCL 
4d70: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
4d80: 63 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e  c void tclSqlFun
4d90: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
4da0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
4db0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
4dc0: 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71  lue**argv){.  Sq
4dd0: 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74  lFunc *p = sqlit
4de0: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
4df0: 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  text);.  Tcl_Obj
4e00: 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b   *pCmd;.  int i;
4e10: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
4e20: 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20  ( argc==0 ){.   
4e30: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
4e40: 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   no arguments to
4e50: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63   the function, c
4e60: 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  all Tcl_EvalObjE
4e70: 78 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  x on the.    ** 
4e80: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69  script object di
4e90: 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c  rectly.  This al
4ea0: 6c 6f 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d  lows the TCL com
4eb0: 70 69 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74  piler to generat
4ec0: 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64  e.    ** bytecod
4ed0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e  e for the comman
4ee0: 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  d on the first i
4ef0: 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68  nvocation and th
4f00: 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  us make.    ** s
4f10: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
4f20: 74 69 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65  tions much faste
4f30: 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d  r. */.    pCmd =
4f40: 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20   p->pScript;.   
4f50: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4f60: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20  t(pCmd);.    rc 
4f70: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
4f80: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
4f90: 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63   0);.    Tcl_Dec
4fa0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4fb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
4fc0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 72   If there are ar
4fd0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
4fe0: 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20  unction, make a 
4ff0: 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20  shallow copy of 
5000: 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70  the.    ** scrip
5010: 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e  t object, lappen
5020: 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c  d the arguments,
5030: 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74   then evaluate t
5040: 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a  he copy..    **.
5050: 20 20 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c      ** By "shall
5060: 6f 77 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61  ow" copy, we mea
5070: 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74  n a only the out
5080: 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20  er list Tcl_Obj 
5090: 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20  is duplicated.. 
50a0: 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63     ** The new Tc
50b0: 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70  l_Obj contains p
50c0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ointers to the o
50d0: 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65  riginal list ele
50e0: 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54  ments. .    ** T
50f0: 68 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63  hat way, when Tc
5100: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20  l_EvalObjv() is 
5110: 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73  run and shimmers
5120: 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   the first eleme
5130: 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  nt.    ** of the
5140: 20 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e   list to tclCmdN
5150: 61 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c  ameType, that al
5160: 74 65 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e  ternate represen
5170: 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  tation will.    
5180: 2a 2a 20 62 65 20 70 72 65 73 65 72 76 65 64 20  ** be preserved 
5190: 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68  and reused on th
51a0: 65 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f  e next invocatio
51b0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  n..    */.    Tc
51c0: 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20  l_Obj **aArg;.  
51d0: 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
51e0: 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if( Tcl_ListObjG
51f0: 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e  etElements(p->in
5200: 74 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74  terp, p->pScript
5210: 2c 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20  , &nArg, &aArg) 
5220: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5230: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
5240: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
5250: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
5260: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20  terp), -1); .   
5270: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
5280: 20 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d       .    pCmd =
5290: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
52a0: 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20  nArg, aArg);.   
52b0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
52c0: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72  t(pCmd);.    for
52d0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
52e0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
52f0: 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61  3_value *pIn = a
5300: 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63  rgv[i];.      Tc
5310: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20  l_Obj *pVal;.   
5320: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
5330: 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63  /* Set pVal to c
5340: 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20  ontain the i'th 
5350: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72  column of this r
5360: 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69  ow. */.      swi
5370: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  tch( sqlite3_val
5380: 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a  ue_type(pIn) ){.
5390: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
53a0: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
53b0: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
53c0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
53d0: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
53e0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
53f0: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
5400: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  (sqlite3_value_b
5410: 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29  lob(pIn), bytes)
5420: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5430: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
5440: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
5450: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
5460: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74        sqlite_int
5470: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76  64 v = sqlite3_v
5480: 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b  alue_int64(pIn);
5490: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76  .          if( v
54a0: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
54b0: 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   v<=2147483647 )
54c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
54d0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  al = Tcl_NewIntO
54e0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
54f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5500: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5510: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
5520: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5530: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5550: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
5560: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64  T: {.          d
5570: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
5580: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70  3_value_double(p
5590: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  In);.          p
55a0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75  Val = Tcl_NewDou
55b0: 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20  bleObj(r);.     
55c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
55d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
55e0: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
55f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  {.          pVal
5600: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
5610: 4f 62 6a 28 22 22 2c 20 30 29 3b 0a 20 20 20 20  Obj("", 0);.    
5620: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
5640: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5650: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
5660: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5670: 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  tes(pIn);.      
5680: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5690: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
56a0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
56b0: 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74  e_text(pIn), byt
56c0: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
56d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
56e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
56f0: 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70   = Tcl_ListObjAp
5700: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
5710: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61  nterp, pCmd, pVa
5720: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
5730: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5740: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5750: 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
5760: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5770: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
5780: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
5790: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
57a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
57b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
57c0: 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61    if( !p->useEva
57d0: 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f  lObjv ){.      /
57e0: 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  * Tcl_EvalObjEx(
57f0: 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  ) will automatic
5800: 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76  ally call Tcl_Ev
5810: 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64  alObjv() if pCmd
5820: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c  .      ** is a l
5830: 69 73 74 20 77 69 74 68 6f 75 74 20 61 20 73 74  ist without a st
5840: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5850: 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74  ion.  To prevent
5860: 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20   this from.     
5870: 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d   ** happening, m
5880: 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68 61  ake sure pCmd ha
5890: 73 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67  s a valid string
58a0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
58b0: 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  */.      Tcl_Get
58c0: 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20  String(pCmd);.  
58d0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c    }.    rc = Tcl
58e0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
58f0: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
5900: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
5910: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5920: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20  nt(pCmd);.  }.. 
5930: 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 54   if( rc && rc!=T
5940: 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20  CL_RETURN ){.   
5950: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5960: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
5970: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
5980: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
5990: 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1); .  }else{.  
59a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20    Tcl_Obj *pVar 
59b0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
59c0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  lt(p->interp);. 
59d0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38     int n;.    u8
59e0: 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 6f 6e 73   *data;.    cons
59f0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
5a00: 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f  (pVar->typePtr ?
5a10: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e   pVar->typePtr->
5a20: 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20 20  name : "");.    
5a30: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
5a40: 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62  ];.    if( c=='b
5a50: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
5a60: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
5a70: 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73  0 && pVar->bytes
5a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
5a90: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c  Only return a BL
5aa0: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
5ab0: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
5ac0: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
5ad0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73       ** has no s
5ae0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
5af0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64  tion. */.      d
5b00: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
5b10: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
5b20: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
5b30: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
5b40: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61  ob(context, data
5b50: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
5b60: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
5b70: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
5b80: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
5b90: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
5ba0: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
5bb0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
5bc0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
5bd0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
5be0: 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  text, n);.    }e
5bf0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
5c00: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
5c10: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
5c20: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
5c30: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
5c40: 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  leFromObj(0, pVa
5c50: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r, &r);.      sq
5c60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
5c70: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  ble(context, r);
5c80: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
5c90: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
5ca0: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
5cb0: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
5cc0: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
5cd0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
5ce0: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54  )==0) ){.      T
5cf0: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
5d00: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
5d10: 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  ntFromObj(0, pVa
5d20: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71  r, &v);.      sq
5d30: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5d40: 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a  64(context, v);.
5d50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d60: 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65   data = (unsigne
5d70: 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  d char *)Tcl_Get
5d80: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56  StringFromObj(pV
5d90: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
5da0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5db0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
5dc0: 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c  r *)data, n, SQL
5dd0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5de0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
5df0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5e00: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
5e10: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
5e20: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
5e30: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70  function.  It ap
5e40: 70 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e  pends the authen
5e50: 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65  tication.** type
5e60: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77   code and the tw
5e70: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a  o arguments to z
5e80: 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b  Cmd[] then invok
5e90: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
5ea0: 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   on the interpre
5eb0: 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20  ter.  The reply 
5ec0: 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64  is examined to d
5ed0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a  etermine if the.
5ee0: 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ** authenticatio
5ef0: 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65  n fails or succe
5f00: 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eds..*/.static i
5f10: 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  nt auth_callback
5f20: 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  (.  void *pArg,.
5f30: 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f    int code,.  co
5f40: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c  nst char *zArg1,
5f50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5f60: 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg2,.  const ch
5f70: 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e  ar *zArg3,.  con
5f80: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29  st char *zArg4.)
5f90: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
5fa0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
5fb0: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
5fc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70  const char *zRep
5fd0: 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  ly;.  SqliteDb *
5fe0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
5ff0: 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70 44 62  )pArg;.  if( pDb
6000: 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 20 29 20  ->disableAuth ) 
6010: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6020: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64  ;..  switch( cod
6030: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
6040: 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20  LITE_COPY       
6050: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6060: 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72  SQLITE_COPY"; br
6070: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6080: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
6090: 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  X      : zCode="
60a0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
60b0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
60c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
60d0: 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a  ATE_TABLE      :
60e0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
60f0: 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72  REATE_TABLE"; br
6100: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6110: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6120: 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22  _INDEX : zCode="
6130: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6140: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
6150: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6160: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6170: 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  BLE : zCode="SQL
6180: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6190: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
61a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
61b0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
61c0: 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  ER: zCode="SQLIT
61d0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52  E_CREATE_TEMP_TR
61e0: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
61f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6200: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20  REATE_TEMP_VIEW 
6210: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6220: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
6230: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
6240: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
6250: 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a  E_TRIGGER    : z
6260: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
6270: 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72  ATE_TRIGGER"; br
6280: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6290: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
62a0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
62b0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
62c0: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
62d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45  case SQLITE_DELE
62e0: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
62f0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45  zCode="SQLITE_DE
6300: 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LETE"; break;.  
6310: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
6320: 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20  OP_INDEX        
6330: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6340: 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  DROP_INDEX"; bre
6350: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6360: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20  ITE_DROP_TABLE  
6370: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6380: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
6390: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
63a0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
63b0: 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43  EMP_INDEX   : zC
63c0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
63d0: 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72  _TEMP_INDEX"; br
63e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
63f0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
6400: 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22  ABLE   : zCode="
6410: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6420: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
6430: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6440: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
6450: 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  R : zCode="SQLIT
6460: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
6470: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
6480: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
6490: 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a  P_TEMP_VIEW    :
64a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
64b0: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ROP_TEMP_VIEW"; 
64c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
64d0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
64e0: 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  GER      : zCode
64f0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  ="SQLITE_DROP_TR
6500: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6510: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6520: 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20 20  ROP_VIEW        
6530: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6540: 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65  _DROP_VIEW"; bre
6550: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6560: 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20  ITE_INSERT      
6570: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6580: 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62  QLITE_INSERT"; b
6590: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
65a0: 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20  QLITE_PRAGMA    
65b0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
65c0: 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b  "SQLITE_PRAGMA";
65d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
65e0: 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20   SQLITE_READ    
65f0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6600: 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b  e="SQLITE_READ";
6610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6620: 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20   SQLITE_SELECT  
6630: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6640: 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e="SQLITE_SELECT
6650: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6660: 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  se SQLITE_TRANSA
6670: 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43  CTION       : zC
6680: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e  ode="SQLITE_TRAN
6690: 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b  SACTION"; break;
66a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
66b0: 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 20 20  _UPDATE         
66c0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
66d0: 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61  TE_UPDATE"; brea
66e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
66f0: 54 45 5f 41 54 54 41 43 48 20 20 20 20 20 20 20  TE_ATTACH       
6700: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6710: 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72  LITE_ATTACH"; br
6720: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6730: 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20 20 20  LITE_DETACH     
6740: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6750: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20  SQLITE_DETACH"; 
6760: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6770: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
6780: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
6790: 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  ="SQLITE_ALTER_T
67a0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
67b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
67c0: 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
67d0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
67e0: 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  REINDEX"; break;
67f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6800: 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20  _ANALYZE        
6810: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6820: 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65  TE_ANALYZE"; bre
6830: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6840: 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c  ITE_CREATE_VTABL
6850: 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  E     : zCode="S
6860: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41  QLITE_CREATE_VTA
6870: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
6880: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
6890: 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20 20 3a  P_VTABLE       :
68a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
68b0: 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62 72 65  ROP_VTABLE"; bre
68c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
68d0: 49 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20  ITE_FUNCTION    
68e0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
68f0: 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b  QLITE_FUNCTION";
6900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6910: 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e   SQLITE_SAVEPOIN
6920: 54 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  T         : zCod
6930: 65 3d 22 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  e="SQLITE_SAVEPO
6940: 49 4e 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  INT"; break;.   
6950: 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20   default        
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
6970: 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62   zCode="????"; b
6980: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  reak;.  }.  Tcl_
6990: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
69a0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
69b0: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
69c0: 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20  ->zAuth, -1);.  
69d0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
69e0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
69f0: 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74  Code);.  Tcl_DSt
6a00: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
6a10: 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20  t(&str, zArg1 ? 
6a20: 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54  zArg1 : "");.  T
6a30: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
6a40: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
6a50: 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22  rg2 ? zArg2 : ""
6a60: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
6a70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
6a80: 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67  tr, zArg3 ? zArg
6a90: 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  3 : "");.  Tcl_D
6aa0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
6ab0: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20  ent(&str, zArg4 
6ac0: 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20  ? zArg4 : "");. 
6ad0: 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c   rc = Tcl_Global
6ae0: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
6af0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
6b00: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
6b10: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
6b20: 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54  r);.  zReply = T
6b30: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
6b40: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
6b50: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  .  if( strcmp(zR
6b60: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22  eply,"SQLITE_OK"
6b70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
6b80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
6b90: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6ba0: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45  Reply,"SQLITE_DE
6bb0: 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  NY")==0 ){.    r
6bc0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b  c = SQLITE_DENY;
6bd0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6be0: 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49  cmp(zReply,"SQLI
6bf0: 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29  TE_IGNORE")==0 )
6c00: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6c10: 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73  E_IGNORE;.  }els
6c20: 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b  e{.    rc = 999;
6c30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6c40: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6c50: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
6c60: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  IZATION */../*.*
6c70: 2a 20 7a 54 65 78 74 20 69 73 20 61 20 70 6f 69  * zText is a poi
6c80: 6e 74 65 72 20 74 6f 20 74 65 78 74 20 6f 62 74  nter to text obt
6c90: 61 69 6e 65 64 20 76 69 61 20 61 6e 20 73 71 6c  ained via an sql
6ca0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
6cb0: 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72  ().** or similar
6cc0: 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69 73   interface. This
6cd0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
6ce0: 20 61 20 54 63 6c 20 73 74 72 69 6e 67 20 6f 62   a Tcl string ob
6cf0: 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65  ject, .** refere
6d00: 6e 63 65 20 63 6f 75 6e 74 20 73 65 74 20 74 6f  nce count set to
6d10: 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   0, containing t
6d20: 68 65 20 74 65 78 74 2e 20 49 66 20 61 20 74 72  he text. If a tr
6d30: 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74  anslation.** bet
6d40: 77 65 65 6e 20 69 73 6f 38 38 35 39 20 61 6e 64  ween iso8859 and
6d50: 20 55 54 46 2d 38 20 69 73 20 72 65 71 75 69 72   UTF-8 is requir
6d60: 65 64 2c 20 69 74 20 69 73 20 70 72 65 66 6f 72  ed, it is prefor
6d70: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  med..*/.static T
6d80: 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f  cl_Obj *dbTextTo
6d90: 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73 74 20 2a  Obj(char const *
6da0: 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62  zText){.  Tcl_Ob
6db0: 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66 20  j *pVal;.#ifdef 
6dc0: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
6dd0: 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f 44 53 74  NEEDED.  Tcl_DSt
6de0: 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c  ring dCol;.  Tcl
6df0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 43  _DStringInit(&dC
6e00: 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72  ol);.  Tcl_Exter
6e10: 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28  nalToUtfDString(
6e20: 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  NULL, zText, -1,
6e30: 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20   &dCol);.  pVal 
6e40: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
6e50: 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  bj(Tcl_DStringVa
6e60: 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b  lue(&dCol), -1);
6e70: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
6e80: 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65  ee(&dCol);.#else
6e90: 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65  .  pVal = Tcl_Ne
6ea0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74  wStringObj(zText
6eb0: 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
6ec0: 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a  return pVal;.}..
6ed0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6ee0: 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20  ne reads a line 
6ef0: 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c  of text from FIL
6f00: 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20  E in, stores.** 
6f10: 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f  the text in memo
6f20: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
6f30: 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65   malloc() and re
6f40: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
6f50: 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20  ** to the text. 
6f60: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
6f70: 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65  d at end of file
6f80: 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29  , or if malloc()
6f90: 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  .** fails..**.**
6fa0: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
6fb0: 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e 65  s like "readline
6fc0: 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64  " but no command
6fd0: 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a  -line editing.**
6fe0: 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
6ff0: 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68 65 6c  copied from shel
7000: 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72  l.c from '.impor
7010: 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74  t' command.*/.st
7020: 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c  atic char *local
7030: 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a  _getline(char *z
7040: 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e  Prompt, FILE *in
7050: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  ){.  char *zLine
7060: 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20  ;.  int nLine;. 
7070: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f   int n;.  int eo
7080: 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30  l;..  nLine = 10
7090: 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c  0;.  zLine = mal
70a0: 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20  loc( nLine );.  
70b0: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
70c0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30  eturn 0;.  n = 0
70d0: 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77  ;.  eol = 0;.  w
70e0: 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20  hile( !eol ){.  
70f0: 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e    if( n+100>nLin
7100: 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  e ){.      nLine
7110: 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30   = nLine*2 + 100
7120: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20  ;.      zLine = 
7130: 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e  realloc(zLine, n
7140: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
7150: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
7160: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
7170: 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65  if( fgets(&zLine
7180: 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20  [n], nLine - n, 
7190: 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  in)==0 ){.      
71a0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
71b0: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
71c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
71d0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
71e0: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
71f0: 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20       eol = 1;.  
7200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7210: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  .    while( zLin
7220: 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  e[n] ){ n++; }. 
7230: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
7240: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29  ine[n-1]=='\n' )
7250: 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  {.      n--;.   
7260: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
7270: 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a  .      eol = 1;.
7280: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e      }.  }.  zLin
7290: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69  e = realloc( zLi
72a0: 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74  ne, n+1 );.  ret
72b0: 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f  urn zLine;.}.../
72c0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
72d0: 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  on is part of th
72e0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
72f0: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a   of the command:
7300: 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72 61  .**.**   $db tra
7310: 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72  nsaction [-defer
7320: 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d  red|-immediate|-
7330: 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50  exclusive] SCRIP
7340: 54 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e  T.**.** It is in
7350: 76 6f 6b 65 64 20 61 66 74 65 72 20 65 76 61 6c  voked after eval
7360: 75 61 74 69 6e 67 20 74 68 65 20 73 63 72 69 70  uating the scrip
7370: 74 20 53 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d  t SCRIPT to comm
7380: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a  it or rollback.*
7390: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
73a0: 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 6f  n or savepoint o
73b0: 70 65 6e 65 64 20 62 79 20 74 68 65 20 5b 74 72  pened by the [tr
73c0: 61 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61  ansaction] comma
73d0: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
73e0: 74 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64  t DbTransPostCmd
73f0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64  (.  ClientData d
7400: 61 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20  ata[],          
7410: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61           /* data
7420: 5b 30 5d 20 69 73 20 74 68 65 20 53 71 6c 69 74  [0] is the Sqlit
7430: 65 33 44 62 2a 20 66 6f 72 20 24 64 62 20 2a 2f  e3Db* for $db */
7440: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
7450: 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20 20  nterp,          
7460: 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69          /* Tcl i
7470: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
7480: 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20 20  int result      
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
74b0: 66 20 65 76 61 6c 75 61 74 69 6e 67 20 53 43 52  f evaluating SCR
74c0: 49 50 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  IPT */.){.  stat
74d0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
74e0: 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  zEnd[] = {.    "
74f0: 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61  RELEASE _tcl_tra
7500: 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  nsaction",      
7510: 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52    /* rc==TCL_ERR
7520: 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e  OR, nTransaction
7530: 21 3d 30 20 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d  !=0 */.    "COMM
7540: 49 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  IT",            
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7560: 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 2c 20   rc!=TCL_ERROR, 
7570: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20  nTransaction==0 
7580: 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b  */.    "ROLLBACK
7590: 20 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63   TO _tcl_transac
75a0: 74 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45 20 5f  tion ; RELEASE _
75b0: 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
75c0: 2c 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22  ,.    "ROLLBACK"
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d           /* rc==
75f0: 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e  TCL_ERROR, nTran
7600: 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20  saction==0 */.  
7610: 7d 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  };.  SqliteDb *p
7620: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
7630: 64 61 74 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 72  data[0];.  int r
7640: 63 20 3d 20 72 65 73 75 6c 74 3b 0a 20 20 63 6f  c = result;.  co
7650: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a  nst char *zEnd;.
7660: 0a 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63  .  pDb->nTransac
7670: 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d  tion--;.  zEnd =
7680: 20 61 7a 45 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f   azEnd[(rc==TCL_
7690: 45 52 52 4f 52 29 2a 32 20 2b 20 28 70 44 62 2d  ERROR)*2 + (pDb-
76a0: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30  >nTransaction==0
76b0: 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e 64 69 73 61  )];..  pDb->disa
76c0: 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 69 66 28  bleAuth++;.  if(
76d0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
76e0: 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20  b->db, zEnd, 0, 
76f0: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f  0, 0) ){.      /
7700: 2a 20 54 68 69 73 20 69 73 20 61 20 74 72 69 63  * This is a tric
7710: 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f 20 68  ky scenario to h
7720: 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74 20  andle. The most 
7730: 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f 66 20  likely cause of 
7740: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  an.      ** erro
7750: 72 20 69 73 20 74 68 61 74 20 74 68 65 20 65 78  r is that the ex
7760: 65 63 28 29 20 61 62 6f 76 65 20 77 61 73 20 61  ec() above was a
7770: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d  n attempt to com
7780: 6d 69 74 20 74 68 65 20 0a 20 20 20 20 20 20 2a  mit the .      *
7790: 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e  * top-level tran
77a0: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72 65 74  saction that ret
77b0: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 42 55 53  urned SQLITE_BUS
77c0: 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b 65  Y. Or, less like
77d0: 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ly,.      ** tha
77e0: 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68 61  t an IO-error ha
77f0: 73 20 6f 63 63 75 72 65 64 2e 20 49 6e 20 65 69  s occured. In ei
7800: 74 68 65 72 20 63 61 73 65 2c 20 74 68 72 6f 77  ther case, throw
7810: 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e   a Tcl exception
7820: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 72  .      ** and tr
7830: 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  y to rollback th
7840: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
7850: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
7860: 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20 61 6c   But it could al
7870: 73 6f 20 62 65 20 74 68 61 74 20 74 68 65 20 75  so be that the u
7880: 73 65 72 20 65 78 65 63 75 74 65 64 20 6f 6e 65  ser executed one
7890: 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e 2c 20   or more BEGIN, 
78a0: 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54  .      ** COMMIT
78b0: 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c  , SAVEPOINT, REL
78c0: 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  EASE or ROLLBACK
78d0: 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 61   commands that a
78e0: 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20  re confusing.   
78f0: 20 20 20 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f     ** this metho
7900: 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63  d's logic. Not c
7910: 6c 65 61 72 20 68 6f 77 20 74 68 69 73 20 77 6f  lear how this wo
7920: 75 6c 64 20 62 65 20 62 65 73 74 20 68 61 6e 64  uld be best hand
7930: 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
7940: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45 52    if( rc!=TCL_ER
7950: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ROR ){.      Tcl
7960: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7970: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
7980: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
7990: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
79a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
79b0: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
79c0: 70 44 62 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41  pDb->db, "ROLLBA
79d0: 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  CK", 0, 0, 0);. 
79e0: 20 7d 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c   }.  pDb->disabl
79f0: 65 41 75 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75  eAuth--;..  retu
7a00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7a10: 53 65 61 72 63 68 20 74 68 65 20 63 61 63 68 65  Search the cache
7a20: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 2d   for a prepared-
7a30: 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74  statement object
7a40: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
7a50: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 53 51   the.** first SQ
7a60: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  L statement in t
7a70: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
7a80: 64 20 74 6f 20 62 79 20 70 61 72 61 6d 65 74 65  d to by paramete
7a90: 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f 20  r zIn. If.** no 
7aa0: 73 75 63 68 20 70 72 65 70 61 72 65 64 2d 73 74  such prepared-st
7ab0: 61 74 65 6d 65 6e 74 20 63 61 6e 20 62 65 20 66  atement can be f
7ac0: 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65 20 61  ound, allocate a
7ad0: 6e 64 20 70 72 65 70 61 72 65 20 61 20 6e 65 77  nd prepare a new
7ae0: 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69 74 68  .** one. In eith
7af0: 65 72 20 63 61 73 65 2c 20 62 69 6e 64 20 74 68  er case, bind th
7b00: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
7b10: 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74   of the relevant
7b20: 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65   Tcl.** variable
7b30: 73 20 74 6f 20 61 6e 79 20 24 76 61 72 2c 20 3a  s to any $var, :
7b40: 76 61 72 20 6f 72 20 40 76 61 72 20 76 61 72 69  var or @var vari
7b50: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 74 61  ables in the sta
7b60: 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65 0a 2a  tement. Before.*
7b70: 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74  * returning, set
7b80: 20 2a 70 70 50 72 65 53 74 6d 74 20 74 6f 20 70   *ppPreStmt to p
7b90: 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 72 65 70  oint to the prep
7ba0: 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f  ared-statement o
7bb0: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74  bject..**.** Out
7bc0: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70  put parameter *p
7bd0: 7a 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70  zOut is set to p
7be0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  oint to the next
7bf0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
7c00: 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49 6e 2c  n.** buffer zIn,
7c10: 20 6f 72 20 74 6f 20 74 68 65 20 27 5c 30 27 20   or to the '\0' 
7c20: 62 79 74 65 20 61 74 20 74 68 65 20 65 6e 64 20  byte at the end 
7c30: 6f 66 20 7a 49 6e 20 69 66 20 74 68 65 72 65 20  of zIn if there 
7c40: 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73 74  is no.** next st
7c50: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  atement..**.** I
7c60: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 54 43  f successful, TC
7c70: 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  L_OK is returned
7c80: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 54 43 4c  . Otherwise, TCL
7c90: 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e  _ERROR is return
7ca0: 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
7cb0: 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f 61 64 65  or message loade
7cc0: 64 20 69 6e 74 6f 20 69 6e 74 65 72 70 72 65 74  d into interpret
7cd0: 65 72 20 70 44 62 2d 3e 69 6e 74 65 72 70 2e 0a  er pDb->interp..
7ce0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
7cf0: 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 0a  PrepareAndBind(.
7d00: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c    SqliteDb *pDb,
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 62    /* Database ob
7d30: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 63  ject */.  char c
7d40: 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20 20 20  onst *zIn,      
7d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
7d60: 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20   to compile */. 
7d70: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
7d80: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
7d90: 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72   /* OUT: Pointer
7da0: 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74 61   to next SQL sta
7db0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71 6c 50  tement */.  SqlP
7dc0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 2a 70 70  reparedStmt **pp
7dd0: 50 72 65 53 74 6d 74 20 20 20 20 20 2f 2a 20 4f  PreStmt     /* O
7de0: 55 54 3a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  UT: Object used 
7df0: 74 6f 20 63 61 63 68 65 20 73 74 61 74 65 6d 65  to cache stateme
7e00: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  nt */.){.  const
7e10: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 7a 49   char *zSql = zI
7e20: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  n;         /* Po
7e30: 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 53  inter to first S
7e40: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
7e50: 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  zIn */.  sqlite3
7e60: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
7e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
7e80: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6f  ared statement o
7e90: 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c 50 72  bject */.  SqlPr
7ea0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
7eb0: 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 50 6f  Stmt;      /* Po
7ec0: 69 6e 74 65 72 20 74 6f 20 63 61 63 68 65 64 20  inter to cached 
7ed0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
7ee0: 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20 20  nt nSql;        
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f00: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
7f10: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
7f20: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 72 69  * Number of vari
7f50: 61 62 6c 65 73 20 69 6e 20 73 74 61 74 65 6d 65  ables in stateme
7f60: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  nt */.  int iPar
7f70: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
7f80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
7f90: 66 72 65 65 20 65 6e 74 72 79 20 69 6e 20 61 70  free entry in ap
7fa0: 50 61 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  Parm */.  int i;
7fb0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
7fc0: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
7fd0: 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72 65 53 74  erp;..  *ppPreSt
7fe0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 72  mt = 0;..  /* Tr
7ff0: 69 6d 20 73 70 61 63 65 73 20 66 72 6f 6d 20 74  im spaces from t
8000: 68 65 20 73 74 61 72 74 20 6f 66 20 7a 53 71 6c  he start of zSql
8010: 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 74   and calculate t
8020: 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 6c 65 6e  he remaining len
8030: 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  gth. */.  while(
8040: 20 69 73 73 70 61 63 65 28 7a 53 71 6c 5b 30 5d   isspace(zSql[0]
8050: 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20  ) ){ zSql++; }. 
8060: 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30   nSql = strlen30
8070: 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f 72 28 70  (zSql);..  for(p
8080: 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73  PreStmt = pDb->s
8090: 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d  tmtList; pPreStm
80a0: 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65  t; pPreStmt=pPre
80b0: 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Stmt->pNext){.  
80c0: 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74    int n = pPreSt
80d0: 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 69 66  mt->nSql;.    if
80e0: 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20 20 20 20  ( nSql>=n .     
80f0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72     && memcmp(pPr
8100: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
8110: 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20  l, n)==0.       
8120: 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20   && (zSql[n]==0 
8130: 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b  || zSql[n-1]==';
8140: 27 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ').    ){.      
8150: 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  pStmt = pPreStmt
8160: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 2a  ->pStmt;.      *
8170: 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c 5b 70 50  pzOut = &zSql[pP
8180: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a  reStmt->nSql];..
8190: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20        /* When a 
81a0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
81b0: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c  nt is found, unl
81c0: 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ink it from the.
81d0: 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c        ** cache l
81e0: 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61  ist.  It will la
81f0: 74 65 72 20 62 65 20 61 64 64 65 64 20 62 61 63  ter be added bac
8200: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
8210: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ng.      ** of t
8220: 68 65 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e  he cache list in
8230: 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
8240: 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d  ent LRU replacem
8250: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
8260: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
8270: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
8280: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
8290: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65  ev->pNext = pPre
82a0: 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Stmt->pNext;.   
82b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
82c0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
82d0: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
82e0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
82f0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70   if( pPreStmt->p
8300: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
8310: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d  pPreStmt->pNext-
8320: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
8330: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
8340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
8350: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
8360: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
8370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44        }.      pD
8380: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
8390: 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33    nVar = sqlite3
83a0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
83b0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
83c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
83d0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
83e0: 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74 61 74  no prepared stat
83f0: 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e  ement was found.
8400: 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c   Compile the SQL
8410: 20 74 65 78 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f   text. Also allo
8420: 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e 65 77 20  cate.  ** a new 
8430: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
8440: 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 20  structure.  */. 
8450: 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30   if( pPreStmt==0
8460: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
8470: 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49  e;..    if( SQLI
8480: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70  TE_OK!=sqlite3_p
8490: 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64  repare_v2(pDb->d
84a0: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
84b0: 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b 0a 20  tmt, pzOut) ){. 
84c0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
84d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
84e0: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
84f0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
8500: 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
8510: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8520: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74   }.    if( pStmt
8530: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
8540: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
8550: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
8560: 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >db) ){.        
8570: 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  /* A compile-tim
8580: 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73  e error in the s
8590: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20  tatement. */.   
85a0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
85b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
85c0: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
85d0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
85e0: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
85f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8600: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8610: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
8620: 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70  ment was a no-op
8630: 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74  .  Continue to t
8640: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
8650: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
8660: 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a  the SQL string..
8670: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
8680: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
8690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
86a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
86b0: 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  eStmt==0 );.    
86c0: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
86d0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
86e0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
86f0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 53  nByte = sizeof(S
8700: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 29 20  qlPreparedStmt) 
8710: 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 54 63  + nVar*sizeof(Tc
8720: 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20 20 70 50  l_Obj *);.    pP
8730: 72 65 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65  reStmt = (SqlPre
8740: 70 61 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41  paredStmt*)Tcl_A
8750: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20  lloc(nByte);.   
8760: 20 6d 65 6d 73 65 74 28 70 50 72 65 53 74 6d 74   memset(pPreStmt
8770: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  , 0, nByte);..  
8780: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d    pPreStmt->pStm
8790: 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 70  t = pStmt;.    p
87a0: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20  PreStmt->nSql = 
87b0: 28 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29 3b  (*pzOut - zSql);
87c0: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a  .    pPreStmt->z
87d0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
87e0: 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  l(pStmt);.    pP
87f0: 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20 3d  reStmt->apParm =
8800: 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70 50   (Tcl_Obj **)&pP
8810: 72 65 53 74 6d 74 5b 31 5d 3b 0a 20 20 7d 0a 20  reStmt[1];.  }. 
8820: 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d   assert( pPreStm
8830: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
8840: 74 72 6c 65 6e 33 30 28 70 50 72 65 53 74 6d 74  trlen30(pPreStmt
8850: 2d 3e 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74 6d  ->zSql)==pPreStm
8860: 74 2d 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73 73  t->nSql );.  ass
8870: 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70  ert( 0==memcmp(p
8880: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a  PreStmt->zSql, z
8890: 53 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e  Sql, pPreStmt->n
88a0: 53 71 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42 69  Sql) );..  /* Bi
88b0: 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72  nd values to par
88c0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67  ameters that beg
88d0: 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 20 2a  in with $ or : *
88e0: 2f 20 20 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  /  .  for(i=1; i
88f0: 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <=nVar; i++){.  
8900: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
8910: 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  ar = sqlite3_bin
8920: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
8930: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
8940: 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28  if( zVar!=0 && (
8950: 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20  zVar[0]=='$' || 
8960: 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20  zVar[0]==':' || 
8970: 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b  zVar[0]=='@') ){
8980: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
8990: 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61  pVar = Tcl_GetVa
89a0: 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56  r2Ex(interp, &zV
89b0: 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20  ar[1], 0, 0);.  
89c0: 20 20 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a      if( pVar ){.
89d0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
89e0: 20 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b         u8 *data;
89f0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
8a00: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56  har *zType = (pV
8a10: 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56  ar->typePtr ? pV
8a20: 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
8a30: 65 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  e : "");.       
8a40: 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b   char c = zType[
8a50: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
8a60: 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a  zVar[0]=='@' ||.
8a70: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
8a80: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
8a90: 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d  pe,"bytearray")=
8aa0: 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65  =0 && pVar->byte
8ab0: 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  s==0) ){.       
8ac0: 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f     /* Load a BLO
8ad0: 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63  B type if the Tc
8ae0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20  l variable is a 
8af0: 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20  bytearray and.  
8b00: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
8b10: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
8b20: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68  esentation or th
8b30: 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20  e host.         
8b40: 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61   ** parameter na
8b50: 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
8b60: 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  @". */.         
8b70: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
8b80: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
8b90: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
8ba0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
8bb0: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c  d_blob(pStmt, i,
8bc0: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
8bd0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
8be0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
8bf0: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
8c00: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
8c10: 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20  apParm[iParm++] 
8c20: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
8c30: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
8c40: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
8c50: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
8c60: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
8c70: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
8c80: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b  terp, pVar, &n);
8c90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8ca0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
8cb0: 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t, i, n);.      
8cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
8cd0: 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  d' && strcmp(zTy
8ce0: 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  pe,"double")==0 
8cf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ){.          dou
8d00: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20  ble r;.         
8d10: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
8d20: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
8d30: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20  ar, &r);.       
8d40: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
8d50: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c  double(pStmt, i,
8d60: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   r);.        }el
8d70: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
8d80: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
8d90: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
8da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
8db0: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
8dc0: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
8dd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
8de0: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
8df0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57          Tcl_GetW
8e00: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
8e10: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b  terp, pVar, &v);
8e20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8e30: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
8e40: 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20  tmt, i, v);.    
8e50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8e60: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
8e70: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
8e80: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8e90: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
8ea0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
8eb0: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
8ec0: 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  i, (char *)data,
8ed0: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
8ee0: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  C);.          Tc
8ef0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
8f00: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
8f10: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
8f20: 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [iParm++] = pVar
8f30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8f40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8f50: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
8f60: 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  ll(pStmt, i);.  
8f70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8f80: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72    pPreStmt->nPar
8f90: 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70  m = iParm;.  *pp
8fa0: 50 72 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74  PreStmt = pPreSt
8fb0: 6d 74 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 73  mt;..  /* Call s
8fc0: 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a  qlite3_reoptimiz
8fd0: 65 28 29 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  e() to optimize 
8fe0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 63  the statement ac
8ff0: 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  cording to.  ** 
9000: 74 68 65 20 76 61 6c 75 65 73 20 6a 75 73 74 20  the values just 
9010: 62 6f 75 6e 64 20 74 6f 20 69 74 2e 20 49 66 20  bound to it. If 
9020: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
9030: 41 54 32 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  AT2 is not defin
9040: 65 64 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 73  ed.  ** or the s
9050: 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 6e 6f  tatement will no
9060: 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 72  t benefit from r
9070: 65 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  e-optimization, 
9080: 74 68 69 73 20 0a 20 20 2a 2a 20 63 61 6c 6c 20  this .  ** call 
9090: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 2a 2f 0a  is a no-op.  */.
90a0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
90b0: 3d 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d  =sqlite3_reoptim
90c0: 69 7a 65 28 70 50 72 65 53 74 6d 74 2d 3e 70 53  ize(pPreStmt->pS
90d0: 74 6d 74 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  tmt) ){.    Tcl_
90e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
90f0: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
9100: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
9110: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
9120: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9130: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
9140: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
9150: 2a 20 52 65 6c 65 61 73 65 20 61 20 73 74 61 74  * Release a stat
9160: 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
9170: 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c  obtained by call
9180: 69 6e 67 20 64 62 50 72 65 70 61 72 65 41 6e 64  ing dbPrepareAnd
9190: 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65 72 65  Bind()..** There
91a0: 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61 63 74   should be exact
91b0: 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74  ly one call to t
91c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  his function for
91d0: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a   each call to.**
91e0: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
91f0: 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  d()..**.** If th
9200: 65 20 64 69 73 63 61 72 64 20 70 61 72 61 6d 65  e discard parame
9210: 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
9220: 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d   then the statem
9230: 65 6e 74 20 69 73 20 64 65 6c 65 74 65 64 0a 2a  ent is deleted.*
9240: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f  * immediately. O
9250: 74 68 65 72 77 69 73 65 20 69 74 20 69 73 20 61  therwise it is a
9260: 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
9270: 6c 69 73 74 20 61 6e 64 20 6d 61 79 20 62 65 20  list and may be 
9280: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79 20 61  returned.** by a
9290: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
92a0: 20 74 6f 20 64 62 50 72 65 70 61 72 65 41 6e 64   to dbPrepareAnd
92b0: 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Bind()..*/.stati
92c0: 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65  c void dbRelease
92d0: 53 74 6d 74 28 0a 20 20 53 71 6c 69 74 65 44 62  Stmt(.  SqliteDb
92e0: 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20   *pDb,          
92f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
9300: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
9310: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
9320: 2a 70 50 72 65 53 74 6d 74 2c 20 20 20 20 20 20  *pPreStmt,      
9330: 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74  /* Prepared stat
9340: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74 6f 20  ement handle to 
9350: 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
9360: 20 64 69 73 63 61 72 64 20 20 20 20 20 20 20 20   discard        
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9380: 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65 20 28  True to delete (
9390: 6e 6f 74 20 63 61 63 68 65 29 20 74 68 65 20 70  not cache) the p
93a0: 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20  PreStmt */.){.  
93b0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65  int i;..  /* Fre
93c0: 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69  e the bound stri
93d0: 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61  ng and blob para
93e0: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f 72 28  meters */.  for(
93f0: 69 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d 74 2d  i=0; i<pPreStmt-
9400: 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nParm; i++){.  
9410: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
9420: 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e 61 70 50  nt(pPreStmt->apP
9430: 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  arm[i]);.  }.  p
9440: 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d  PreStmt->nParm =
9450: 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e   0;..  if( pDb->
9460: 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20 64 69  maxStmt<=0 || di
9470: 73 63 61 72 64 20 29 7b 0a 20 20 20 20 2f 2a 20  scard ){.    /* 
9480: 49 66 20 74 68 65 20 63 61 63 68 65 20 69 73 20  If the cache is 
9490: 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c  turned off, deal
94a0: 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74 61 74  located the stat
94b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
94c0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 50  ite3_finalize(pP
94d0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a  reStmt->pStmt);.
94e0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
94f0: 61 72 20 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  ar *)pPreStmt);.
9500: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
9510: 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64  Add the prepared
9520: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
9530: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
9540: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a  he cache list. *
9550: 2f 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  /.    pPreStmt->
9560: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
9570: 74 4c 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53  tList;.    pPreS
9580: 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  tmt->pPrev = 0;.
9590: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
95a0: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44  tList ){.     pD
95b0: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72  b->stmtList->pPr
95c0: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  ev = pPreStmt;. 
95d0: 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74     }.    pDb->st
95e0: 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d  mtList = pPreStm
95f0: 74 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  t;.    if( pDb->
9600: 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  stmtLast==0 ){. 
9610: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
9620: 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->nStmt==0 );.  
9630: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
9640: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
9650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
9660: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
9670: 74 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t>0 );.    }.   
9680: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20   pDb->nStmt++;. 
9690: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20    .    /* If we 
96a0: 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74  have too many st
96b0: 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65  atement in cache
96c0: 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72  , remove the sur
96d0: 70 6c 75 73 20 66 72 6f 6d 20 0a 20 20 20 20 2a  plus from .    *
96e0: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
96f0: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 2a 2f   cache list.  */
9700: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d  .    while( pDb-
9710: 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53  >nStmt>pDb->maxS
9720: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tmt ){.      sql
9730: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44  ite3_finalize(pD
9740: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74  b->stmtLast->pSt
9750: 6d 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  mt);.      pDb->
9760: 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e  stmtLast = pDb->
9770: 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b  stmtLast->pPrev;
9780: 0a 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28  .      Tcl_Free(
9790: 28 63 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74  (char*)pDb->stmt
97a0: 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20  Last->pNext);.  
97b0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
97c0: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
97d0: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
97e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
97f0: 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
9800: 73 65 64 20 77 69 74 68 20 64 62 45 76 61 6c 58  sed with dbEvalX
9810: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  XX() functions:.
9820: 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61 6c 49 6e  **.**   dbEvalIn
9830: 69 74 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  it().**   dbEval
9840: 53 74 65 70 28 29 0a 2a 2a 20 20 20 64 62 45 76  Step().**   dbEv
9850: 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20  alFinalize().** 
9860: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
9870: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 43 6f 6c  ).**   dbEvalCol
9880: 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a 74 79  umnValue().*/.ty
9890: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 62 45  pedef struct DbE
98a0: 76 61 6c 43 6f 6e 74 65 78 74 20 44 62 45 76 61  valContext DbEva
98b0: 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  lContext;.struct
98c0: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 7b   DbEvalContext {
98d0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
98e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
98f0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
9900: 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f  andle */.  Tcl_O
9910: 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20 20 20 20  bj *pSql;       
9920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
9930: 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20 73 74 72  ject holding str
9940: 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f  ing zSql */.  co
9950: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9970: 20 52 65 6d 61 69 6e 69 6e 67 20 53 51 4c 20 74   Remaining SQL t
9980: 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 53  o execute */.  S
9990: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
99a0: 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f  pPreStmt;      /
99b0: 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * Current statem
99c0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ent */.  int nCo
99d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
99e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
99f0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
9a00: 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20  turned by pStmt 
9a10: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41  */.  Tcl_Obj *pA
9a20: 72 72 61 79 3b 20 20 20 20 20 20 20 20 20 20 20  rray;           
9a30: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
9a40: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20 2a  array variable *
9a50: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70  /.  Tcl_Obj **ap
9a60: 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ColName;        
9a70: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
9a80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
9a90: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  };../*.** Releas
9aa0: 65 20 61 6e 79 20 63 61 63 68 65 20 6f 66 20 63  e any cache of c
9ab0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72  olumn names curr
9ac0: 65 6e 74 6c 79 20 68 65 6c 64 20 61 73 20 70 61  ently held as pa
9ad0: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 44 62 45  rt of.** the DbE
9ae0: 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63  valContext struc
9af0: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
9b00: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
9b10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9b20: 64 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d  d dbReleaseColum
9b30: 6e 4e 61 6d 65 73 28 44 62 45 76 61 6c 43 6f 6e  nNames(DbEvalCon
9b40: 74 65 78 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  text *p){.  if( 
9b50: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a  p->apColName ){.
9b60: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
9b70: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
9b80: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  l; i++){.      T
9b90: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
9ba0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  p->apColName[i])
9bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
9bc0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 2d 3e  Free((char *)p->
9bd0: 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  apColName);.    
9be0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30  p->apColName = 0
9bf0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20  ;.  }.  p->nCol 
9c00: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
9c10: 69 74 69 61 6c 69 7a 65 20 61 20 44 62 45 76 61  itialize a DbEva
9c20: 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  lContext structu
9c30: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72  re..**.** If pAr
9c40: 72 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ray is not NULL,
9c50: 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e   then it contain
9c60: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
9c70: 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76 61 72  Tcl array.** var
9c80: 69 61 62 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d  iable. The "*" m
9c90: 65 6d 62 65 72 20 6f 66 20 74 68 69 73 20 61 72  ember of this ar
9ca0: 72 61 79 20 69 73 20 73 65 74 20 74 6f 20 61 20  ray is set to a 
9cb0: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  list containing.
9cc0: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
9cd0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  the columns retu
9ce0: 72 6e 65 64 20 62 79 20 74 68 65 20 73 74 61 74  rned by the stat
9cf0: 65 6d 65 6e 74 20 61 73 20 70 61 72 74 20 6f 66  ement as part of
9d00: 20 65 61 63 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f   each.** call to
9d10: 20 64 62 45 76 61 6c 53 74 65 70 28 29 2c 20 69   dbEvalStep(), i
9d20: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6c 65 66  n order from lef
9d30: 74 20 74 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e  t to right. e.g.
9d40: 20 69 66 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a   if the names .*
9d50: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
9d60: 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 2c  d columns are a,
9d70: 20 62 20 61 6e 64 20 63 2c 20 69 74 20 64 6f 65   b and c, it doe
9d80: 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
9d90: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 74 63 6c 20   of the .** tcl 
9da0: 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20  command:.**.**  
9db0: 20 20 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d     set ${pArray}
9dc0: 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73  (*) {a b c}.*/.s
9dd0: 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61  tatic void dbEva
9de0: 6c 49 6e 69 74 28 0a 20 20 44 62 45 76 61 6c 43  lInit(.  DbEvalC
9df0: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
9e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9e10: 74 65 72 20 74 6f 20 73 74 72 75 63 74 75 72 65  ter to structure
9e20: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a   to initialize *
9e30: 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  /.  SqliteDb *pD
9e40: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
9e50: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9e60: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f  handle */.  Tcl_
9e70: 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20 20 20 20  Obj *pSql,      
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9e90: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67  bject containing
9ea0: 20 53 51 4c 20 73 63 72 69 70 74 20 2a 2f 0a 20   SQL script */. 
9eb0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54 63 6c 20   /* Name of Tcl 
9ee0: 61 72 72 61 79 20 74 6f 20 73 65 74 20 28 2a 29  array to set (*)
9ef0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a 2f 0a 29   element of */.)
9f00: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
9f10: 20 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f   sizeof(DbEvalCo
9f20: 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d 3e 70 44  ntext));.  p->pD
9f30: 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d 3e 7a 53  b = pDb;.  p->zS
9f40: 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
9f50: 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70 2d 3e 70  ng(pSql);.  p->p
9f60: 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20 20 54 63  Sql = pSql;.  Tc
9f70: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
9f80: 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 41 72 72  Sql);.  if( pArr
9f90: 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 41 72  ay ){.    p->pAr
9fa0: 72 61 79 20 3d 20 70 41 72 72 61 79 3b 0a 20 20  ray = pArray;.  
9fb0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9fc0: 6e 74 28 70 41 72 72 61 79 29 3b 0a 20 20 7d 0a  nt(pArray);.  }.
9fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
9fe0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
9ff0: 74 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 74  t the row that t
a000: 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  he DbEvalContext
a010: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
a020: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
a030: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
a040: 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
a050: 76 6f 69 64 20 64 62 45 76 61 6c 52 6f 77 49 6e  void dbEvalRowIn
a060: 66 6f 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74  fo(.  DbEvalCont
a070: 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ext *p,         
a080: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
a090: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ion context */. 
a0a0: 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   int *pnCol,    
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
a0d0: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
a0e0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a  */.  Tcl_Obj ***
a0f0: 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20 20 20 20  papColName      
a100: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72       /* OUT: Arr
a110: 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ay of column nam
a120: 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f  es */.){.  /* Co
a130: 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  mpute column nam
a140: 65 73 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  es */.  if( 0==p
a150: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20  ->apColName ){. 
a160: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
a170: 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65  *pStmt = p->pPre
a180: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  Stmt->pStmt;.   
a190: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a1b0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
a1c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
a1d0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
a1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a1f0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
a200: 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20  turned by pStmt 
a210: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
a220: 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20  *apColName = 0; 
a230: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
a240: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
a250: 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20  ..    p->nCol = 
a260: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
a270: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
a280: 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c  t);.    if( nCol
a290: 3e 30 20 26 26 20 28 70 61 70 43 6f 6c 4e 61 6d  >0 && (papColNam
a2a0: 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61 79 29 20  e || p->pArray) 
a2b0: 29 7b 0a 20 20 20 20 20 20 61 70 43 6f 6c 4e 61  ){.      apColNa
a2c0: 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29  me = (Tcl_Obj**)
a2d0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
a2e0: 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c  f(Tcl_Obj*)*nCol
a2f0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
a300: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
a310: 0a 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61  .        apColNa
a320: 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78 74 54 6f  me[i] = dbTextTo
a330: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  Obj(sqlite3_colu
a340: 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  mn_name(pStmt,i)
a350: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  );.        Tcl_I
a360: 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f  ncrRefCount(apCo
a370: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
a380: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 6f   }.      p->apCo
a390: 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e 61 6d  lName = apColNam
a3a0: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
a3b0: 20 49 66 20 72 65 73 75 6c 74 73 20 61 72 65 20   If results are 
a3c0: 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20  being stored in 
a3d0: 61 6e 20 61 72 72 61 79 20 76 61 72 69 61 62 6c  an array variabl
a3e0: 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20  e, then create. 
a3f0: 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28     ** the array(
a400: 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61  *) entry for tha
a410: 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2f 0a 20  t array.    */. 
a420: 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79     if( p->pArray
a430: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e   ){.      Tcl_In
a440: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70  terp *interp = p
a450: 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  ->pDb->interp;. 
a460: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43       Tcl_Obj *pC
a470: 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77  olList = Tcl_New
a480: 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c  Obj();.      Tcl
a490: 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63  _Obj *pStar = Tc
a4a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
a4b0: 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 20 20  *", -1);..      
a4c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
a4d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54   i++){.        T
a4e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
a4f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
a500: 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e  pColList, apColN
a510: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ame[i]);.      }
a520: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
a530: 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a  efCount(pStar);.
a540: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
a550: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 2d 3e  Var2(interp, p->
a560: 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70  pArray, pStar, p
a570: 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  ColList, 0);.   
a580: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
a590: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
a5a0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 70  }.  }..  if( pap
a5b0: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2a  ColName ){.    *
a5c0: 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e  papColName = p->
a5d0: 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20  apColName;.  }. 
a5e0: 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b 0a 20 20   if( pnCol ){.  
a5f0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43    *pnCol = p->nC
a600: 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol;.  }.}../*.**
a610: 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 54   Return one of T
a620: 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45 41 4b  CL_OK, TCL_BREAK
a630: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e 20 49   or TCL_ERROR. I
a640: 66 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 0a 2a  f TCL_ERROR is.*
a650: 2a 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  * returned, then
a660: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
a670: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
a680: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 62  he interpreter b
a690: 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
a6a0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 74 75  ng..**.** A retu
a6b0: 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 43 4c 5f  rn value of TCL_
a6c0: 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  OK means there i
a6d0: 73 20 61 20 72 6f 77 20 6f 66 20 64 61 74 61 20  s a row of data 
a6e0: 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 0a 2a  available. The.*
a6f0: 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 61 63  * data may be ac
a700: 63 65 73 73 65 64 20 75 73 69 6e 67 20 64 62 45  cessed using dbE
a710: 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20 61 6e 64  valRowInfo() and
a720: 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c   dbEvalColumnVal
a730: 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73  ue(). This.** is
a740: 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20 61 20   analogous to a 
a750: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
a760: 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c 69 74 65  _ROW from sqlite
a770: 33 5f 73 74 65 70 28 29 2e 20 49 66 20 54 43 4c  3_step(). If TCL
a780: 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20 72 65 74  _BREAK.** is ret
a790: 75 72 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urned, then the 
a7a0: 53 51 4c 20 73 63 72 69 70 74 20 68 61 73 20 66  SQL script has f
a7b0: 69 6e 69 73 68 65 64 20 65 78 65 63 75 74 69 6e  inished executin
a7c0: 67 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 0a  g and there are.
a7d0: 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72 20 72 6f  ** no further ro
a7e0: 77 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  ws available. Th
a7f0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
a800: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f   SQLITE_DONE..*/
a810: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 45 76  .static int dbEv
a820: 61 6c 53 74 65 70 28 44 62 45 76 61 6c 43 6f 6e  alStep(DbEvalCon
a830: 74 65 78 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c  text *p){.  whil
a840: 65 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c  e( p->zSql[0] ||
a850: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a   p->pPreStmt ){.
a860: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
a870: 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 3d  if( p->pPreStmt=
a880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
a890: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
a8a0: 64 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 7a 53 71  d(p->pDb, p->zSq
a8b0: 6c 2c 20 26 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d  l, &p->zSql, &p-
a8c0: 3e 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20  >pPreStmt);.    
a8d0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
a8e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a8f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a900: 6e 74 20 72 63 73 3b 0a 20 20 20 20 20 20 53 71  nt rcs;.      Sq
a910: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 70 2d  liteDb *pDb = p-
a920: 3e 70 44 62 3b 0a 20 20 20 20 20 20 53 71 6c 50  >pDb;.      SqlP
a930: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
a940: 65 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53  eStmt = p->pPreS
a950: 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tmt;.      sqlit
a960: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
a970: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
a980: 3b 0a 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73  ;..      rcs = s
a990: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
a9a0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
a9b0: 73 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  s==SQLITE_ROW ){
a9c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a9d0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  TCL_OK;.      }.
a9e0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72        if( p->pAr
a9f0: 72 61 79 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ray ){.        d
aa00: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20  bEvalRowInfo(p, 
aa10: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
aa20: 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74       rcs = sqlit
aa30: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
aa40: 0a 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74  ..      pDb->nSt
aa50: 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ep = sqlite3_stm
aa60: 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53  t_status(pStmt,S
aa70: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
aa80: 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 31  _FULLSCAN_STEP,1
aa90: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53  );.      pDb->nS
aaa0: 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  ort = sqlite3_st
aab0: 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c  mt_status(pStmt,
aac0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
aad0: 53 5f 53 4f 52 54 2c 31 29 3b 0a 20 20 20 20 20  S_SORT,1);.     
aae0: 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e   dbReleaseColumn
aaf0: 4e 61 6d 65 73 28 70 29 3b 0a 20 20 20 20 20 20  Names(p);.      
ab00: 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b  p->pPreStmt = 0;
ab10: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 73 21  ..      if( rcs!
ab20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ab30: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75        /* If a ru
ab40: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63  n-time error occ
ab50: 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20  urs, report the 
ab60: 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72  error and stop r
ab70: 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  eading.        *
ab80: 2a 20 74 68 65 20 53 51 4c 2e 20 20 2a 2f 0a 20  * the SQL.  */. 
ab90: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
aba0: 6a 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  jResult(pDb->int
abb0: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
abc0: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
abd0: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
abe0: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
abf0: 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c  t(pDb, pPreStmt,
ac00: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   1);.        ret
ac10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ac20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ac30: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
ac40: 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c  t(pDb, pPreStmt,
ac50: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ac60: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
ac70: 69 73 68 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  ished */.  retur
ac80: 6e 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d 0a 0a  n TCL_BREAK;.}..
ac90: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72  /*.** Free all r
aca0: 65 73 6f 75 72 63 65 73 20 63 75 72 72 65 6e 74  esources current
acb0: 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 44  ly held by the D
acc0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
acd0: 75 63 74 75 72 65 20 70 61 73 73 65 64 0a 2a 2a  ucture passed.**
ace0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
acf0: 67 75 6d 65 6e 74 2e 20 54 68 65 72 65 20 73 68  gument. There sh
ad00: 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20  ould be exactly 
ad10: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
ad20: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
ad30: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 64 62   each call to db
ad40: 45 76 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  EvalInit()..*/.s
ad50: 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61  tatic void dbEva
ad60: 6c 46 69 6e 61 6c 69 7a 65 28 44 62 45 76 61 6c  lFinalize(DbEval
ad70: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69  Context *p){.  i
ad80: 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29  f( p->pPreStmt )
ad90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
ada0: 73 65 74 28 70 2d 3e 70 50 72 65 53 74 6d 74 2d  set(p->pPreStmt-
adb0: 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 64 62 52  >pStmt);.    dbR
adc0: 65 6c 65 61 73 65 53 74 6d 74 28 70 2d 3e 70 44  eleaseStmt(p->pD
add0: 62 2c 20 70 2d 3e 70 50 72 65 53 74 6d 74 2c 20  b, p->pPreStmt, 
ade0: 30 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 53  0);.    p->pPreS
adf0: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  tmt = 0;.  }.  i
ae00: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
ae10: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
ae20: 6f 75 6e 74 28 70 2d 3e 70 41 72 72 61 79 29 3b  ount(p->pArray);
ae30: 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d  .    p->pArray =
ae40: 20 30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65   0;.  }.  Tcl_De
ae50: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53  crRefCount(p->pS
ae60: 71 6c 29 3b 0a 20 20 64 62 52 65 6c 65 61 73 65  ql);.  dbRelease
ae70: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a  ColumnNames(p);.
ae80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ae90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
aea0: 63 6c 5f 4f 62 6a 20 73 74 72 75 63 74 75 72 65  cl_Obj structure
aeb0: 20 77 69 74 68 20 72 65 66 2d 63 6f 75 6e 74 20   with ref-count 
aec0: 30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  0 that contains.
aed0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
aee0: 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c   the iCol'th col
aef0: 75 6d 6e 20 6f 66 20 74 68 65 20 72 6f 77 20 63  umn of the row c
af00: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 65 64  urrently pointed
af10: 20 74 6f 20 62 79 0a 2a 2a 20 74 68 65 20 44 62   to by.** the Db
af20: 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75  EvalContext stru
af30: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
af40: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
af50: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  nt..*/.static Tc
af60: 6c 5f 4f 62 6a 20 2a 64 62 45 76 61 6c 43 6f 6c  l_Obj *dbEvalCol
af70: 75 6d 6e 56 61 6c 75 65 28 44 62 45 76 61 6c 43  umnValue(DbEvalC
af80: 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 69  ontext *p, int i
af90: 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Col){.  sqlite3_
afa0: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d  stmt *pStmt = p-
afb0: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
afc0: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
afd0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
afe0: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 20 29 7b 0a  pStmt, iCol) ){.
aff0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b000: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
b010: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
b020: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
b030: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
b040: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
b050: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
b060: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
b070: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
b080: 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79 74 65  f( !zBlob ) byte
b090: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
b0a0: 75 72 6e 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  urn Tcl_NewByteA
b0b0: 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c  rrayObj((u8*)zBl
b0c0: 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  ob, bytes);.    
b0d0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
b0e0: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
b0f0: 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20     sqlite_int64 
b100: 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  v = sqlite3_colu
b110: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
b120: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iCol);.      if(
b130: 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   v>=-2147483647 
b140: 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37  && v<=2147483647
b150: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
b160: 72 6e 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  rn Tcl_NewIntObj
b170: 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
b180: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
b190: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
b1a0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  bj(v);.      }. 
b1b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
b1c0: 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
b1d0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
b1e0: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69  ewDoubleObj(sqli
b1f0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
b200: 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b  e(pStmt, iCol));
b210: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b220: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
b230: 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 54 65       return dbTe
b240: 78 74 54 6f 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e  xtToObj(p->pDb->
b250: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zNull);.    }.  
b260: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 64 62 54 65  }..  return dbTe
b270: 78 74 54 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29  xtToObj((char *)
b280: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b290: 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ext(pStmt, iCol)
b2a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75  );.}../*.** If u
b2b0: 73 69 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e  sing Tcl version
b2c0: 20 38 2e 36 20 6f 72 20 67 72 65 61 74 65 72 2c   8.6 or greater,
b2d0: 20 75 73 65 20 74 68 65 20 4e 52 20 66 75 6e 63   use the NR func
b2e0: 74 69 6f 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a  tions to avoid.*
b2f0: 2a 20 72 65 63 75 72 73 69 76 65 20 65 76 61 6c  * recursive eval
b300: 75 74 69 6f 6e 20 6f 66 20 73 63 72 69 70 74 73  ution of scripts
b310: 20 62 79 20 74 68 65 20 5b 64 62 20 65 76 61 6c   by the [db eval
b320: 5d 20 61 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d  ] and [db trans]
b330: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76  .** commands. Ev
b340: 65 6e 20 69 66 20 74 68 65 20 68 65 61 64 65 72  en if the header
b350: 73 20 75 73 65 64 20 77 68 69 6c 65 20 63 6f 6d  s used while com
b360: 70 69 6c 69 6e 67 20 74 68 65 20 65 78 74 65 6e  piling the exten
b370: 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20  sion.** are 8.6 
b380: 6f 72 20 6e 65 77 65 72 2c 20 74 68 65 20 63 6f  or newer, the co
b390: 64 65 20 73 74 69 6c 6c 20 74 65 73 74 73 20 74  de still tests t
b3a0: 68 65 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 61  he Tcl version a
b3b0: 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68  t runtime..** Th
b3c0: 69 73 20 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d  is allows stubs-
b3d0: 65 6e 61 62 6c 65 64 20 62 75 69 6c 64 73 20 74  enabled builds t
b3e0: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20 6f  o be used with o
b3f0: 6c 64 65 72 20 54 63 6c 20 6c 69 62 72 61 72 69  lder Tcl librari
b400: 65 73 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d  es..*/.#if TCL_M
b410: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c  AJOR_VERSION>8 |
b420: 7c 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  | (TCL_MAJOR_VER
b430: 53 49 4f 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d  SION==8 && TCL_M
b440: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29  INOR_VERSION>=6)
b450: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
b460: 5f 54 43 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69  _TCL_NRE 1.stati
b470: 63 20 69 6e 74 20 44 62 55 73 65 4e 72 65 28 76  c int DbUseNre(v
b480: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f  oid){.  int majo
b490: 72 2c 20 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f  r, minor;.  Tcl_
b4a0: 47 65 74 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f  GetVersion(&majo
b4b0: 72 2c 20 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29  r, &minor, 0, 0)
b4c0: 3b 0a 20 20 72 65 74 75 72 6e 28 20 28 6d 61 6a  ;.  return( (maj
b4d0: 6f 72 3d 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d  or==8 && minor>=
b4e0: 36 29 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b  6) || major>8 );
b4f0: 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20  .}.#else./* .** 
b500: 43 6f 6d 70 69 6c 69 6e 67 20 75 73 69 6e 67 20  Compiling using 
b510: 68 65 61 64 65 72 73 20 65 61 72 6c 69 65 72 20  headers earlier 
b520: 74 68 61 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69  than 8.6. In thi
b530: 73 20 63 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74  s case NR cannot
b540: 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20   be.** used, so 
b550: 44 62 55 73 65 4e 72 65 28 29 20 74 6f 20 61 6c  DbUseNre() to al
b560: 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f  ways return zero
b570: 2e 20 41 64 64 20 23 64 65 66 69 6e 65 73 20 66  . Add #defines f
b580: 6f 72 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  or the other.** 
b590: 54 63 6c 5f 4e 52 78 78 78 28 29 20 66 75 6e 63  Tcl_NRxxx() func
b5a0: 74 69 6f 6e 73 20 74 6f 20 70 72 65 76 65 6e 74  tions to prevent
b5b0: 20 74 68 65 6d 20 66 72 6f 6d 20 63 61 75 73 69   them from causi
b5c0: 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65  ng compilation e
b5d0: 72 72 6f 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74  rrors,.** even t
b5e0: 68 6f 75 67 68 20 74 68 65 20 6f 6e 6c 79 20 69  hough the only i
b5f0: 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66 20 74 68  nvocations of th
b600: 65 6d 20 61 72 65 20 77 69 74 68 69 6e 20 63 6f  em are within co
b610: 6e 64 69 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73  nditional blocks
b620: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d   .** of the form
b630: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62  :.**.**   if( Db
b640: 55 73 65 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e  UseNre() ) { ...
b650: 20 7d 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53   }.*/.# define S
b660: 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a  QLITE_TCL_NRE 0.
b670: 23 20 64 65 66 69 6e 65 20 44 62 55 73 65 4e 72  # define DbUseNr
b680: 65 28 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54  e() 0.# define T
b690: 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b  cl_NRAddCallback
b6a0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 30 0a  (a,b,c,d,e,f) 0.
b6b0: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45  # define Tcl_NRE
b6c0: 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a  valObj(a,b,c) 0.
b6d0: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43  # define Tcl_NRC
b6e0: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62  reateCommand(a,b
b6f0: 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23 65 6e 64  ,c,d,e,f) 0.#end
b700: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
b710: 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
b720: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
b730: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d  ation of the com
b740: 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64  mand:.**.**   $d
b750: 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41  b eval SQL ?ARRA
b760: 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f  YNAME? SCRIPT.*/
b770: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 45 76  .static int DbEv
b780: 61 6c 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69  alNextCmd(.  Cli
b790: 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20  entData data[], 
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7b0: 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20    /* data[0] is 
b7c0: 74 68 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65  the (DbEvalConte
b7d0: 78 74 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  xt*) */.  Tcl_In
b7e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b800: 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65  * Tcl interprete
b810: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  r */.  int resul
b820: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
b830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b840: 65 73 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a  esult so far */.
b850: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
b860: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
b870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
b880: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
b890: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
b8a0: 65 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b  ent of the data[
b8b0: 5d 20 61 72 72 61 79 20 69 73 20 61 20 70 6f 69  ] array is a poi
b8c0: 6e 74 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c  nter to a DbEval
b8d0: 43 6f 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72  Context.  ** str
b8e0: 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64  ucture allocated
b8f0: 20 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63   using Tcl_Alloc
b900: 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65  (). The second e
b910: 6c 65 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d  lement of data[]
b920: 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74  .  ** is a point
b930: 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20  er to a Tcl_Obj 
b940: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
b950: 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72  cript to run for
b960: 20 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72   each row.  ** r
b970: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 71  eturned by the q
b980: 75 65 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61  ueries encapsula
b990: 74 65 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20  ted in data[0]. 
b9a0: 2a 2f 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  */.  DbEvalConte
b9b0: 78 74 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43  xt *p = (DbEvalC
b9c0: 6f 6e 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d  ontext *)data[0]
b9d0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
b9e0: 72 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20  ript = (Tcl_Obj 
b9f0: 2a 29 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c  *)data[1];.  Tcl
ba00: 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70  _Obj *pArray = p
ba10: 2d 3e 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69  ->pArray;..  whi
ba20: 6c 65 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20  le( (rc==TCL_OK 
ba30: 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49  || rc==TCL_CONTI
ba40: 4e 55 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d  NUE) && TCL_OK==
ba50: 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70  (rc = dbEvalStep
ba60: 28 70 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  (p)) ){.    int 
ba70: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  i;.    int nCol;
ba80: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
ba90: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62  pColName;.    db
baa0: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26  EvalRowInfo(p, &
bab0: 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65  nCol, &apColName
bac0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
bad0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
bae0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
baf0: 6c 20 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  l = dbEvalColumn
bb00: 56 61 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20  Value(p, i);.   
bb10: 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30     if( pArray==0
bb20: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
bb30: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
bb40: 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  p, apColName[i],
bb50: 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20   0, pVal, 0);.  
bb60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bb70: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
bb80: 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79  2(interp, pArray
bb90: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
bba0: 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pVal, 0);.      
bbb0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
bbc0: 54 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 74  The required int
bbd0: 65 72 70 72 65 74 65 72 20 76 61 72 69 61 62 6c  erpreter variabl
bbe0: 65 73 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c  es are now popul
bbf0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
bc00: 74 61 20 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ta .    ** from 
bc10: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
bc20: 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73   If using NRE, s
bc30: 63 68 65 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b  chedule callback
bc40: 73 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  s to evaluate.  
bc50: 20 20 2a 2a 20 73 63 72 69 70 74 20 70 53 63 72    ** script pScr
bc60: 69 70 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76  ipt, then to inv
bc70: 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  oke this functio
bc80: 6e 20 61 67 61 69 6e 20 74 6f 20 66 65 74 63 68  n again to fetch
bc90: 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
bca0: 20 72 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20 75   row (or clean u
bcb0: 70 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  p if there is no
bcc0: 20 6e 65 78 74 20 72 6f 77 20 6f 72 20 74 68 65   next row or the
bcd0: 20 73 63 72 69 70 74 20 74 68 72 6f 77 73 20 61   script throws a
bce0: 6e 0a 20 20 20 20 2a 2a 20 65 78 63 65 70 74 69  n.    ** excepti
bcf0: 6f 6e 29 2e 20 41 66 74 65 72 20 73 63 68 65 64  on). After sched
bd00: 75 6c 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  uling the callba
bd10: 63 6b 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74  cks, return cont
bd20: 72 6f 6c 20 74 6f 20 74 68 65 20 0a 20 20 20 20  rol to the .    
bd30: 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a  ** caller..    *
bd40: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20  *.    ** If not 
bd50: 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
bd60: 61 74 65 20 70 53 63 72 69 70 74 20 64 69 72 65  ate pScript dire
bd70: 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75  ctly and continu
bd80: 65 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a  e with the.    *
bd90: 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  * next iteration
bda0: 20 6f 66 20 74 68 69 73 20 77 68 69 6c 65 28 2e   of this while(.
bdb0: 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20  ..) loop.  */.  
bdc0: 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
bdd0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52   ){.      Tcl_NR
bde0: 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  AddCallback(inte
bdf0: 72 70 2c 20 44 62 45 76 61 6c 4e 65 78 74 43 6d  rp, DbEvalNextCm
be00: 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f  d, (void*)p, (vo
be10: 69 64 2a 29 70 53 63 72 69 70 74 2c 20 30 2c 20  id*)pScript, 0, 
be20: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
be30: 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69   Tcl_NREvalObj(i
be40: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
be50: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
be60: 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76       rc = Tcl_Ev
be70: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
be80: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
be90: 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65   }.  }..  Tcl_De
bea0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
beb0: 70 74 29 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e  pt);.  dbEvalFin
bec0: 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f  alize(p);.  Tcl_
bed0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b  Free((char *)p);
bee0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  ..  if( rc==TCL_
bef0: 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52  OK || rc==TCL_BR
bf00: 45 41 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52  EAK ){.    Tcl_R
bf10: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
bf20: 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  p);.    rc = TCL
bf30: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
bf40: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
bf50: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
bf60: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
bf70: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
bf80: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
bf90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
bfa0: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
bfb0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
bfc0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
bfd0: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
bfe0: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
bff0: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
c000: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
c010: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
c020: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
c030: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
c040: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
c050: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
c060: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
c070: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
c080: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
c090: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
c0a0: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
c0b0: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
c0c0: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
c0d0: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
c0e0: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
c0f0: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
c100: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
c110: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
c120: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
c130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c140: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
c150: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
c160: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
c170: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
c180: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
c190: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
c1a0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
c1b0: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
c1c0: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
c1d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
c1e0: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
c1f0: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
c200: 20 20 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20       "backup",  
c210: 20 20 20 20 20 20 20 20 20 20 22 62 75 73 79 22            "busy"
c220: 2c 0a 20 20 20 20 22 63 61 63 68 65 22 2c 20 20  ,.    "cache",  
c230: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68 61              "cha
c240: 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
c250: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63   "close",.    "c
c260: 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20  ollate",        
c270: 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e      "collation_n
c280: 65 65 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74  eeded",  "commit
c290: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d  _hook",.    "com
c2a0: 70 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20 20  plete",         
c2b0: 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20    "copy",       
c2c0: 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c         "enable_l
c2d0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a  oad_extension",.
c2e0: 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c      "errorcode",
c2f0: 20 20 20 20 20 20 20 20 20 20 22 65 76 61 6c 22            "eval"
c300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
c310: 65 78 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75  exists",.    "fu
c320: 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  nction",        
c330: 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20     "incrblob",  
c340: 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72 75          "interru
c350: 70 74 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69  pt",.    "last_i
c360: 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22  nsert_rowid",  "
c370: 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20  nullvalue",     
c380: 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c      "onecolumn",
c390: 0a 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 20  .    "profile", 
c3a0: 20 20 20 20 20 20 20 20 20 20 20 22 70 72 6f 67             "prog
c3b0: 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20 20  ress",          
c3c0: 22 72 65 6b 65 79 22 2c 0a 20 20 20 20 22 72 65  "rekey",.    "re
c3d0: 73 74 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20  store",         
c3e0: 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f     "rollback_hoo
c3f0: 6b 22 2c 20 20 20 20 20 22 73 74 61 74 75 73 22  k",     "status"
c400: 2c 0a 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c  ,.    "timeout",
c410: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74              "tot
c420: 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20  al_changes",    
c430: 20 22 74 72 61 63 65 22 2c 0a 20 20 20 20 22 74   "trace",.    "t
c440: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20  ransaction",    
c450: 20 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69      "unlock_noti
c460: 66 79 22 2c 20 20 20 20 20 22 75 70 64 61 74 65  fy",     "update
c470: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 76 65 72  _hook",.    "ver
c480: 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20  sion",          
c490: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
c4a0: 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65         .  };.  e
c4b0: 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20  num DB_enum {.  
c4c0: 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c    DB_AUTHORIZER,
c4d0: 20 20 20 20 20 20 20 20 44 42 5f 42 41 43 4b 55          DB_BACKU
c4e0: 50 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  P,           DB_
c4f0: 42 55 53 59 2c 0a 20 20 20 20 44 42 5f 43 41 43  BUSY,.    DB_CAC
c500: 48 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  HE,             
c510: 44 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20  DB_CHANGES,     
c520: 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20       DB_CLOSE,. 
c530: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20     DB_COLLATE,  
c540: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c           DB_COLL
c550: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42  ATION_NEEDED, DB
c560: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20  _COMMIT_HOOK,.  
c570: 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20    DB_COMPLETE,  
c580: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 50 59 2c          DB_COPY,
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
c5a0: 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
c5b0: 4e 53 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52  NSION,.    DB_ER
c5c0: 52 4f 52 43 4f 44 45 2c 20 20 20 20 20 20 20 20  RORCODE,        
c5d0: 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20   DB_EVAL,       
c5e0: 20 20 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c        DB_EXISTS,
c5f0: 0a 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e  .    DB_FUNCTION
c600: 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e  ,          DB_IN
c610: 43 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20  CRBLOB,         
c620: 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 0a 20 20  DB_INTERRUPT,.  
c630: 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54    DB_LAST_INSERT
c640: 5f 52 4f 57 49 44 2c 20 44 42 5f 4e 55 4c 4c 56  _ROWID, DB_NULLV
c650: 41 4c 55 45 2c 20 20 20 20 20 20 20 20 44 42 5f  ALUE,        DB_
c660: 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44  ONECOLUMN,.    D
c670: 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20  B_PROFILE,      
c680: 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53       DB_PROGRESS
c690: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 4b  ,         DB_REK
c6a0: 45 59 2c 0a 20 20 20 20 44 42 5f 52 45 53 54 4f  EY,.    DB_RESTO
c6b0: 52 45 2c 20 20 20 20 20 20 20 20 20 20 20 44 42  RE,           DB
c6c0: 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20  _ROLLBACK_HOOK, 
c6d0: 20 20 20 44 42 5f 53 54 41 54 55 53 2c 0a 20 20     DB_STATUS,.  
c6e0: 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20    DB_TIMEOUT,   
c6f0: 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c          DB_TOTAL
c700: 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 44 42 5f  _CHANGES,    DB_
c710: 54 52 41 43 45 2c 0a 20 20 20 20 44 42 5f 54 52  TRACE,.    DB_TR
c720: 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20 20  ANSACTION,      
c730: 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46   DB_UNLOCK_NOTIF
c740: 59 2c 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f  Y,    DB_UPDATE_
c750: 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 56 45 52  HOOK,.    DB_VER
c760: 53 49 4f 4e 2c 0a 20 20 7d 3b 0a 20 20 2f 2a 20  SION,.  };.  /* 
c770: 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72 61 69  don't leave trai
c780: 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44  ling commas on D
c790: 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75  B_enum, it confu
c7a0: 73 65 73 20 74 68 65 20 41 49 58 20 78 6c 63 20  ses the AIX xlc 
c7b0: 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69  compiler */..  i
c7c0: 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
c7d0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
c7e0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
c7f0: 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e  v, "SUBCOMMAND .
c800: 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
c810: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c820: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
c830: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
c840: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74  , objv[1], DB_st
c850: 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c  rs, "option", 0,
c860: 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20   &choice) ){.   
c870: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c880: 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  R;.  }..  switch
c890: 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29  ( (enum DB_enum)
c8a0: 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20  choice ){..  /* 
c8b0: 20 20 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65     $db authorize
c8c0: 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  r ?CALLBACK?.  *
c8d0: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
c8e0: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
c8f0: 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61   to authorize ea
c900: 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e  ch SQL operation
c910: 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63   as it is.  ** c
c920: 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75  ompiled.  5 argu
c930: 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64  ments are append
c940: 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ed to the callba
c950: 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a  ck before it is.
c960: 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20    ** invoked:.  
c970: 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68  **.  **   (1) Th
c980: 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  e authorization 
c990: 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45  type (ex: SQLITE
c9a0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53  _CREATE_TABLE, S
c9b0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e  QLITE_INSERT, ..
c9c0: 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69  .).  **   (2) Fi
c9d0: 72 73 74 20 64 65 73 63 72 69 70 74 69 76 65 20  rst descriptive 
c9e0: 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e  name (depends on
c9f0: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
ca00: 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20  ype).  **   (3) 
ca10: 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69  Second descripti
ca20: 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28  ve name.  **   (
ca30: 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  4) Name of the d
ca40: 61 74 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61  atabase (ex: "ma
ca50: 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a  in", "temp").  *
ca60: 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20  *   (5) Name of 
ca70: 74 72 69 67 67 65 72 20 74 68 61 74 20 69 73 20  trigger that is 
ca80: 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65 73 73  doing the access
ca90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
caa0: 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72  allback should r
cab0: 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20  eturn on of the 
cac0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67  following string
cad0: 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20  s: SQLITE_OK,.  
cae0: 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ** SQLITE_IGNORE
caf0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59  , or SQLITE_DENY
cb00: 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
cb10: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20  urn value is an 
cb20: 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  error..  **.  **
cb30: 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20   If this method 
cb40: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
cb50: 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68  no arguments, th
cb60: 65 20 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72  e current author
cb70: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c  ization.  ** cal
cb80: 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20  lback string is 
cb90: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20  returned..  */. 
cba0: 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49   case DB_AUTHORI
cbb0: 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  ZER: {.#ifdef SQ
cbc0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
cbd0: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f  IZATION.    Tcl_
cbe0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
cbf0: 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a 61 74  erp, "authorizat
cc00: 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ion not availabl
cc10: 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
cc20: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
cc30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
cc40: 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  e.    if( objc>3
cc50: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
cc60: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
cc70: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
cc80: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
cc90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
cca0: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
ccb0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
ccc0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
ccd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
cce0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ccf0: 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  erp, pDb->zAuth,
cd00: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
cd10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
cd20: 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20  ar *zAuth;.     
cd30: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
cd40: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
cd50: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
cd60: 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a  ee(pDb->zAuth);.
cd70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41        }.      zA
cd80: 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  uth = Tcl_GetStr
cd90: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
cda0: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
cdb0: 20 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65   if( zAuth && le
cdc0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
cdd0: 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f  Db->zAuth = Tcl_
cde0: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
cdf0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
ce00: 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75  (pDb->zAuth, zAu
ce10: 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  th, len+1);.    
ce20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ce30: 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b   pDb->zAuth = 0;
ce40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ce50: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
ce60: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
ce70: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
ce80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
ce90: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44  et_authorizer(pD
cea0: 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c  b->db, auth_call
ceb0: 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20  back, pDb);.    
cec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ced0: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
cee0: 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c  horizer(pDb->db,
cef0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
cf00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
cf10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
cf20: 2a 20 20 20 20 24 64 62 20 62 61 63 6b 75 70 20  *    $db backup 
cf30: 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
cf40: 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70  AME.  **.  ** Op
cf50: 65 6e 20 6f 72 20 63 72 65 61 74 65 20 61 20 64  en or create a d
cf60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
cf70: 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72  ed FILENAME.  Tr
cf80: 61 6e 73 66 65 72 20 74 68 65 0a 20 20 2a 2a 20  ansfer the.  ** 
cf90: 63 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f 63 61 6c  content of local
cfa0: 20 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41   database DATABA
cfb0: 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61  SE (default: "ma
cfc0: 69 6e 22 29 20 69 6e 74 6f 20 74 68 65 0a 20 20  in") into the.  
cfd0: 2a 2a 20 46 49 4c 45 4e 41 4d 45 20 64 61 74 61  ** FILENAME data
cfe0: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
cff0: 65 20 44 42 5f 42 41 43 4b 55 50 3a 20 7b 0a 20  e DB_BACKUP: {. 
d000: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d010: 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f  DestFile;.    co
d020: 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 44 62  nst char *zSrcDb
d030: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
d040: 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Dest;.    sqlite
d050: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
d060: 70 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  p;..    if( objc
d070: 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72  ==3 ){.      zSr
d080: 63 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  cDb = "main";.  
d090: 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
d0a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d0b0: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[2]);.    }els
d0c0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
d0d0: 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20  .      zSrcDb = 
d0e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d0f0: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a 44  jv[2]);.      zD
d100: 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  estFile = Tcl_Ge
d110: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
d120: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d130: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d140: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
d150: 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f  bjv, "?DATABASE?
d160: 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20   FILENAME");.   
d170: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d180: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
d190: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
d1a0: 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65  (zDestFile, &pDe
d1b0: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  st);.    if( rc!
d1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d1d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d1e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61  sult(interp, "ca
d1f0: 6e 6e 6f 74 20 6f 70 65 6e 20 74 61 72 67 65 74  nnot open target
d200: 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20   database: ",.  
d210: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d220: 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20  _errmsg(pDest), 
d230: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
d240: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
d250: 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Dest);.      ret
d260: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d270: 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70     }.    pBackup
d280: 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
d290: 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d  p_init(pDest, "m
d2a0: 61 69 6e 22 2c 20 70 44 62 2d 3e 64 62 2c 20 7a  ain", pDb->db, z
d2b0: 53 72 63 44 62 29 3b 0a 20 20 20 20 69 66 28 20  SrcDb);.    if( 
d2c0: 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
d2d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d2e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
d2f0: 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a  ckup failed: ",.
d300: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d310: 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
d320: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
d330: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
d340: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72  (pDest);.      r
d350: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d360: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
d370: 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  (  (rc = sqlite3
d380: 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61  _backup_step(pBa
d390: 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49  ckup,100))==SQLI
d3a0: 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71  TE_OK ){}.    sq
d3b0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e  lite3_backup_fin
d3c0: 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20  ish(pBackup);.  
d3d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d3e0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72  _DONE ){.      r
d3f0: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
d400: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
d410: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d420: 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61  terp, "backup fa
d430: 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  iled: ",.       
d440: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
d450: 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72  sg(pDest), (char
d460: 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
d470: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d480: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  }.    sqlite3_cl
d490: 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
d4a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
d4b0: 20 20 20 20 24 64 62 20 62 75 73 79 20 3f 43 41      $db busy ?CA
d4c0: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
d4d0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
d4e0: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 61  en callback if a
d4f0: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
d500: 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
d510: 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64  .  ** a locked d
d520: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
d530: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 55 53  */.  case DB_BUS
d540: 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  Y: {.    if( obj
d550: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
d560: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
d570: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
d580: 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
d590: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d5a0: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
d5b0: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
d5c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
d5d0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
d5e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d5f0: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79  terp, pDb->zBusy
d600: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
d620: 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20  har *zBusy;.    
d630: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
d640: 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
d650: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
d660: 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b  ree(pDb->zBusy);
d670: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
d680: 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  Busy = Tcl_GetSt
d690: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
d6a0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
d6b0: 20 20 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c    if( zBusy && l
d6c0: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
d6d0: 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c  pDb->zBusy = Tcl
d6e0: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
d6f0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
d700: 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42  y(pDb->zBusy, zB
d710: 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  usy, len+1);.   
d720: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d730: 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30    pDb->zBusy = 0
d740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d750: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
d760: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
d770: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
d780: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d790: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62  busy_handler(pDb
d7a0: 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64  ->db, DbBusyHand
d7b0: 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
d7c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d7d0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
d7e0: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  dler(pDb->db, 0,
d7f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d800: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
d810: 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20  }..  /*     $db 
d820: 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a  cache flush.  **
d830: 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20 73       $db cache s
d840: 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize n.  **.  ** 
d850: 46 6c 75 73 68 20 74 68 65 20 70 72 65 70 61 72  Flush the prepar
d860: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63  ed statement cac
d870: 68 65 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d  he, or set the m
d880: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
d890: 0a 20 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61  .  ** cached sta
d8a0: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
d8b0: 63 61 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b  case DB_CACHE: {
d8c0: 0a 20 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d  .    char *subCm
d8d0: 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20  d;.    int n;.. 
d8e0: 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29     if( objc<=2 )
d8f0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
d900: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d910: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65   1, objv, "cache
d920: 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b   option ?arg?");
d930: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
d940: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
d950: 20 20 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f     subCmd = Tcl_
d960: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
d970: 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a  ( objv[2], 0 );.
d980: 20 20 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d      if( *subCmd=
d990: 3d 27 66 27 20 26 26 20 73 74 72 63 6d 70 28 73  ='f' && strcmp(s
d9a0: 75 62 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d  ubCmd,"flush")==
d9b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 ){.      if( o
d9c0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
d9d0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
d9e0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
d9f0: 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20  jv, "flush");.  
da00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
da10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
da20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75  lse{.        flu
da30: 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62  shStmtCache( pDb
da40: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
da50: 7d 65 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d  }else if( *subCm
da60: 64 3d 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70  d=='s' && strcmp
da70: 28 73 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d  (subCmd,"size")=
da80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
da90: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
daa0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
dab0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
dac0: 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a  bjv, "size n");.
dad0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
dae0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
daf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
db00: 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63  f( TCL_ERROR==Tc
db10: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
db20: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
db30: 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &n) ){.        
db40: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
db50: 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e  lt( interp, "can
db60: 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c  not convert \"",
db70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
db80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
db90: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29  omObj(objv[3],0)
dba0: 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72  , "\" to integer
dbb0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
dbc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
dbd0: 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  R;.        }else
dbe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
dbf0: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
dc00: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
dc10: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
dc20: 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20        n = 0;.   
dc30: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
dc40: 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f   n>MAX_PREPARED_
dc50: 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20  STMTS ){.       
dc60: 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45       n = MAX_PRE
dc70: 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20  PARED_STMTS;.   
dc80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc90: 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20     pDb->maxStmt 
dca0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = n;.        }. 
dcb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
dcc0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
dcd0: 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
dce0: 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22  , "bad option \"
dcf0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 54 63  ", .          Tc
dd00: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
dd10: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22  bj(objv[2],0), "
dd20: 5c 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73  \": must be flus
dd30: 68 20 6f 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a  h or size", 0);.
dd40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
dd50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
dd60: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
dd70: 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e 67  /*     $db chang
dd80: 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
dd90: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
dda0: 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
ddb0: 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
ddc0: 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
ddd0: 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74  by.  ** the most
dde0: 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20   recent INSERT, 
ddf0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
de00: 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20   statement, not 
de10: 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20  including .  ** 
de20: 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
de30: 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67   by trigger prog
de40: 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  rams..  */.  cas
de50: 65 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a  e DB_CHANGES: {.
de60: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
de70: 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  sult;.    if( ob
de80: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
de90: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
dea0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
deb0: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
dec0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ded0: 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20    }.    pResult 
dee0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
def0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
df00: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
df10: 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63  esult, sqlite3_c
df20: 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29  hanges(pDb->db))
df30: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
df40: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c  ..  /*    $db cl
df50: 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68  ose.  **.  ** Sh
df60: 75 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62  utdown the datab
df70: 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ase.  */.  case 
df80: 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20  DB_CLOSE: {.    
df90: 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e  Tcl_DeleteComman
dfa0: 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  d(interp, Tcl_Ge
dfb0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
dfc0: 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20  bjv[0], 0));.   
dfd0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
dfe0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
dff0: 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49  ollate NAME SCRI
e000: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
e010: 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f  ate a new SQL co
e020: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
e030: 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57   called NAME.  W
e040: 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61  henever.  ** tha
e050: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  t function is ca
e060: 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52  lled, invoke SCR
e070: 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20  IPT to evaluate 
e080: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  the function..  
e090: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c  */.  case DB_COL
e0a0: 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43  LATE: {.    SqlC
e0b0: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
e0c0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
e0d0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63  e;.    char *zSc
e0e0: 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53  ript;.    int nS
e0f0: 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f  cript;.    if( o
e100: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
e110: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
e120: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
e130: 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29  , "NAME SCRIPT")
e140: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
e150: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
e160: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
e170: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
e180: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
e190: 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f    zScript = Tcl_
e1a0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
e1b0: 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69  (objv[3], &nScri
e1c0: 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  pt);.    pCollat
e1d0: 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a  e = (SqlCollate*
e1e0: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
e1f0: 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20  of(*pCollate) + 
e200: 6e 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20  nScript + 1 );. 
e210: 20 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d     if( pCollate=
e220: 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
e230: 45 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c  ERROR;.    pColl
e240: 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  ate->interp = in
e250: 74 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  terp;.    pColla
e260: 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  te->pNext = pDb-
e270: 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70  >pCollate;.    p
e280: 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74  Collate->zScript
e290: 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
e2a0: 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d  ate[1];.    pDb-
e2b0: 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c  >pCollate = pCol
e2c0: 6c 61 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79  late;.    memcpy
e2d0: 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69  (pCollate->zScri
e2e0: 70 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63  pt, zScript, nSc
e2f0: 72 69 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28  ript+1);.    if(
e300: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
e310: 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64  collation(pDb->d
e320: 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  b, zName, SQLITE
e330: 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
e340: 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c  pCollate, tclSql
e350: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
e360: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
e370: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
e380: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
e390: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
e3a0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65  ATILE);.      re
e3b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e3c0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
e3d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
e3e0: 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f      $db collatio
e3f0: 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a  n_needed SCRIPT.
e400: 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
e410: 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61   a new SQL colla
e420: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61  tion function ca
e430: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
e440: 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66  ever.  ** that f
e450: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
e460: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
e470: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
e480: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
e490: 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54    case DB_COLLAT
e4a0: 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20  ION_NEEDED: {.  
e4b0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
e4c0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
e4d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e4e0: 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54  2, objv, "SCRIPT
e4f0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
e500: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e510: 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  }.    if( pDb->p
e520: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b  CollateNeeded ){
e530: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
e540: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
e550: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
e560: 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f    }.    pDb->pCo
e570: 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63  llateNeeded = Tc
e580: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f  l_DuplicateObj(o
e590: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c  bjv[2]);.    Tcl
e5a0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _IncrRefCount(pD
e5b0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
e5c0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
e5d0: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
e5e0: 28 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74  (pDb->db, pDb, t
e5f0: 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  clCollateNeeded)
e600: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
e610: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
e620: 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42  mmit_hook ?CALLB
e630: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
e640: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
e650: 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65  callback just be
e660: 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
e670: 65 76 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61  every SQL transa
e680: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74  ction..  ** If t
e690: 68 65 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f  he callback thro
e6a0: 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  ws an exception 
e6b0: 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  or returns non-z
e6c0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ero, then the.  
e6d0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
e6e0: 73 20 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43  s aborted.  If C
e6f0: 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d  ALLBACK is an em
e700: 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20  pty string, the 
e710: 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73  callback.  ** is
e720: 20 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a   disabled..  */.
e730: 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54    case DB_COMMIT
e740: 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28  _HOOK: {.    if(
e750: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
e760: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
e770: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
e780: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
e790: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
e7a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
e7b0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
e7c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
e7d0: 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
e7e0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
e7f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
e800: 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a  b->zCommit, 0);.
e810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
e820: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
e830: 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e  Commit;.      in
e840: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
e850: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b   pDb->zCommit ){
e860: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
e870: 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b  e(pDb->zCommit);
e880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
e890: 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74  Commit = Tcl_Get
e8a0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
e8b0: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
e8c0: 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20      if( zCommit 
e8d0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
e8e0: 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74      pDb->zCommit
e8f0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
e900: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
e910: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f   memcpy(pDb->zCo
e920: 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c  mmit, zCommit, l
e930: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
e940: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
e950: 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20  >zCommit = 0;.  
e960: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e970: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
e980: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
e990: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
e9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
e9b0: 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  mmit_hook(pDb->d
e9c0: 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c  b, DbCommitHandl
e9d0: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
e9e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
e9f0: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
ea00: 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  ok(pDb->db, 0, 0
ea10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ea20: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
ea30: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d  .  /*    $db com
ea40: 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20  plete SQL.  **. 
ea50: 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20   ** Return TRUE 
ea60: 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70  if SQL is a comp
ea70: 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
ea80: 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  nt.  Return FALS
ea90: 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69  E if.  ** additi
eaa0: 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e  onal lines of in
eab0: 70 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20  put are needed. 
eac0: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
ead0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69   to the.  ** bui
eae0: 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70  lt-in "info comp
eaf0: 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66  lete" command of
eb00: 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   Tcl..  */.  cas
eb10: 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b  e DB_COMPLETE: {
eb20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eb30: 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20  OMIT_COMPLETE.  
eb40: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
eb50: 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f  lt;.    int isCo
eb60: 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20  mplete;.    if( 
eb70: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
eb80: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
eb90: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
eba0: 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20  v, "SQL");.     
ebb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ebc0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43  R;.    }.    isC
ebd0: 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65  omplete = sqlite
ebe0: 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f  3_complete( Tcl_
ebf0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ec00: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a  (objv[2], 0) );.
ec10: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
ec20: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
ec30: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
ec40: 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52  SetBooleanObj(pR
ec50: 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74  esult, isComplet
ec60: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62  e);.#endif.    b
ec70: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
ec80: 20 20 20 24 64 62 20 63 6f 70 79 20 63 6f 6e 66     $db copy conf
ec90: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74  lict-algorithm t
eca0: 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53  able filename ?S
ecb0: 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49  EPARATOR? ?NULLI
ecc0: 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20  NDICATOR?.  **. 
ecd0: 20 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 69 6e   ** Copy data in
ece0: 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20 66 69  to table from fi
ecf0: 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c  lename, optional
ed00: 6c 79 20 75 73 69 6e 67 20 53 45 50 41 52 41 54  ly using SEPARAT
ed10: 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d  OR.  ** as colum
ed20: 6e 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 49  n separators.  I
ed30: 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  f a column conta
ed40: 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e  ins a null strin
ed50: 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76  g, or the.  ** v
ed60: 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49  alue of NULLINDI
ed70: 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73  CATOR, a NULL is
ed80: 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68   inserted for th
ed90: 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63  e column..  ** c
eda0: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
edb0: 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  m is one of the 
edc0: 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74 20  sqlite conflict 
edd0: 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a  algorithms:.  **
ede0: 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62      rollback, ab
edf0: 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72  ort, fail, ignor
ee00: 65 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  e, replace.  ** 
ee10: 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
ee20: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
ee30: 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64   lines processed
ee40: 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  , not necessaril
ee50: 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27  y same.  ** as '
ee60: 64 62 20 63 68 61 6e 67 65 73 27 20 64 75 65 20  db changes' due 
ee70: 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  to conflict-algo
ee80: 72 69 74 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a  rithm selected..
ee90: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
eea0: 6f 64 65 20 69 73 20 62 61 73 69 63 61 6c 6c 79  ode is basically
eeb0: 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
eec0: 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f  on/enhancement o
eed0: 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
eee0: 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70  e3 shell.c ".imp
eef0: 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20  ort" command..  
ef00: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d  **.  ** This com
ef10: 6d 61 6e 64 20 75 73 61 67 65 20 69 73 20 65 71  mand usage is eq
ef20: 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20  uivalent to the 
ef30: 73 71 6c 69 74 65 32 2e 78 20 43 4f 50 59 20 73  sqlite2.x COPY s
ef40: 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77  tatement,.  ** w
ef50: 68 69 63 68 20 69 6d 70 6f 72 74 73 20 66 69 6c  hich imports fil
ef60: 65 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61  e data into a ta
ef70: 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 50 6f  ble using the Po
ef80: 73 74 67 72 65 53 51 4c 20 43 4f 50 59 20 66 69  stgreSQL COPY fi
ef90: 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20  le format:.  ** 
efa0: 20 20 24 64 62 20 63 6f 70 79 20 24 63 6f 6e 66    $db copy $conf
efb0: 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f  lit_algo $table_
efc0: 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c  name $filename \
efd0: 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73  t \\N.  */.  cas
efe0: 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20  e DB_COPY: {.   
eff0: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20   char *zTable;  
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f010: 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
f020: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
f030: 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20     char *zFile; 
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f050: 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20  * The file from 
f060: 77 68 69 63 68 20 74 6f 20 65 78 74 72 61 63 74  which to extract
f070: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 63 68 61   data */.    cha
f080: 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20  r *zConflict;   
f090: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f0a0: 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  conflict algorit
f0b0: 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  hm to use */.   
f0c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
f0d0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  Stmt;        /* 
f0e0: 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  A statement */. 
f0f0: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f110: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
f120: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
f130: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
f140: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
f150: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f160: 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c   bytes in an SQL
f170: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69   string */.    i
f180: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
f190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
f1a0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
f1b0: 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20     int nSep;    
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f1d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
f1e0: 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20  s in zSep[] */. 
f1f0: 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20     int nNull;   
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f210: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
f220: 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a  s in zNull[] */.
f230: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20      char *zSql; 
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d  /* An SQL statem
f260: 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ent */.    char 
f270: 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  *zLine;         
f280: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
f290: 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74  le line of input
f2a0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a   from the file *
f2b0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43  /.    char **azC
f2c0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
f2d0: 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f    /* zLine[] bro
f2e0: 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75  ken up into colu
f2f0: 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  mns */.    char 
f300: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
f310: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
f320: 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20   commit changes 
f330: 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b  */.    FILE *in;
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
f360: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  file */.    int 
f370: 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20  lineno = 0;     
f380: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
f390: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  number of input 
f3a0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
f3b0: 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20   zLineNum[80];  
f3c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
f3d0: 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66  number print buf
f3e0: 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  fer */.    Tcl_O
f3f0: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20  bj *pResult;    
f400: 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70         /* interp
f410: 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20   result */..    
f420: 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20  char *zSep;.    
f430: 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20  char *zNull;.   
f440: 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f   if( objc<5 || o
f450: 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54  bjc>7 ){.      T
f460: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f470: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
f480: 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46   .         "CONF
f490: 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54  LICT-ALGORITHM T
f4a0: 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53  ABLE FILENAME ?S
f4b0: 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49  EPARATOR? ?NULLI
f4c0: 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20  NDICATOR?");.   
f4d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f4e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
f4f0: 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20  f( objc>=6 ){.  
f500: 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47      zSep = Tcl_G
f510: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f520: 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20  objv[5], 0);.   
f530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
f540: 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d  ep = "\t";.    }
f550: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37  .    if( objc>=7
f560: 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20   ){.      zNull 
f570: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f580: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20  romObj(objv[6], 
f590: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
f5a0: 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b       zNull = "";
f5b0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66  .    }.    zConf
f5c0: 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  lict = Tcl_GetSt
f5d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f5e0: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61  [2], 0);.    zTa
f5f0: 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ble = Tcl_GetStr
f600: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f610: 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c  3], 0);.    zFil
f620: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
f630: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d  gFromObj(objv[4]
f640: 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
f650: 20 73 74 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b   strlen30(zSep);
f660: 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72  .    nNull = str
f670: 6c 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20  len30(zNull);.  
f680: 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
f690: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
f6a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
f6b0: 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20  Error: non-null 
f6c0: 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72  separator requir
f6d0: 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30 29 3b  ed for copy",0);
f6e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f6f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
f700: 20 20 20 69 66 28 73 74 72 63 6d 70 28 7a 43 6f     if(strcmp(zCo
f710: 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63  nflict, "rollbac
f720: 6b 22 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20  k") != 0 &&.    
f730: 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c     strcmp(zConfl
f740: 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20 29  ict, "abort"   )
f750: 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
f760: 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
f770: 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d  , "fail"    ) !=
f780: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
f790: 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
f7a0: 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30 20  ignore"  ) != 0 
f7b0: 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
f7c0: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70  (zConflict, "rep
f7d0: 6c 61 63 65 22 20 29 20 21 3d 20 30 20 29 20 7b  lace" ) != 0 ) {
f7e0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
f7f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f800: 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f  "Error: \"", zCo
f810: 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20 20 20 20  nflict, .       
f820: 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69       "\", confli
f830: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73  ct-algorithm mus
f840: 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c  t be one of: rol
f850: 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20 20 20 20  lback, ".       
f860: 20 20 20 20 20 22 61 62 6f 72 74 2c 20 66 61 69       "abort, fai
f870: 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65  l, ignore, or re
f880: 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20 20 20  place", 0);.    
f890: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f8a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  OR;.    }.    zS
f8b0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
f8c0: 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
f8d0: 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61 62 6c  ROM '%q'", zTabl
f8e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c  e);.    if( zSql
f8f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
f900: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f910: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f  terp, "Error: no
f920: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20   such table: ", 
f930: 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  zTable, 0);.    
f940: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f950: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  OR;.    }.    nB
f960: 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  yte = strlen30(z
f970: 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Sql);.    rc = s
f980: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
f990: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
f9a0: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
f9b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f9c0: 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
f9d0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
f9e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f9f0: 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  p, "Error: ", sq
fa00: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
fa10: 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
fa20: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d   nCol = 0;.    }
fa30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c  else{.      nCol
fa40: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
fa50: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
fa60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fa70: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
fa80: 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  );.    if( nCol=
fa90: 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74  =0 ) {.      ret
faa0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fab0: 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
fac0: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20  malloc( nByte + 
fad0: 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20  50 + nCol*2 );. 
fae0: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
faf0: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
fb00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
fb10: 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20  , "Error: can't 
fb20: 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20  malloc()", 0);. 
fb30: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fb40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
fb50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fb60: 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
fb70: 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
fb80: 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
fb90: 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
fba0: 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
fbb0: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
fbc0: 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  30(zSql);.    fo
fbd0: 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
fbe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
fbf0: 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
fc00: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
fc10: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
fc20: 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
fc30: 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
fc40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
fc50: 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
fc60: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
fc70: 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  t, 0);.    free(
fc80: 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
fc90: 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
fca0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fcb0: 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
fcc0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
fcd0: 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
fce0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
fcf0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
fd00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fd10: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20  R;.    }.    in 
fd20: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
fd30: 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
fd40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
fd50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fd60: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
fd70: 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
fd80: 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  ", zFile, NULL);
fd90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
fda0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
fdb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
fdc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
fdd0: 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63    azCol = malloc
fde0: 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30  ( sizeof(azCol[0
fdf0: 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20  ])*(nCol+1) );. 
fe00: 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
fe10: 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  ) {.      Tcl_Ap
fe20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fe30: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74  p, "Error: can't
fe40: 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a   malloc()", 0);.
fe50: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
fe60: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
fe70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fe80: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
fe90: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
fea0: 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
feb0: 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d  );.    zCommit =
fec0: 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77   "COMMIT";.    w
fed0: 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c  hile( (zLine = l
fee0: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20  ocal_getline(0, 
fef0: 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  in))!=0 ){.     
ff00: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
ff10: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e  i = 0;.      lin
ff20: 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43  eno++;.      azC
ff30: 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20  ol[0] = zLine;. 
ff40: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d       for(i=0, z=
ff50: 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  zLine; *z; z++){
ff60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d  .        if( *z=
ff70: 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e  =zSep[0] && strn
ff80: 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65  cmp(z, zSep, nSe
ff90: 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)==0 ){.       
ffa0: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
ffb0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
ffc0: 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29      if( i<nCol )
ffd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
ffe0: 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70  Col[i] = &z[nSep
fff0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ];.            z
10000 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20   += nSep-1;.    
10010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10020 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10030 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b  if( i+1!=nCol ){
10040 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
10050 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Err;.        int
10060 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 33 30   nErr = strlen30
10070 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20  (zFile) + 200;. 
10080 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61         zErr = ma
10090 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20  lloc(nErr);.    
100a0 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
100b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
100c0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c  3_snprintf(nErr,
100d0 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20   zErr,.         
100e0 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c      "Error: %s l
100f0 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64  ine %d: expected
10100 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   %d columns of d
10110 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64  ata but found %d
10120 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10130 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e  zFile, lineno, n
10140 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
10150 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
10160 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
10170 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rr, 0);.        
10180 20 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20    free(zErr);.  
10190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
101a0 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
101b0 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
101c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
101d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
101e0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
101f0 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e    /* check for n
10200 75 6c 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c  ull data, if so,
10210 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f   bind as null */
10220 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 4e  .        if( (nN
10230 75 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28  ull>0 && strcmp(
10240 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29  azCol[i], zNull)
10250 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c  ==0).          |
10260 7c 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c  | strlen30(azCol
10270 5b 69 5d 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  [i])==0 .       
10280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10290 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
102a0 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20  pStmt, i+1);.   
102b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
102c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
102d0 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
102e0 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31  +1, azCol[i], -1
102f0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
10300 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10310 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10320 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
10330 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10340 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
10350 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
10360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
10370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10380 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10390 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
103a0 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
103b0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
103c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  , 0);.        zC
103d0 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
103e0 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
103f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
10400 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29  .    free(azCol)
10410 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  ;.    fclose(in)
10420 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
10430 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
10440 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
10450 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
10460 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29  Commit, 0, 0, 0)
10470 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  ;..    if( zComm
10480 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a  it[0] == 'C' ){.
10490 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73        /* success
104a0 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20  , set result as 
104b0 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
104c0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
104d0 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
104e0 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
104f0 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c  terp);.      Tcl
10500 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
10510 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  lt, lineno);.   
10520 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
10530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10540 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70   /* failure, app
10550 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65  end lineno where
10560 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
10570 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
10580 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75  f(sizeof(zLineNu
10590 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64  m), zLineNum,"%d
105a0 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ",lineno);.     
105b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
105c0 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c  t(interp,", fail
105d0 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ed while process
105e0 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e  ing line: ",zLin
105f0 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72  eNum,0);.      r
10600 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
10610 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
10620 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
10630 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61    $db enable_loa
10640 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c  d_extension BOOL
10650 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75  EAN.  **.  ** Tu
10660 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  rn the extension
10670 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65   loading feature
10680 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20   on or off.  It 
10690 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64  if off by.  ** d
106a0 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63  efault..  */.  c
106b0 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f  ase DB_ENABLE_LO
106c0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a  AD_EXTENSION: {.
106d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
106e0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
106f0 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66  ON.    int onoff
10700 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
10710 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
10720 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10730 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f  rp, 2, objv, "BO
10740 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72  OLEAN");.      r
10750 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10760 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
10770 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
10780 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
10790 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b  v[2], &onoff) ){
107a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
107b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
107c0 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
107d0 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
107e0 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29  (pDb->db, onoff)
107f0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c  ;.    break;.#el
10800 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  se.    Tcl_Appen
10810 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10820 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69  "extension loadi
10830 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  ng is turned off
10840 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
10850 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10860 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
10870 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10880 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
10890 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
108a0 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20  rrorcode.  **.  
108b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
108c0 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65  meric error code
108d0 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e   that was return
108e0 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ed by the most r
108f0 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  ecent.  ** call 
10900 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
10910 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
10920 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20  B_ERRORCODE: {. 
10930 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
10940 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
10950 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
10960 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
10970 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  b)));.    break;
10980 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
10990 20 20 20 24 64 62 20 65 78 69 73 74 73 20 24 73     $db exists $s
109a0 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f  ql.  **    $db o
109b0 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20  necolumn $sql.  
109c0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63  **.  ** The onec
109d0 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20  olumn method is 
109e0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
109f0 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64  f:.  **     lind
10a00 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71  ex [$db eval $sq
10a10 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65  l] 0.  */.  case
10a20 20 44 42 5f 45 58 49 53 54 53 3a 20 0a 20 20 63   DB_EXISTS: .  c
10a30 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
10a40 3a 20 7b 0a 20 20 20 20 44 62 45 76 61 6c 43 6f  : {.    DbEvalCo
10a50 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20  ntext sEval;.   
10a60 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
10a70 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10a80 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10a90 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
10aa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10ab0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
10ac0 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73     dbEvalInit(&s
10ad0 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b  Eval, pDb, objv[
10ae0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  2], 0);.    rc =
10af0 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45 76   dbEvalStep(&sEv
10b00 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  al);.    if( cho
10b10 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d  ice==DB_ONECOLUM
10b20 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  N ){.      if( r
10b30 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
10b40 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
10b50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
10b60 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
10b70 26 73 45 76 61 6c 2c 20 30 29 29 3b 0a 20 20 20  &sEval, 0));.   
10b80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
10b90 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  f( rc==TCL_BREAK
10ba0 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29   || rc==TCL_OK )
10bb0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
10bc0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10bd0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
10be0 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29 29 3b  bj(rc==TCL_OK));
10bf0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 45 76 61  .    }.    dbEva
10c00 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c  lFinalize(&sEval
10c10 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
10c20 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20  TCL_BREAK ){.   
10c30 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
10c40 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
10c50 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20  .  }.   .  /*.  
10c60 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20 24  **    $db eval $
10c70 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20  sql ?array? ?{  
10c80 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20  ...code... }?.  
10c90 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 20  **.  ** The SQL 
10ca0 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73 71  statement in $sq
10cb0 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 20  l is evaluated. 
10cc0 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 74   For each row, t
10cd0 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20  he values are.  
10ce0 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c 65  ** placed in ele
10cf0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72  ments of the arr
10d00 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79 22  ay named "array"
10d10 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20   and ...code... 
10d20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
10d30 2a 20 49 66 20 22 61 72 72 61 79 22 20 61 6e 64  * If "array" and
10d40 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69 74   "code" are omit
10d50 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c  ted, then no cal
10d60 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79 20 69  lback is every i
10d70 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20  nvoked..  ** If 
10d80 22 61 72 72 61 79 22 20 69 73 20 61 6e 20 65 6d  "array" is an em
10d90 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e  pty string, then
10da0 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
10db0 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61 62  placed in variab
10dc0 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68 61  les.  ** that ha
10dd0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  ve the same name
10de0 20 61 73 20 74 68 65 20 66 69 65 6c 64 73 20 65   as the fields e
10df0 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65 20  xtracted by the 
10e00 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61  query..  */.  ca
10e10 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20 20  se DB_EVAL: {.  
10e20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20    if( objc<3 || 
10e30 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20 20  objc>5 ){.      
10e40 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10e50 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
10e60 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41  , "SQL ?ARRAY-NA
10e70 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a  ME? ?SCRIPT?");.
10e80 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10e90 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
10ea0 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
10eb0 7b 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43 6f  {.      DbEvalCo
10ec0 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20  ntext sEval;.   
10ed0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74     Tcl_Obj *pRet
10ee0 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
10ef0 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
10f00 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
10f10 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28       dbEvalInit(
10f20 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a  &sEval, pDb, obj
10f30 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  v[2], 0);.      
10f40 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28  while( TCL_OK==(
10f50 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28  rc = dbEvalStep(
10f60 26 73 45 76 61 6c 29 29 20 29 7b 0a 20 20 20 20  &sEval)) ){.    
10f70 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
10f80 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
10f90 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e       dbEvalRowIn
10fa0 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43 6f 6c  fo(&sEval, &nCol
10fb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  , 0);.        fo
10fc0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
10fd0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
10fe0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10ff0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11000 70 52 65 74 2c 20 64 62 45 76 61 6c 43 6f 6c 75  pRet, dbEvalColu
11010 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20  mnValue(&sEval, 
11020 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i));.        }. 
11030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 45       }.      dbE
11040 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76  valFinalize(&sEv
11050 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
11060 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
11070 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
11080 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
11090 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20   pRet);.        
110a0 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
110b0 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44     }.      Tcl_D
110c0 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ecrRefCount(pRet
110d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
110e0 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63      ClientData c
110f0 64 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62 45 76  d[2];.      DbEv
11100 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20  alContext *p;.  
11110 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72      Tcl_Obj *pAr
11120 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  ray = 0;.      T
11130 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
11140 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ..      if( objc
11150 3d 3d 35 20 26 26 20 2a 28 63 68 61 72 20 2a 29  ==5 && *(char *)
11160 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11170 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20 20 20  jv[3]) ){.      
11180 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b    pArray = objv[
11190 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  3];.      }.    
111a0 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
111b0 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 20 20  [objc-1];.      
111c0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
111d0 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20  (pScript);.     
111e0 20 0a 20 20 20 20 20 20 70 20 3d 20 28 44 62 45   .      p = (DbE
111f0 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54 63 6c  valContext *)Tcl
11200 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 62  _Alloc(sizeof(Db
11210 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20  EvalContext));. 
11220 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28       dbEvalInit(
11230 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  p, pDb, objv[2],
11240 20 70 41 72 72 61 79 29 3b 0a 0a 20 20 20 20 20   pArray);..     
11250 20 63 64 5b 30 5d 20 3d 20 28 76 6f 69 64 20 2a   cd[0] = (void *
11260 29 70 3b 0a 20 20 20 20 20 20 63 64 5b 31 5d 20  )p;.      cd[1] 
11270 3d 20 28 76 6f 69 64 20 2a 29 70 53 63 72 69 70  = (void *)pScrip
11280 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62  t;.      rc = Db
11290 45 76 61 6c 4e 65 78 74 43 6d 64 28 63 64 2c 20  EvalNextCmd(cd, 
112a0 69 6e 74 65 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b  interp, TCL_OK);
112b0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
112c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
112d0 20 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f       $db functio
112e0 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e  n NAME [-argcoun
112f0 74 20 4e 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  t N] SCRIPT.  **
11300 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
11310 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ew SQL function 
11320 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
11330 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e 63  enever that func
11340 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c  tion is.  ** cal
11350 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
11360 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
11370 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
11380 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43  /.  case DB_FUNC
11390 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46  TION: {.    SqlF
113a0 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20  unc *pFunc;.    
113b0 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
113c0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
113d0 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20  e;.    int nArg 
113e0 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 62  = -1;.    if( ob
113f0 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 63  jc==6 ){.      c
11400 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54  onst char *z = T
11410 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11420 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  v[3]);.      int
11430 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29   n = strlen30(z)
11440 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20  ;.      if( n>2 
11450 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d  && strncmp(z, "-
11460 61 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20  argcount",n)==0 
11470 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54  ){.        if( T
11480 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
11490 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
114a0 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72  , &nArg) ) retur
114b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
114c0 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 30 20       if( nArg<0 
114d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
114e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
114f0 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66  terp, "number of
11500 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74 20   arguments must 
11510 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22  be non-negative"
11520 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
11540 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
11550 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11560 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
11570 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72      }.      pScr
11580 69 70 74 20 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 20  ipt = objv[5];. 
11590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
115a0 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
115b0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
115c0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
115d0 22 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74  "NAME [-argcount
115e0 20 4e 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20   N] SCRIPT");.  
115f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11600 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RROR;.    }else{
11610 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
11620 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a   objv[3];.    }.
11630 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
11640 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11650 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
11660 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71    pFunc = findSq
11670 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65  lFunc(pDb, zName
11680 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
11690 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
116a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20  _ERROR;.    if( 
116b0 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29  pFunc->pScript )
116c0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  {.      Tcl_Decr
116d0 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
116e0 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a  pScript);.    }.
116f0 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69      pFunc->pScri
11700 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20  pt = pScript;.  
11710 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
11720 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20  nt(pScript);.   
11730 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f   pFunc->useEvalO
11740 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45  bjv = safeToUseE
11750 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20  valObjv(interp, 
11760 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63  pScript);.    rc
11770 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
11780 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e  e_function(pDb->
11790 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
117a0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
117b0 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c        pFunc, tcl
117c0 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
117d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
117e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
117f0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
11800 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
11810 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
11820 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
11830 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
11840 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d  VOLATILE);.    }
11850 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11860 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
11870 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65  db incrblob ?-re
11880 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42  adonly? ?DB? TAB
11890 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a  LE COLUMN ROWID.
118a0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49    */.  case DB_I
118b0 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65  NCRBLOB: {.#ifde
118c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
118d0 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41  CRBLOB.    Tcl_A
118e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
118f0 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f  rp, "incrblob no
11900 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
11910 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a  his build", 0);.
11920 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11930 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
11940 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d  int isReadonly =
11950 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
11960 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22  ar *zDb = "main"
11970 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
11980 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f   *zTable;.    co
11990 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
119a0 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 69 6e  n;.    sqlite_in
119b0 74 36 34 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f  t64 iRow;..    /
119c0 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * Check for the 
119d0 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e  -readonly option
119e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   */.    if( objc
119f0 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63 6c  >3 && strcmp(Tcl
11a00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11a10 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22  2]), "-readonly"
11a20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73  )==0 ){.      is
11a30 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
11a40 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
11a50 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79  c!=(5+isReadonly
11a60 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73  ) && objc!=(6+is
11a70 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
11a80 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
11a90 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
11aa0 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79  bjv, "?-readonly
11ab0 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c  ? ?DB? TABLE COL
11ac0 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20 20  UMN ROWID");.   
11ad0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11ae0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
11af0 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52  if( objc==(6+isR
11b00 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadonly) ){.    
11b10 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
11b20 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
11b30 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65      }.    zTable
11b40 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11b50 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a  (objv[objc-3]);.
11b60 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63      zColumn = Tc
11b70 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11b80 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72  [objc-2]);.    r
11b90 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49  c = Tcl_GetWideI
11ba0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
11bb0 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20  , objv[objc-1], 
11bc0 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28  &iRow);..    if(
11bd0 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
11be0 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65       rc = create
11bf0 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28  IncrblobChannel(
11c00 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72  .          inter
11c10 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61  p, pDb, zDb, zTa
11c20 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52  ble, zColumn, iR
11c30 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20  ow, isReadonly. 
11c40 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
11c50 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
11c60 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
11c70 20 20 20 24 64 62 20 69 6e 74 65 72 72 75 70 74     $db interrupt
11c80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72  .  **.  ** Inter
11c90 72 75 70 74 20 74 68 65 20 65 78 65 63 75 74 69  rupt the executi
11ca0 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d  on of the inner-
11cb0 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72  most SQL interpr
11cc0 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a  eter.  This.  **
11cd0 20 63 61 75 73 65 73 20 74 68 65 20 53 51 4c 20   causes the SQL 
11ce0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74  statement to ret
11cf0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20  urn an error of 
11d00 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
11d10 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
11d20 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20  _INTERRUPT: {.  
11d30 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
11d40 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  upt(pDb->db);.  
11d50 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11d60 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
11d70 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e  nullvalue ?STRIN
11d80 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  G?.  **.  ** Cha
11d90 6e 67 65 20 74 65 78 74 20 75 73 65 64 20 77 68  nge text used wh
11da0 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20  en a NULL comes 
11db0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61  back from the da
11dc0 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49  tabase. If ?STRI
11dd0 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  NG?.  ** is not 
11de0 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68  present, then th
11df0 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67  e current string
11e00 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69   used for NULL i
11e10 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
11e20 20 49 66 20 53 54 52 49 4e 47 20 69 73 20 70 72   If STRING is pr
11e30 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49  esent, then STRI
11e40 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  NG is returned..
11e50 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65    **.  */.  case
11e60 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b   DB_NULLVALUE: {
11e70 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
11e80 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
11e90 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
11ea0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
11eb0 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55   objv, "NULLVALU
11ec0 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E");.      retur
11ed0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11ee0 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
11ef0 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =3 ){.      int 
11f00 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20  len;.      char 
11f10 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74  *zNull = Tcl_Get
11f20 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
11f30 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
11f40 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75      if( pDb->zNu
11f50 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ll ){.        Tc
11f60 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
11f70 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
11f80 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c    if( zNull && l
11f90 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
11fa0 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c  pDb->zNull = Tcl
11fb0 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
11fc0 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63  );.        strnc
11fd0 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a  py(pDb->zNull, z
11fe0 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Null, len);.    
11ff0 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c      pDb->zNull[l
12000 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  en] = '\0';.    
12010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12020 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b   pDb->zNull = 0;
12030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12040 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
12050 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
12060 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75  xtToObj(pDb->zNu
12070 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ll));.    break;
12080 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12090 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73      $db last_ins
120a0 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a  ert_rowid .  **.
120b0 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69    ** Return an i
120c0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
120d0 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68  the ROWID for th
120e0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e  e most recent in
120f0 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  sert..  */.  cas
12100 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54  e DB_LAST_INSERT
12110 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63  _ROWID: {.    Tc
12120 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
12130 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
12140 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f  rowid;.    if( o
12150 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc!=2 ){.      
12160 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12170 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12180 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
12190 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
121a0 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d     }.    rowid =
121b0 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
121c0 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e  sert_rowid(pDb->
121d0 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  db);.    pResult
121e0 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
121f0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
12200 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f   Tcl_SetWideIntO
12210 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69  bj(pResult, rowi
12220 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
12230 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68   }..  /*.  ** Th
12240 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d  e DB_ONECOLUMN m
12250 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65  ethod is impleme
12260 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  nted together wi
12270 74 68 20 44 42 5f 45 58 49 53 54 53 2e 0a 20 20  th DB_EXISTS..  
12280 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  */..  /*    $db 
12290 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c  progress ?N CALL
122a0 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a  BACK?.  ** .  **
122b0 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
122c0 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79  n callback every
122d0 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   N virtual machi
122e0 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65  ne opcodes while
122f0 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20   executing.  ** 
12300 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
12310 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53  case DB_PROGRESS
12320 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
12330 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
12340 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
12350 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
12360 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12370 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
12380 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ss, 0);.      }.
12390 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
123a0 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
123b0 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
123c0 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
123d0 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
123e0 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
123f0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
12400 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
12410 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &N) ){.        
12420 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12430 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
12440 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
12450 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
12460 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
12470 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d  ogress);.      }
12480 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73  .      zProgress
12490 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
124a0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
124b0 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
124c0 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c  ( zProgress && l
124d0 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
124e0 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
124f0 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
12500 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
12510 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67  emcpy(pDb->zProg
12520 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c  ress, zProgress,
12530 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
12540 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
12550 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30  b->zProgress = 0
12560 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
12570 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
12580 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
12590 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
125a0 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
125b0 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
125c0 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
125d0 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
125e0 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
125f0 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73  db, N, DbProgres
12600 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  sHandler, pDb);.
12610 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12620 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
12630 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
12640 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  b->db, 0, 0, 0);
12650 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
12660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12670 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
12680 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
12690 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29  v, "N CALLBACK")
126a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
126b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
126c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
126d0 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66    /*    $db prof
126e0 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ile ?CALLBACK?. 
126f0 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72   **.  ** Make ar
12700 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e  rangements to in
12710 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43  voke the CALLBAC
12720 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  K routine after 
12730 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
12740 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73  nt.  ** that has
12750 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20   run.  The text 
12760 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74  of the SQL and t
12770 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61  he amount of ela
12780 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a  pse time are.  *
12790 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  * appended to CA
127a0 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68  LLBACK before th
127b0 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e  e script is run.
127c0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
127d0 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69  PROFILE: {.    i
127e0 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
127f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
12800 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
12810 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
12820 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
12830 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12840 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
12850 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
12860 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
12870 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
12880 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
12890 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20   pDb->zProfile, 
128a0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
128b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
128c0 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20  r *zProfile;.   
128d0 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
128e0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
128f0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ile ){.        T
12900 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
12910 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  ofile);.      }.
12920 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d        zProfile =
12930 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
12940 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
12950 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
12960 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e  zProfile && len>
12970 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
12980 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c  ->zProfile = Tcl
12990 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
129a0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
129b0 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  y(pDb->zProfile,
129c0 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31   zProfile, len+1
129d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
129e0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
129f0 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  ofile = 0;.     
12a00 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
12a10 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
12a20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
12a30 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
12a40 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
12a50 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
12a60 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44  lite3_profile(pD
12a70 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65  b->db, DbProfile
12a80 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
12a90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
12ab0 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ile(pDb->db, 0, 
12ac0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
12ad0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
12ae0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
12af0 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79  **     $db rekey
12b00 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   KEY.  **.  ** C
12b10 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70  hange the encryp
12b20 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  tion key on the 
12b30 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64  currently open d
12b40 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
12b50 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b  case DB_REKEY: {
12b60 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  .    int nKey;. 
12b70 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20     void *pKey;. 
12b80 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
12b90 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
12ba0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12bb0 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29   2, objv, "KEY")
12bc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
12bd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12be0 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47      pKey = Tcl_G
12bf0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
12c00 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65  bj(objv[2], &nKe
12c10 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  y);.#ifdef SQLIT
12c20 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
12c30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b  rc = sqlite3_rek
12c40 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79  ey(pDb->db, pKey
12c50 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  , nKey);.    if(
12c60 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
12c70 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12c80 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
12c90 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  Str(rc), 0);.   
12ca0 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
12cb0 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  R;.    }.#endif.
12cc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
12cd0 20 20 2f 2a 20 20 20 20 24 64 62 20 72 65 73 74    /*    $db rest
12ce0 6f 72 65 20 3f 44 41 54 41 42 41 53 45 3f 20 46  ore ?DATABASE? F
12cf0 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a  ILENAME.  **.  *
12d00 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
12d10 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c  e file named FIL
12d20 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72  ENAME.  Transfer
12d30 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 0a 20 20   the content .  
12d40 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d 45 20 69  ** of FILENAME i
12d50 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64 61  nto the local da
12d60 74 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20  tabase DATABASE 
12d70 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22  (default: "main"
12d80 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
12d90 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  B_RESTORE: {.   
12da0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72   const char *zSr
12db0 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  cFile;.    const
12dc0 20 63 68 61 72 20 2a 7a 44 65 73 74 44 62 3b 0a   char *zDestDb;.
12dd0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72      sqlite3 *pSr
12de0 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  c;.    sqlite3_b
12df0 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
12e00 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74      int nTimeout
12e10 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6f   = 0;..    if( o
12e20 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
12e30 7a 44 65 73 74 44 62 20 3d 20 22 6d 61 69 6e 22  zDestDb = "main"
12e40 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65  ;.      zSrcFile
12e50 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12e60 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d  (objv[2]);.    }
12e70 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
12e80 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44   ){.      zDestD
12e90 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
12ea0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
12eb0 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c    zSrcFile = Tcl
12ec0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12ed0 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  3]);.    }else{.
12ee0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
12ef0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
12f00 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41  , objv, "?DATABA
12f10 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a  SE? FILENAME");.
12f20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12f30 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12f40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
12f50 70 65 6e 5f 76 32 28 7a 53 72 63 46 69 6c 65 2c  pen_v2(zSrcFile,
12f60 20 26 70 53 72 63 2c 20 53 51 4c 49 54 45 5f 4f   &pSrc, SQLITE_O
12f70 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29  PEN_READONLY, 0)
12f80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12f90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12fa0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12fb0 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
12fc0 74 20 6f 70 65 6e 20 73 6f 75 72 63 65 20 64 61  t open source da
12fd0 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20  tabase: ",.     
12fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
12ff0 72 6d 73 67 28 70 53 72 63 29 2c 20 28 63 68 61  rmsg(pSrc), (cha
13000 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
13010 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
13020 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
13030 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13040 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
13050 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
13060 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44 65 73 74  t(pDb->db, zDest
13070 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22  Db, pSrc, "main"
13080 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
13090 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  up==0 ){.      T
130a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
130b0 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65  interp, "restore
130c0 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
130d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
130e0 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
130f0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
13100 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
13110 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Src);.      retu
13120 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13130 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28    }.    while( (
13140 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  rc = sqlite3_bac
13150 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70  kup_step(pBackup
13160 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  ,100))==SQLITE_O
13170 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
13180 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  || rc==SQLITE_BU
13190 53 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  SY ){.      if( 
131a0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
131b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
131c0 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29  Timeout++ >= 3 )
131d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
131e0 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30  sqlite3_sleep(10
131f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13200 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
13210 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
13220 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
13230 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
13240 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
13250 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
13260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
13270 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Y || rc==SQLITE_
13280 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
13290 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
132a0 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72  (interp, "restor
132b0 65 20 66 61 69 6c 65 64 3a 20 73 6f 75 72 63 65  e failed: source
132c0 20 64 61 74 61 62 61 73 65 20 62 75 73 79 22 2c   database busy",
132d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
132e0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
132f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
13300 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
13310 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
13320 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13330 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c  p, "restore fail
13340 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ed: ",.         
13350 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
13360 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72  (pDb->db), (char
13370 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
13380 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13390 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  }.    sqlite3_cl
133a0 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 62  ose(pSrc);.    b
133b0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
133c0 20 20 2a 2a 20 20 20 20 20 24 64 62 20 73 74 61    **     $db sta
133d0 74 75 73 20 28 73 74 65 70 7c 73 6f 72 74 29 0a  tus (step|sort).
133e0 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61    **.  ** Displa
133f0 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  y SQLITE_STMTSTA
13400 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
13410 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54  P or .  ** SQLIT
13420 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
13430 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  T for the most r
13440 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f  ecent eval..  */
13450 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41 54 55  .  case DB_STATU
13460 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a  S: {.    int v;.
13470 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13480 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  zOp;.    if( obj
13490 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
134a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
134b0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
134c0 22 28 73 74 65 70 7c 73 6f 72 74 29 22 29 3b 0a  "(step|sort)");.
134d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
134e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
134f0 20 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53    zOp = Tcl_GetS
13500 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
13510 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
13520 4f 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29  Op, "step")==0 )
13530 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
13540 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73  >nStep;.    }els
13550 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70  e if( strcmp(zOp
13560 2c 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a  , "sort")==0 ){.
13570 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e        v = pDb->n
13580 53 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sort;.    }else{
13590 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
135a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
135b0 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73  "bad argument: s
135c0 68 6f 75 6c 64 20 62 65 20 73 74 65 70 20 6f 72  hould be step or
135d0 20 73 6f 72 74 22 2c 20 0a 20 20 20 20 20 20 20   sort", .       
135e0 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
135f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13600 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13610 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
13620 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
13630 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
13640 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a    break;.  }.  .
13650 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
13660 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53  b timeout MILLES
13670 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a  ECONDS.  **.  **
13680 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e   Delay for the n
13690 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
136a0 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20  conds specified 
136b0 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c  when a file is l
136c0 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ocked..  */.  ca
136d0 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b  se DB_TIMEOUT: {
136e0 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20  .    int ms;.   
136f0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
13700 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13710 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13720 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
13730 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72  CONDS");.      r
13740 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13750 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
13760 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
13770 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
13780 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
13790 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
137a0 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
137b0 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29  out(pDb->db, ms)
137c0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
137d0 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
137e0 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e    $db total_chan
137f0 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
13800 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
13810 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
13820 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
13830 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
13840 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
13850 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13860 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20   was created..  
13870 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54  */.  case DB_TOT
13880 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  AL_CHANGES: {.  
13890 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
138a0 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
138b0 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
138c0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
138d0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
138e0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
138f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13900 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
13910 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
13920 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
13930 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
13940 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74  ult, sqlite3_tot
13950 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  al_changes(pDb->
13960 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
13970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
13980 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43  b trace ?CALLBAC
13990 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
139a0 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
139b0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
139c0 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f  LBACK routine fo
139d0 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
139e0 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69  ment.  ** that i
139f0 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
13a00 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
13a10 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
13a20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a  CALLBACK before.
13a30 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75    ** it is execu
13a40 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
13a50 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20   DB_TRACE: {.   
13a60 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
13a70 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
13a80 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
13a90 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
13aa0 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
13ab0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13ac0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
13ad0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
13ae0 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
13af0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
13b00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13b10 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29   pDb->zTrace, 0)
13b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
13b30 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
13b40 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69  *zTrace;.      i
13b50 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
13b60 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
13b70 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
13b80 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a  e(pDb->zTrace);.
13b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
13ba0 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  race = Tcl_GetSt
13bb0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
13bc0 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
13bd0 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20    if( zTrace && 
13be0 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
13bf0 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54   pDb->zTrace = T
13c00 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
13c10 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
13c20 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c  cpy(pDb->zTrace,
13c30 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b   zTrace, len+1);
13c40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13c50 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
13c60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  e = 0;.      }.#
13c70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13c80 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69  IT_TRACE.      i
13c90 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
13ca0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
13cb0 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
13cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13cd0 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44  trace(pDb->db, D
13ce0 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70  bTraceHandler, p
13cf0 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
13d00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13d10 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
13d20 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
13d30 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
13d40 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
13d50 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  *    $db transac
13d60 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
13d70 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
13d80 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20  usive] SCRIPT.  
13d90 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20  **.  ** Start a 
13da0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
13db0 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61  (if we are not a
13dc0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69  lready in the mi
13dd0 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72  dst of a.  ** tr
13de0 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65  ansaction) and e
13df0 78 65 63 75 74 65 20 74 68 65 20 54 43 4c 20 73  xecute the TCL s
13e00 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 20 41  cript SCRIPT.  A
13e10 66 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a  fter SCRIPT.  **
13e20 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68   completes, eith
13e30 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  er commit the tr
13e40 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c  ansaction or rol
13e50 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53 43 52  l it back if SCR
13e60 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20  IPT.  ** throws 
13e70 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f  an exception.  O
13e80 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e  r if no new tran
13e90 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  sation was start
13ea0 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  ed, do nothing..
13eb0 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78    ** pass the ex
13ec0 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68  ception on up th
13ed0 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
13ee0 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
13ef0 77 61 73 20 69 6e 73 70 69 72 65 64 20 62 79 20  was inspired by 
13f00 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61  Dave Thomas's ta
13f10 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68  lk on Ruby at th
13f20 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65  e.  ** 2005 O'Re
13f30 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65  illy Open Source
13f40 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43   Convention (OSC
13f50 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ON)..  */.  case
13f60 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a   DB_TRANSACTION:
13f70 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
13f80 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e  pScript;.    con
13f90 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20  st char *zBegin 
13fa0 3d 20 22 53 41 56 45 50 4f 49 4e 54 20 5f 74 63  = "SAVEPOINT _tc
13fb0 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a  l_transaction";.
13fc0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
13fd0 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
13fe0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13ff0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
14000 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43  objv, "[TYPE] SC
14010 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
14020 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14030 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
14040 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Db->nTransaction
14050 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29  ==0 && objc==4 )
14060 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
14070 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50 45  onst char *TTYPE
14080 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  _strs[] = {.    
14090 20 20 20 20 22 64 65 66 65 72 72 65 64 22 2c 20      "deferred", 
140a0 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20    "exclusive",  
140b0 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20  "immediate", 0. 
140c0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e       };.      en
140d0 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a  um TTYPE_enum {.
140e0 20 20 20 20 20 20 20 20 54 54 59 50 45 5f 44 45          TTYPE_DE
140f0 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58  FERRED, TTYPE_EX
14100 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49  CLUSIVE, TTYPE_I
14110 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d  MMEDIATE.      }
14120 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74 79 70  ;.      int ttyp
14130 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  e;.      if( Tcl
14140 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
14150 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
14160 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74  , TTYPE_strs, "t
14170 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22  ransaction type"
14180 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20  0, &ttype) ){.  
141b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
141c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
141d0 20 20 20 20 20 20 73 77 69 74 63 68 28 20 28 65        switch( (e
141e0 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74  num TTYPE_enum)t
141f0 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20  type ){.        
14200 63 61 73 65 20 54 54 59 50 45 5f 44 45 46 45 52  case TTYPE_DEFER
14210 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  RED:    /* no-op
14220 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20   */;            
14230 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14240 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 45      case TTYPE_E
14250 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67  XCLUSIVE:   zBeg
14260 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c  in = "BEGIN EXCL
14270 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a  USIVE";  break;.
14280 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
14290 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20  PE_IMMEDIATE:   
142a0 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20  zBegin = "BEGIN 
142b0 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65  IMMEDIATE";  bre
142c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
142d0 7d 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d 20  }.    pScript = 
142e0 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20  objv[objc-1];.. 
142f0 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51     /* Run the SQ
14300 4c 69 74 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61  Lite BEGIN comma
14310 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20 74 72 61  nd to open a tra
14320 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
14330 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44  point. */.    pD
14340 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b  b->disableAuth++
14350 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14360 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
14370 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30   zBegin, 0, 0, 0
14380 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61  );.    pDb->disa
14390 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69  bleAuth--;.    i
143a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
143b0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
143c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
143d0 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
143e0 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
143f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
14400 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
14410 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74    pDb->nTransact
14420 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49  ion++;..    /* I
14430 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68  f using NRE, sch
14440 65 64 75 6c 65 20 61 20 63 61 6c 6c 62 61 63 6b  edule a callback
14450 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73   to invoke the s
14460 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20 74  cript pScript, t
14470 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20 73 65 63  hen.    ** a sec
14480 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  ond callback to 
14490 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62  commit (or rollb
144a0 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63  ack) the transac
144b0 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e  tion or savepoin
144c0 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20  t.    ** opened 
144d0 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74 20 75 73  above. If not us
144e0 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74  ing NRE, evaluat
144f0 65 20 74 68 65 20 73 63 72 69 70 74 20 64 69 72  e the script dir
14500 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20 20 20 20  ectly, then.    
14510 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  ** call function
14520 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
14530 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20  ) to commit (or 
14540 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72  rollback) the tr
14550 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
14560 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20  * or savepoint. 
14570 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73   */.    if( DbUs
14580 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20  eNre() ){.      
14590 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63  Tcl_NRAddCallbac
145a0 6b 28 69 6e 74 65 72 70 2c 20 44 62 54 72 61 6e  k(interp, DbTran
145b0 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c 20 30 2c  sPostCmd, cd, 0,
145c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 63   0, 0);.      Tc
145d0 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65  l_NREvalObj(inte
145e0 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
145f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14600 20 20 72 63 20 3d 20 44 62 54 72 61 6e 73 50 6f    rc = DbTransPo
14610 73 74 43 6d 64 28 26 63 64 2c 20 69 6e 74 65 72  stCmd(&cd, inter
14620 70 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  p, Tcl_EvalObjEx
14630 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
14640 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , 0));.    }.   
14650 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
14660 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e  *.  **    $db un
14670 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72  lock_notify ?scr
14680 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ipt?.  */.  case
14690 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46   DB_UNLOCK_NOTIF
146a0 59 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Y: {.#ifndef SQL
146b0 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
146c0 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c  K_NOTIFY.    Tcl
146d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
146e0 74 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f  terp, "unlock_no
146f0 74 69 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  tify not availab
14700 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
14710 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  ", 0);.    rc = 
14720 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
14730 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
14740 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
14750 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
14760 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
14770 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f   objv, "?SCRIPT?
14780 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  ");.      rc = T
14790 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
147a0 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  lse{.      void 
147b0 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69 64 20  (*xNotify)(void 
147c0 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a 20 20  **, int) = 0;.  
147d0 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f 74 69 66      void *pNotif
147e0 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20 20 20 20  yArg = 0;..     
147f0 20 69 66 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63   if( pDb->pUnloc
14800 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20 20 20 20  kNotify ){.     
14810 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
14820 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  unt(pDb->pUnlock
14830 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20 20 20  Notify);.       
14840 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
14850 69 66 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ify = 0;.      }
14860 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 6f 62  .  .      if( ob
14870 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc==3 ){.       
14880 20 78 4e 6f 74 69 66 79 20 3d 20 44 62 55 6e 6c   xNotify = DbUnl
14890 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20 20 20 20  ockNotify;.     
148a0 20 20 20 70 4e 6f 74 69 66 79 41 72 67 20 3d 20     pNotifyArg = 
148b0 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a 20 20 20  (void *)pDb;.   
148c0 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63       pDb->pUnloc
148d0 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a 76 5b 32  kNotify = objv[2
148e0 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  ];.        Tcl_I
148f0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
14900 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
14910 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
14920 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 6e    if( sqlite3_un
14930 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62 2d  lock_notify(pDb-
14940 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70 4e  >db, xNotify, pN
14950 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20 20 20  otifyArg) ){.   
14960 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
14970 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
14980 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
14990 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
149a0 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
149b0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
149c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
149d0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
149e0 2a 20 20 20 20 24 64 62 20 75 70 64 61 74 65 5f  *    $db update_
149f0 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
14a00 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61  **    $db rollba
14a10 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  ck_hook ?script?
14a20 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
14a30 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20  UPDATE_HOOK: .  
14a40 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b  case DB_ROLLBACK
14a50 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a  _HOOK: {..    /*
14a60 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70   set ppHook to p
14a70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65 48  oint at pUpdateH
14a80 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b  ook or pRollback
14a90 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20  Hook, depending 
14aa0 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68  on .    ** wheth
14ab0 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68  er [$db update_h
14ac0 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c  ook] or [$db rol
14ad0 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20  lback_hook] was 
14ae0 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a  invoked..    */.
14af0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70      Tcl_Obj **pp
14b00 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63  Hook; .    if( c
14b10 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45  hoice==DB_UPDATE
14b20 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  _HOOK ){.      p
14b30 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55  pHook = &pDb->pU
14b40 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d  pdateHook;.    }
14b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 48 6f  else{.      ppHo
14b60 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c  ok = &pDb->pRoll
14b70 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a  backHook;.    }.
14b80 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
14b90 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
14ba0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
14bb0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
14bc0 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54  , objv, "?SCRIPT
14bd0 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75  ?");.       retu
14be0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14bf0 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70 70 48    }.    if( *ppH
14c00 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ook ){.      Tcl
14c10 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
14c20 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a  terp, *ppHook);.
14c30 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d        if( objc==
14c40 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
14c50 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 2a 70  _DecrRefCount(*p
14c60 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20  pHook);.        
14c70 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20  *ppHook = 0;.   
14c80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14c90 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
14ca0 20 20 20 20 61 73 73 65 72 74 28 20 21 28 2a 70      assert( !(*p
14cb0 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 20 20  pHook) );.      
14cc0 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61 72 4c  if( Tcl_GetCharL
14cd0 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29 3e 30  ength(objv[2])>0
14ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 48   ){.        *ppH
14cf0 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20  ook = objv[2];. 
14d00 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
14d10 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
14d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14d30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 70 64  .    sqlite3_upd
14d40 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  ate_hook(pDb->db
14d50 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  , (pDb->pUpdateH
14d60 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64  ook?DbUpdateHand
14d70 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20  ler:0), pDb);.  
14d80 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61    sqlite3_rollba
14d90 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  ck_hook(pDb->db,
14da0 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
14db0 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61  ook?DbRollbackHa
14dc0 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a  ndler:0),pDb);..
14dd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
14de0 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73    /*    $db vers
14df0 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ion.  **.  ** Re
14e00 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e  turn the version
14e10 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73   string for this
14e20 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
14e30 20 20 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f    case DB_VERSIO
14e40 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  N: {.    Tcl_Set
14e50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
14e60 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c  char *)sqlite3_l
14e70 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c  ibversion(), TCL
14e80 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72  _STATIC);.    br
14e90 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f  eak;.  }...  } /
14ea0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49  * End of the SWI
14eb0 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  TCH statement */
14ec0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14ed0 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f  .#if SQLITE_TCL_
14ee0 4e 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61 70 74 6f  NRE./*.** Adapto
14ef0 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20  r that provides 
14f00 61 6e 20 6f 62 6a 43 6d 64 20 69 6e 74 65 72 66  an objCmd interf
14f10 61 63 65 20 74 6f 20 74 68 65 20 4e 52 45 2d 65  ace to the NRE-e
14f20 6e 61 62 6c 65 64 0a 2a 2a 20 69 6e 74 65 72 66  nabled.** interf
14f30 61 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ace implementati
14f40 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
14f50 74 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f  t DbObjCmdAdapto
14f60 72 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20  r(.  void *cd,. 
14f70 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
14f80 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
14f90 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  .  Tcl_Obj *cons
14fa0 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72 65 74 75  t*objv.){.  retu
14fb0 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62 6a  rn Tcl_NRCallObj
14fc0 50 72 6f 63 28 69 6e 74 65 72 70 2c 20 44 62 4f  Proc(interp, DbO
14fd0 62 6a 43 6d 64 2c 20 63 64 2c 20 6f 62 6a 63 2c  bjCmd, cd, objc,
14fe0 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e 64 69 66   objv);.}.#endif
14ff0 20 2f 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e   /* SQLITE_TCL_N
15000 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 73  RE */../*.**   s
15010 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49  qlite3 DBNAME FI
15020 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53  LENAME ?-vfs VFS
15030 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f  NAME? ?-key KEY?
15040 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c   ?-readonly BOOL
15050 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20  EAN?.**         
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 20 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45    ?-create BOOLE
15080 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f  AN? ?-nomutex BO
15090 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69  OLEAN?.**.** Thi
150a0 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63  s is the main Tc
150b0 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e  l command.  When
150c0 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54 63   the "sqlite" Tc
150d0 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20  l command is.** 
150e0 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f  invoked, this ro
150f0 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72  utine runs to pr
15100 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61  ocess that comma
15110 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  nd..**.** The fi
15120 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42  rst argument, DB
15130 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69  NAME, is an arbi
15140 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61  trary name for a
15150 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65   new.** database
15160 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
15170 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74  is command creat
15180 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64  es a new command
15190 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45   named.** DBNAME
151a0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
151b0 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f   control that co
151c0 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64  nnection.  The d
151d0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
151e0 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64  ction is deleted
151f0 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45   when the DBNAME
15200 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65   command is dele
15210 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
15220 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
15230 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
15240 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15250 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
15260 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63  t DbMain(void *c
15270 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
15280 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
15290 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
152a0 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
152b0 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65   *p;.  void *pKe
152c0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65  y = 0;.  int nKe
152d0 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  y = 0;.  const c
152e0 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61  har *zArg;.  cha
152f0 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e  r *zErrMsg;.  in
15300 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
15310 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73  r *zFile;.  cons
15320 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30  t char *zVfs = 0
15330 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20  ;.  int flags;. 
15340 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61   Tcl_DString tra
15350 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b  nslatedFilename;
15360 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c  ..  /* In normal
15370 20 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69   use, each TCL i
15380 6e 74 65 72 70 72 65 74 65 72 20 72 75 6e 73 20  nterpreter runs 
15390 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65  in a single thre
153a0 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20  ad.  So.  ** by 
153b0 64 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20  default, we can 
153c0 74 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67  turn of mutexing
153d0 20 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   on SQLite datab
153e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
153f0 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66  .  ** However, f
15400 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
15410 73 65 73 20 69 74 20 69 73 20 75 73 65 66 75 6c  ses it is useful
15420 20 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73   to have mutexes
15430 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e   turned.  ** on.
15440 20 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74    So, by default
15450 2c 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c  , mutexes defaul
15460 74 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63  t off.  But if c
15470 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a  ompiled with.  *
15480 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46  * SQLITE_TCL_DEF
15490 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74  AULT_FULLMUTEX t
154a0 68 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61  hen mutexes defa
154b0 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  ult on..  */.#if
154c0 64 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44  def SQLITE_TCL_D
154d0 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58  EFAULT_FULLMUTEX
154e0 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  .  flags = SQLIT
154f0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
15500 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
15510 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
15520 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23  PEN_FULLMUTEX;.#
15530 65 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53  else.  flags = S
15540 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
15550 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
15560 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
15570 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
15580 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f  .#endif..  if( o
15590 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41  bjc==2 ){.    zA
155a0 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
155b0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
155c0 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73  ], 0);.    if( s
155d0 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72  trcmp(zArg,"-ver
155e0 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sion")==0 ){.   
155f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15600 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74  ult(interp,sqlit
15610 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20  e3_version,0);. 
15620 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15630 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
15640 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
15650 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29  has-codec")==0 )
15660 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
15670 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
15680 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15690 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a  (interp,"1",0);.
156a0 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f  #else.      Tcl_
156b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
156c0 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64  erp,"0",0);.#end
156d0 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
156e0 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
156f0 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31  }.  for(i=3; i+1
15700 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20  <objc; i+=2){.  
15710 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
15720 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b  String(objv[i]);
15730 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
15740 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20  zArg,"-key")==0 
15750 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20  ){.      pKey = 
15760 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
15770 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31  FromObj(objv[i+1
15780 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 7d  ], &nKey);.    }
15790 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
157a0 7a 41 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30  zArg, "-vfs")==0
157b0 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
157c0 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f       zVfs = Tcl_
157d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
157e0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
157f0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
15800 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29  -readonly")==0 )
15810 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
15820 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
15830 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
15840 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
15850 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
15860 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
15870 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
15880 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
15890 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
158a0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
158b0 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66  EATE);.        f
158c0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
158d0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
158e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
158f0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
15900 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
15910 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  Y;.        flags
15920 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
15930 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20  READWRITE;.     
15940 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
15950 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
15960 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20  create")==0 ){. 
15970 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
15980 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
15990 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
159a0 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
159b0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
159c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
159d0 20 62 20 26 26 20 28 66 6c 61 67 73 20 26 20 53   b && (flags & S
159e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
159f0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
15a00 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
15a10 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
15a20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15a30 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
15a40 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
15a50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
15a60 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
15a70 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22  zArg, "-nomutex"
15a80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
15a90 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
15aa0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
15ab0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15ac0 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
15ad0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15ae0 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
15af0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
15b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
15b10 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  TEX;.        fla
15b20 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
15b30 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
15b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15b50 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
15b60 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
15b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 7d 65 6c  ;.      }.   }el
15b80 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
15b90 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78 22  rg, "-fullmutex"
15ba0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
15bb0 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
15bc0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
15bd0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15be0 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
15bf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15c00 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
15c10 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
15c20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
15c30 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66  MUTEX;.        f
15c40 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
15c50 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20  OPEN_NOMUTEX;.  
15c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15c70 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
15c80 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
15c90 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EX;.      }.    
15ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
15cb0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15cc0 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  terp, "unknown o
15cd0 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20  ption: ", zArg, 
15ce0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
15cf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15d00 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  R;.    }.  }.  i
15d10 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62  f( objc<3 || (ob
15d20 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20 20  jc&1)!=1 ){.    
15d30 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
15d40 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
15d50 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45  , .      "HANDLE
15d60 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20   FILENAME ?-vfs 
15d70 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f  VFSNAME? ?-reado
15d80 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63  nly BOOLEAN? ?-c
15d90 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a  reate BOOLEAN?".
15da0 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65        " ?-nomute
15db0 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c  x BOOLEAN? ?-ful
15dc0 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 22  lmutex BOOLEAN?"
15dd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
15de0 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22  AS_CODEC.      "
15df0 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f   ?-key CODECKEY?
15e00 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a  ".#endif.    );.
15e10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15e20 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  RROR;.  }.  zErr
15e30 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28  Msg = 0;.  p = (
15e40 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c  SqliteDb*)Tcl_Al
15e50 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
15e60 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
15e70 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
15e80 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c  lt(interp, "mall
15e90 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f  oc failed", TCL_
15ea0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
15eb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15ec0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
15ed0 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
15ee0 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
15ef0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
15f00 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69  jv[2], 0);.  zFi
15f10 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61  le = Tcl_Transla
15f20 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72  teFileName(inter
15f30 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73  p, zFile, &trans
15f40 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
15f50 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76    sqlite3_open_v
15f60 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 2c  2(zFile, &p->db,
15f70 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20   flags, zVfs);. 
15f80 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
15f90 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65  (&translatedFile
15fa0 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 51 4c  name);.  if( SQL
15fb0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
15fc0 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29  errcode(p->db) )
15fd0 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  {.    zErrMsg = 
15fe0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
15ff0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
16000 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
16010 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
16020 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  p->db);.    p->d
16030 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  b = 0;.  }.#ifde
16040 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
16050 45 43 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29  EC.  if( p->db )
16060 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65  {.    sqlite3_ke
16070 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e  y(p->db, pKey, n
16080 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Key);.  }.#endif
16090 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20  .  if( p->db==0 
160a0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
160b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
160c0 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  rMsg, TCL_VOLATI
160d0 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  LE);.    Tcl_Fre
160e0 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20 20  e((char*)p);.   
160f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
16100 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75  rrMsg);.    retu
16110 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16120 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d  }.  p->maxStmt =
16130 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54   NUM_PREPARED_ST
16140 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70  MTS;.  p->interp
16150 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41 72   = interp;.  zAr
16160 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
16170 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
16180 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62 55 73  , 0);.  if( DbUs
16190 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 54 63  eNre() ){.    Tc
161a0 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e  l_NRCreateComman
161b0 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20  d(interp, zArg, 
161c0 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72 2c  DbObjCmdAdaptor,
161d0 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20 20 20   DbObjCmd,.     
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44     (char*)p, DbD
16200 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d 65 6c  eleteCmd);.  }el
16210 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  se{.    Tcl_Crea
16220 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
16230 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a  erp, zArg, DbObj
16240 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44  Cmd, (char*)p, D
16250 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d  bDeleteCmd);.  }
16260 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
16270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  ;.}../*.** Provi
16280 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49  de a dummy Tcl_I
16290 6e 69 74 53 74 75 62 73 20 69 66 20 77 65 20 61  nitStubs if we a
162a0 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 61 73  re using this as
162b0 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62   a static.** lib
162c0 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rary..*/.#ifndef
162d0 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23   USE_TCL_STUBS.#
162e0 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74   undef  Tcl_Init
162f0 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54  Stubs.# define T
16300 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62  cl_InitStubs(a,b
16310 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
16320 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
16330 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45  ave a PACKAGE_VE
16340 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69  RSION macro defi
16350 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ned.  This will 
16360 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75  be.** defined au
16370 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74  tomatically by t
16380 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e  he TEA makefile.
16390 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65    But other make
163a0 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  files.** do not 
163b0 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69  define it..*/.#i
163c0 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45  fndef PACKAGE_VE
163d0 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50  RSION.# define P
163e0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53  ACKAGE_VERSION S
163f0 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65  QLITE_VERSION.#e
16400 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ndif../*.** Init
16410 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
16420 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  le..**.** This T
16430 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69  cl module contai
16440 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ns only a single
16450 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
16460 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e   named "sqlite".
16470 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65  .** (Hence there
16480 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65   is no namespace
16490 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70  .  There is no p
164a0 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20  oint in using a 
164b0 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20  namespace.** if 
164c0 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e  the extension on
164d0 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20  ly supplies one 
164e0 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20  new name!)  The 
164f0 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
16500 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f   is.** used to o
16510 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65  pen a new SQLite
16520 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65 20   database.  See 
16530 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75  the DbMain() rou
16540 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f  tine above.** fo
16550 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
16560 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45 58 54  ormation..*/.EXT
16570 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
16580 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
16590 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f  *interp){.  Tcl_
165a0 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
165b0 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54  , "8.4", 0);.  T
165c0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
165d0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  and(interp, "sql
165e0 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43  ite3", (Tcl_ObjC
165f0 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20  mdProc*)DbMain, 
16600 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67  0, 0);.  Tcl_Pkg
16610 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20  Provide(interp, 
16620 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41  "sqlite3", PACKA
16630 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 54  GE_VERSION);.  T
16640 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
16650 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  and(interp, "sql
16660 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d  ite", (Tcl_ObjCm
16670 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30  dProc*)DbMain, 0
16680 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50  , 0);.  Tcl_PkgP
16690 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
166a0 73 71 6c 69 74 65 22 2c 20 50 41 43 4b 41 47 45  sqlite", PACKAGE
166b0 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72 65 74  _VERSION);.  ret
166c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58  urn TCL_OK;.}.EX
166d0 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
166e0 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
166f0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
16700 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
16710 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54  t(interp); }.EXT
16720 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
16730 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
16740 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
16750 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
16760 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
16770 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63  ite3_SafeInit(Tc
16780 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16790 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
167a0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
167b0 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63  qlite3_Unload(Tc
167c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
167d0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
167e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
167f0 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
16800 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f  ite3_Unload(Tcl_
16810 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
16820 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75  int flags){ retu
16830 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54  rn TCL_OK; }.EXT
16840 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
16850 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  SafeUnload(Tcl_I
16860 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
16870 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
16880 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
16890 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
168a0 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c  3_SafeUnload(Tcl
168b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
168c0 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
168d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a 0a 0a 23  urn TCL_OK;}...#
168e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f  ifndef SQLITE_3_
168f0 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 45 58 54 45  SUFFIX_ONLY.EXTE
16900 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e  RN int Sqlite_In
16910 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
16920 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
16930 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
16940 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  rp); }.EXTERN in
16950 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74  t Tclsqlite_Init
16960 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
16970 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
16980 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
16990 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  ); }.EXTERN int 
169a0 53 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28  Sqlite_SafeInit(
169b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
169c0 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
169d0 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
169e0 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66 65 49   Tclsqlite_SafeI
169f0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
16a00 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
16a10 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
16a20 20 69 6e 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f   int Sqlite_Unlo
16a30 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
16a40 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
16a50 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
16a60 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
16a70 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28  clsqlite_Unload(
16a80 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16a90 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
16aa0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
16ab0 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
16ac0 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63  te_SafeUnload(Tc
16ad0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16ae0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
16af0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
16b00 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
16b10 69 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54  ite_SafeUnload(T
16b20 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
16b30 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
16b40 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a 23  eturn TCL_OK;}.#
16b50 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43  endif..#ifdef TC
16b60 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LSH./***********
16b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16bb0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
16bc0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75  hat follows is u
16bd0 73 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61  sed to build sta
16be0 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65  ndalone TCL inte
16bf0 72 70 72 65 74 65 72 73 0a 2a 2a 20 74 68 61 74  rpreters.** that
16c00 20 61 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20   are statically 
16c10 6c 69 6e 6b 65 64 20 77 69 74 68 20 53 51 4c 69  linked with SQLi
16c20 74 65 2e 20 20 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  te.  .*/../*.** 
16c30 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
16c40 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20  SH is one, then 
16c50 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73  put in code this
16c60 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69   for the.** "mai
16c70 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  n" routine that 
16c80 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20  will initialize 
16c90 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70  Tcl and take inp
16ca0 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64  ut from.** stand
16cb0 61 72 64 20 69 6e 70 75 74 2c 20 6f 72 20 69 66  ard input, or if
16cc0 20 61 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64   a file is named
16cd0 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
16ce0 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c 20  line.** the TCL 
16cf0 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 61 64  interpreter read
16d00 73 20 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20  s and evaluates 
16d10 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69  that file..*/.#i
16d20 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69  f TCLSH==1.stati
16d30 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
16d40 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65  [] =.  "set line
16d50 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20   {}\n".  "while 
16d60 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b  {![eof stdin]} {
16d70 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69  \n".    "if {$li
16d80 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  ne!=\"\"} {\n". 
16d90 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
16da0 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a  wline \"> \"\n".
16db0 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
16dc0 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
16dd0 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e  newline \"% \"\n
16de0 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20  ".    "}\n".    
16df0 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22  "flush stdout\n"
16e00 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e  .    "append lin
16e10 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
16e20 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f  ".    "if {[info
16e30 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d   complete $line]
16e40 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66  } {\n".      "if
16e50 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65   {[catch {upleve
16e60 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75  l #0 $line} resu
16e70 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  lt]} {\n".      
16e80 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c    "puts stderr \
16e90 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c  "Error: $result\
16ea0 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c  "\n".      "} el
16eb0 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
16ec0 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
16ed0 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c    "puts $result\
16ee0 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  n".      "}\n". 
16ef0 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b       "set line {
16f00 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65  }\n".    "} else
16f10 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70   {\n".      "app
16f20 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a  end line \\n\n".
16f30 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e      "}\n".  "}\n
16f40 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ".;.#endif../*.*
16f50 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
16f60 43 4c 53 48 20 69 73 20 74 77 6f 2c 20 74 68 65  CLSH is two, the
16f70 6e 20 67 65 74 20 74 68 65 20 6d 61 69 6e 20 6c  n get the main l
16f80 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a  oop code out of.
16f90 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ** the separate 
16fa0 66 69 6c 65 20 22 73 70 61 63 65 61 6e 61 6c 5f  file "spaceanal_
16fb0 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54  tcl.h"..*/.#if T
16fc0 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63  CLSH==2.static c
16fd0 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20  har zMainloop[] 
16fe0 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70 61  = .#include "spa
16ff0 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a  ceanal_tcl.h".;.
17000 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
17010 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20  TCLSH_MAIN main 
17020 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66    /* Needed to f
17030 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70  ake out mktclapp
17040 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41   */.int TCLSH_MA
17050 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  IN(int argc, cha
17060 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c  r **argv){.  Tcl
17070 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
17080 0a 20 20 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71  .  .  /* Call sq
17090 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
170a0 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 64 6f 69   once before doi
170b0 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
170c0 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a  . This is to.  *
170d0 2a 20 74 65 73 74 20 74 68 61 74 20 73 71 6c 69  * test that sqli
170e0 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 63  te3_shutdown() c
170f0 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63 61 6c  an be safely cal
17100 6c 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  led by a process
17110 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c   before.  ** sql
17120 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
17130 29 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ) is. */.  sqlit
17140 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a  e3_shutdown();..
17150 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74    Tcl_FindExecut
17160 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  able(argv[0]);. 
17170 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72   interp = Tcl_Cr
17180 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20  eateInterp();.  
17190 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
171a0 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  erp);.#ifdef SQL
171b0 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20  ITE_TEST.  {.   
171c0 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f   extern int Md5_
171d0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
171e0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
171f0 74 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49  t Sqliteconfig_I
17200 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
17210 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
17220 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
17230 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
17240 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
17250 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28  qlitetest2_Init(
17260 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
17270 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
17280 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63  itetest3_Init(Tc
17290 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
172a0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
172b0 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f  etest4_Init(Tcl_
172c0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
172d0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
172e0 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est5_Init(Tcl_In
172f0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
17300 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
17310 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t6_Init(Tcl_Inte
17320 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
17330 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37   int Sqlitetest7
17340 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
17350 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
17360 6e 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49  nt Sqlitetest8_I
17370 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
17380 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
17390 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69   Sqlitetest9_Ini
173a0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
173b0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
173c0 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49  qlitetestasync_I
173d0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
173e0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
173f0 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f   Sqlitetest_auto
17400 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ext_Init(Tcl_Int
17410 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
17420 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
17430 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49  _func_Init(Tcl_I
17440 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
17450 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
17460 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63  st_hexio_Init(Tc
17470 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
17480 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
17490 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28  etest_init_Init(
174a0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
174b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
174c0 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49  itetest_malloc_I
174d0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
174e0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
174f0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65   Sqlitetest_mute
17500 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  x_Init(Tcl_Inter
17510 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
17520 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63  int Sqlitetestsc
17530 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  hema_Init(Tcl_In
17540 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
17550 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
17560 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tsse_Init(Tcl_In
17570 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
17580 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
17590 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c  ttclvar_Init(Tcl
175a0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
175b0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
175c0 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28  testThread_Init(
175d0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
175e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
175f0 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49  itetestOnefile_I
17600 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72  nit();.    exter
17610 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
17620 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f  Osinst_Init(Tcl_
17630 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
17640 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
17650 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54  estbackup_Init(T
17660 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20  cl_Interp*);..  
17670 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72    Md5_Init(inter
17680 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 63 6f  p);.    Sqliteco
17690 6e 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70  nfig_Init(interp
176a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
176b0 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t1_Init(interp);
176c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32  .    Sqlitetest2
176d0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
176e0 20 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49     Sqlitetest3_I
176f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
17700 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
17710 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
17720 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
17730 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
17740 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e  itetest6_Init(in
17750 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
17760 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65  etest7_Init(inte
17770 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
17780 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70  est8_Init(interp
17790 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
177a0 74 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t9_Init(interp);
177b0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61  .    Sqlitetesta
177c0 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  sync_Init(interp
177d0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
177e0 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69  t_autoext_Init(i
177f0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
17800 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74  tetest_func_Init
17810 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
17820 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49  litetest_hexio_I
17830 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
17840 20 53 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74   Sqlitetest_init
17850 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
17860 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61     Sqlitetest_ma
17870 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  lloc_Init(interp
17880 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
17890 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74  t_mutex_Init(int
178a0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
178b0 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28  testschema_Init(
178c0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
178d0 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e  itetesttclvar_In
178e0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
178f0 53 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64  SqlitetestThread
17900 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
17910 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65     SqlitetestOne
17920 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  file_Init(interp
17930 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
17940 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74  tOsinst_Init(int
17950 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
17960 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28  testbackup_Init(
17970 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 64 65 66  interp);..#ifdef
17980 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20   SQLITE_SSE.    
17990 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e  Sqlitetestsse_In
179a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
179b0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
179c0 69 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54  if( argc>=2 || T
179d0 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69  CLSH==2 ){.    i
179e0 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a  nt i;.    char z
179f0 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71  Argc[32];.    sq
17a00 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
17a10 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41  izeof(zArgc), zA
17a20 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d  rgc, "%d", argc-
17a30 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20 20  (3-TCLSH));.    
17a40 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
17a50 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67 63 2c  p,"argc", zArgc,
17a60 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
17a70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
17a80 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22  r(interp,"argv0"
17a90 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f  ,argv[1],TCL_GLO
17aa0 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
17ab0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
17ac0 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c  ,"argv", "", TCL
17ad0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
17ae0 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48     for(i=3-TCLSH
17af0 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
17b00 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
17b10 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
17b20 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
17b30 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
17b40 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
17b50 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
17b60 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
17b70 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d  }.    if( TCLSH=
17b80 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69  =1 && Tcl_EvalFi
17b90 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
17ba0 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  1])!=TCL_OK ){. 
17bb0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
17bc0 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74  *zInfo = Tcl_Get
17bd0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72  Var(interp, "err
17be0 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f  orInfo", TCL_GLO
17bf0 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BAL_ONLY);.     
17c00 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20   if( zInfo==0 ) 
17c10 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 53  zInfo = Tcl_GetS
17c20 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
17c30 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  rp);.      fprin
17c40 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25  tf(stderr,"%s: %
17c50 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e  s\n", *argv, zIn
17c60 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  fo);.      retur
17c70 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
17c80 20 69 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20   if( argc<=1 || 
17c90 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20  TCLSH==2 ){.    
17ca0 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69  Tcl_GlobalEval(i
17cb0 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70  nterp, zMainloop
17cc0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17cd0 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54  0;.}.#endif /* T
17ce0 43 4c 53 48 20 2a 2f 0a                          CLSH */.