/ Hex Artifact Content
Login

Artifact 648e6f53041ce4974234d4963e71680926760925:


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 2a 0a  n of SQLite..**.
0200: 2a 2a 20 24 49 64 3a 20 74 63 6c 73 71 6c 69 74  ** $Id: tclsqlit
0210: 65 2e 63 2c 76 20 31 2e 31 39 34 20 32 30 30 37  e.c,v 1.194 2007
0220: 2f 30 38 2f 30 37 20 31 37 3a 31 33 3a 30 34 20  /08/07 17:13:04 
0230: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0240: 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69  clude "tcl.h".#i
0250: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
0260: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 61 64 64  ../*.** Some add
0270: 69 74 69 6f 6e 61 6c 20 69 6e 63 6c 75 64 65 20  itional include 
0280: 66 69 6c 65 73 20 61 72 65 20 6e 65 65 64 65 64  files are needed
0290: 20 69 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   if this file is
02a0: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 6e 64 65 64   not.** appended
02b0: 20 74 6f 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   to the amalgama
02c0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
02d0: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
02e0: 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22  TION.# include "
02f0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 20 69  sqliteInt.h".# i
0300: 6e 63 6c 75 64 65 20 22 68 61 73 68 2e 68 22 0a  nclude "hash.h".
0310: 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  # include <stdli
0320: 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c  b.h>.# include <
0330: 73 74 72 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c  string.h>.# incl
0340: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0350: 20 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e   include <ctype.
0360: 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  h>.#endif../*. *
0370: 20 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74   Windows needs t
0380: 6f 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d  o know which sym
0390: 62 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20  bols to export. 
03a0: 20 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a   Unix does not..
03b0: 20 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20   * BUILD_sqlite 
03c0: 73 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69  should be undefi
03d0: 6e 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a  ned for Unix.. *
03e0: 2f 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73  /.#ifdef BUILD_s
03f0: 71 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c  qlite.#undef TCL
0400: 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23  _STORAGE_CLASS.#
0410: 64 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41  define TCL_STORA
0420: 47 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f  GE_CLASS DLLEXPO
0430: 52 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49  RT.#endif /* BUI
0440: 4c 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64  LD_sqlite */..#d
0450: 65 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52  efine NUM_PREPAR
0460: 45 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66  ED_STMTS 10.#def
0470: 69 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44  ine MAX_PREPARED
0480: 5f 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a  _STMTS 100../*.*
0490: 2a 20 49 66 20 54 43 4c 20 75 73 65 73 20 55 54  * If TCL uses UT
04a0: 46 2d 38 20 61 6e 64 20 53 51 4c 69 74 65 20 69  F-8 and SQLite i
04b0: 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
04c0: 75 73 65 20 69 73 6f 38 38 35 39 2c 20 74 68 65  use iso8859, the
04d0: 6e 20 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20  n we.** have to 
04e0: 64 6f 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  do a translation
04f0: 20 77 68 65 6e 20 67 6f 69 6e 67 20 62 65 74 77   when going betw
0500: 65 65 6e 20 74 68 65 20 74 77 6f 2e 20 20 53 65  een the two.  Se
0510: 74 20 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52  t the .** UTF_TR
0520: 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  ANSLATION_NEEDED
0530: 20 6d 61 63 72 6f 20 74 6f 20 69 6e 64 69 63 61   macro to indica
0540: 74 65 20 74 68 61 74 20 77 65 20 6e 65 65 64 20  te that we need 
0550: 74 6f 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72  to do.** this tr
0560: 61 6e 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  anslation.  .*/.
0570: 23 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c 5f  #if defined(TCL_
0580: 55 54 46 5f 4d 41 58 29 20 26 26 20 21 64 65 66  UTF_MAX) && !def
0590: 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38  ined(SQLITE_UTF8
05a0: 29 0a 23 20 64 65 66 69 6e 65 20 55 54 46 5f 54  ).# define UTF_T
05b0: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
05c0: 44 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  D 1.#endif../*.*
05d0: 2a 20 4e 65 77 20 53 51 4c 20 66 75 6e 63 74 69  * New SQL functi
05e0: 6f 6e 73 20 63 61 6e 20 62 65 20 63 72 65 61 74  ons can be creat
05f0: 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74  ed as TCL script
0600: 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 66 75  s.  Each such fu
0610: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73  nction.** is des
0620: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
0630: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0640: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0650: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0660: 75 63 74 20 53 71 6c 46 75 6e 63 20 53 71 6c 46  uct SqlFunc SqlF
0670: 75 6e 63 3b 0a 73 74 72 75 63 74 20 53 71 6c 46  unc;.struct SqlF
0680: 75 6e 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  unc {.  Tcl_Inte
0690: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a  rp *interp;   /*
06a0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
06b0: 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  et to execute th
06c0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
06d0: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
06e0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 54 63 6c  ;     /* The Tcl
06f0: 5f 4f 62 6a 20 72 65 70 72 65 73 65 6e 74 61 74  _Obj representat
0700: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70  ion of the scrip
0710: 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45 76  t */.  int useEv
0720: 61 6c 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20  alObjv;      /* 
0730: 54 72 75 65 20 69 66 20 69 74 20 69 73 20 73 61  True if it is sa
0740: 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76  fe to use Tcl_Ev
0750: 61 6c 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72  alObjv */.  char
0760: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
0770: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69    /* Name of thi
0780: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
0790: 53 71 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20  SqlFunc *pNext; 
07a0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75        /* Next fu
07b0: 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69  nction on the li
07c0: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a  st of them all *
07d0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20  /.};../*.** New 
07e0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
07f0: 63 65 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ces function can
0800: 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54   be created as T
0810: 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63  CL scripts.  Eac
0820: 68 20 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69  h such.** functi
0830: 6f 6e 20 69 73 20 64 65 73 63 72 69 62 65 64 20  on is described 
0840: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0850: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0860: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
0870: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0880: 43 6f 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61  Collate SqlColla
0890: 74 65 3b 0a 73 74 72 75 63 74 20 53 71 6c 43 6f  te;.struct SqlCo
08a0: 6c 6c 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e  llate {.  Tcl_In
08b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20  terp *interp;   
08c0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
08d0: 70 72 65 74 20 74 6f 20 65 78 65 63 75 74 65 20  pret to execute 
08e0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
08f0: 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b    char *zScript;
0900: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
0910: 63 72 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20  cript to be run 
0920: 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  */.  SqlCollate 
0930: 2a 70 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65  *pNext;    /* Ne
0940: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0950: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0960: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0970: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
0980: 65 6e 74 73 20 61 72 65 20 63 61 63 68 65 64 20  ents are cached 
0990: 66 6f 72 20 66 61 73 74 65 72 20 65 78 65 63 75  for faster execu
09a0: 74 69 6f 6e 2e 20 20 45 61 63 68 20 70 72 65 70  tion.  Each prep
09b0: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
09c0: 74 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62  t is described b
09d0: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  y an instance of
09e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
09f0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
0a00: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 50  edef struct SqlP
0a10: 72 65 70 61 72 65 64 53 74 6d 74 20 53 71 6c 50  reparedStmt SqlP
0a20: 72 65 70 61 72 65 64 53 74 6d 74 3b 0a 73 74 72  reparedStmt;.str
0a30: 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  uct SqlPreparedS
0a40: 74 6d 74 20 7b 0a 20 20 53 71 6c 50 72 65 70 61  tmt {.  SqlPrepa
0a50: 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20  redStmt *pNext; 
0a60: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b   /* Next in link
0a70: 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c  ed list */.  Sql
0a80: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
0a90: 72 65 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rev;  /* Previou
0aa0: 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  s on the list */
0ab0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
0ac0: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54  *pStmt;     /* T
0ad0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
0ae0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
0af0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
0b00: 20 20 20 20 2f 2a 20 63 68 61 72 73 20 69 6e 20      /* chars in 
0b10: 7a 53 71 6c 5b 5d 20 2a 2f 0a 20 20 63 68 61 72  zSql[] */.  char
0b20: 20 7a 53 71 6c 5b 31 5d 3b 20 20 20 20 20 20 20   zSql[1];       
0b30: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
0b40: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
0b50: 74 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  t */.};..typedef
0b60: 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62   struct Incrblob
0b70: 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62  Channel Incrblob
0b80: 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  Channel;../*.** 
0b90: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
0ba0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0bb0: 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
0bc0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0bd0: 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
0be0: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
0bf0: 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72  SQLite TCL inter
0c00: 66 61 63 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  face..*/.typedef
0c10: 20 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62   struct SqliteDb
0c20: 20 53 71 6c 69 74 65 44 62 3b 0a 73 74 72 75 63   SqliteDb;.struc
0c30: 74 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73  t SqliteDb {.  s
0c40: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
0c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0c60: 20 22 72 65 61 6c 22 20 64 61 74 61 62 61 73 65   "real" database
0c70: 20 73 74 72 75 63 74 75 72 65 2e 20 4d 55 53 54   structure. MUST
0c80: 20 42 45 20 46 49 52 53 54 20 2a 2f 0a 20 20 54   BE FIRST */.  T
0c90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0ca0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p;        /* The
0cb0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 75 73 65   interpreter use
0cc0: 64 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  d for this datab
0cd0: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ase */.  char *z
0ce0: 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 20  Busy;           
0cf0: 20 20 20 20 2f 2a 20 54 68 65 20 62 75 73 79 20      /* The busy 
0d00: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0d10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d   */.  char *zCom
0d20: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
0d30: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 69 74 20 68   /* The commit h
0d40: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ook callback rou
0d50: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
0d60: 7a 54 72 61 63 65 3b 20 20 20 20 20 20 20 20 20  zTrace;         
0d70: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63       /* The trac
0d80: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
0d90: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ne */.  char *zP
0da0: 72 6f 66 69 6c 65 3b 20 20 20 20 20 20 20 20 20  rofile;         
0db0: 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c     /* The profil
0dc0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
0dd0: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ne */.  char *zP
0de0: 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20 20  rogress;        
0df0: 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 65     /* The progre
0e00: 73 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  ss callback rout
0e10: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
0e20: 41 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Auth;           
0e30: 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 68 6f      /* The autho
0e40: 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
0e50: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0e60: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20  har *zNull;     
0e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
0e80: 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20  t to substitute 
0e90: 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  for an SQL NULL 
0ea0: 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75  value */.  SqlFu
0eb0: 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20  nc *pFunc;      
0ec0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
0ed0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a   SQL functions *
0ee0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70  /.  Tcl_Obj *pUp
0ef0: 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f  dateHook;      /
0f00: 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73 63  * Update hook sc
0f10: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
0f20: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c  .  Tcl_Obj *pRol
0f30: 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a  lbackHook;    /*
0f40: 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73   Rollback hook s
0f50: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
0f60: 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  /.  SqlCollate *
0f70: 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f  pCollate;      /
0f80: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
0f90: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
0fa0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
0fd0: 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20   of most recent 
0fe0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a  sqlite3_exec() *
0ff0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f  /.  Tcl_Obj *pCo
1000: 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f  llateNeeded;   /
1010: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  * Collation need
1020: 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53  ed script */.  S
1030: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
1040: 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73  stmtList; /* Lis
1050: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
1060: 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c  atements*/.  Sql
1070: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
1080: 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20  mtLast; /* Last 
1090: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
10a0: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d   list */.  int m
10b0: 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  axStmt;         
10c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
10d0: 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  t maximum number
10e0: 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   of stmtList */.
10f0: 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20    int nStmt;    
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1110: 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  Number of statem
1120: 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74  ents in stmtList
1130: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1140: 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62  annel *pIncrblob
1150: 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20  ;/* Linked list 
1160: 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  of open incrblob
1170: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a   channels */.};.
1180: 0a 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62  .struct Incrblob
1190: 43 68 61 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69  Channel {.  sqli
11a0: 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b  te3_blob *pBlob;
11b0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
11c0: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a   blob handle */.
11d0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b    SqliteDb *pDb;
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11f0: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
1200: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1210: 0a 20 20 69 6e 74 20 69 53 65 65 6b 3b 20 20 20  .  int iSeek;   
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1230: 43 75 72 72 65 6e 74 20 73 65 65 6b 20 6f 66 66  Current seek off
1240: 73 65 74 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61  set */.  Tcl_Cha
1250: 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20  nnel channel;   
1260: 20 20 20 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64     /* Channel id
1270: 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e  entifier */.  In
1280: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1290: 4e 65 78 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65  Next;   /* Linke
12a0: 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70  d list of all op
12b0: 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  en incrblob chan
12c0: 6e 65 6c 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c  nels */.  Incrbl
12d0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76  obChannel *pPrev
12e0: 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69  ;   /* Linked li
12f0: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69  st of all open i
1300: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73  ncrblob channels
1310: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20   */.};..#ifndef 
1320: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1330: 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  BLOB./*.** Close
1340: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68   all incrblob ch
1350: 61 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75 73  annels opened us
1360: 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ing database con
1370: 6e 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20  nection pDb..** 
1380: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77  This is called w
1390: 68 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f 77  hen shutting dow
13a0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  n the database c
13b0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
13c0: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 49  atic void closeI
13d0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
13e0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a  SqliteDb *pDb){.
13f0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1400: 6c 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62  l *p;.  Incrblob
1410: 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a  Channel *pNext;.
1420: 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49  .  for(p=pDb->pI
1430: 6e 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e  ncrblob; p; p=pN
1440: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
1450: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20  = p->pNext;..   
1460: 20 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e   /* Note: Callin
1470: 67 20 75 6e 72 65 67 69 73 74 65 72 20 68 65 72  g unregister her
1480: 65 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65  e call Tcl_Close
1490: 20 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f 62   on the incrblob
14a0: 20 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a   channel, .    *
14b0: 2a 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20  * which deletes 
14c0: 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  the IncrblobChan
14d0: 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 61 74  nel structure at
14e0: 20 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20   *p. So do not. 
14f0: 20 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46     ** call Tcl_F
1500: 72 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20 20  ree() here..    
1510: 2a 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65 67  */.    Tcl_Unreg
1520: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44 62  isterChannel(pDb
1530: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61  ->interp, p->cha
1540: 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  nnel);.  }.}../*
1550: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63  .** Close an inc
1560: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
1570: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
1580: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f   int incrblobClo
1590: 73 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  se(ClientData in
15a0: 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f  stanceData, Tcl_
15b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
15c0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
15d0: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
15e0: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
15f0: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72  nceData;.  int r
1600: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
1610: 5f 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29  _close(p->pBlob)
1620: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1630: 3d 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20  = p->pDb->db;.. 
1640: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63   /* Remove the c
1650: 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20  hannel from the 
1660: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
1670: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66  ob list. */.  if
1680: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
1690: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
16a0: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
16b0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  }.  if( p->pPrev
16c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
16d0: 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
16e0: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
16f0: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d  >pDb->pIncrblob=
1700: 3d 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62  =p ){.    p->pDb
1710: 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d  ->pIncrblob = p-
1720: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f  >pNext;.  }..  /
1730: 2a 20 46 72 65 65 20 74 68 65 20 49 6e 63 72 62  * Free the Incrb
1740: 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63  lobChannel struc
1750: 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72  ture */.  Tcl_Fr
1760: 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a  ee((char *)p);..
1770: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
1790: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
17a0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
17b0: 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c  _errmsg(db), TCL
17c0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
17d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
17f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1800: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
1810: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
1820: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
1830: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
1840: 6f 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e  obInput(.  Clien
1850: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
1860: 74 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75 66  ta, .  char *buf
1870: 2c 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a 65  , .  int bufSize
1880: 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f  ,.  int *errorCo
1890: 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62  dePtr.){.  Incrb
18a0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
18b0: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
18c0: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
18d0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 62  .  int nRead = b
18e0: 75 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ufSize;         
18f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1900: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
1910: 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1930: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
1940: 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20  e blob */.  int 
1950: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1960: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
1970: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
1980: 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  nBlob = sqli
1990: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
19a0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  ->pBlob);.  if( 
19b0: 28 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29  (p->iSeek+nRead)
19c0: 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52  >nBlob ){.    nR
19d0: 65 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69  ead = nBlob-p->i
19e0: 53 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Seek;.  }.  if( 
19f0: 6e 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20  nRead<=0 ){.    
1a00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1a10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
1a20: 6f 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62  ob_read(p->pBlob
1a30: 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e  , (void *)buf, n
1a40: 52 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b  Read, p->iSeek);
1a50: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72  E_OK ){.    *err
1a70: 6f 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a  orCodePtr = rc;.
1a80: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1a90: 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b   }..  p->iSeek +
1aa0: 3d 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75 72  = nRead;.  retur
1ab0: 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nRead;.}../*.*
1ac0: 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20  * Write data to 
1ad0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
1ae0: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
1af0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
1b00: 6c 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c 69  lobOutput(.  Cli
1b10: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
1b20: 44 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63  Data, .  CONST c
1b30: 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74  har *buf, .  int
1b40: 20 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74 20   toWrite,.  int 
1b50: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
1b60: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1b70: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
1b80: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
1b90: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e  nceData;.  int n
1ba0: 57 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65 3b  Write = toWrite;
1bb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1bc0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
1bd0: 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c  ite */.  int nBl
1be0: 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
1bf0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
1c00: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20  ize of the blob 
1c10: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f    /* sqlite erro
1c40: 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c  r code */..  nBl
1c50: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  ob = sqlite3_blo
1c60: 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62  b_bytes(p->pBlob
1c70: 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65  );.  if( (p->iSe
1c80: 65 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62  ek+nWrite)>nBlob
1c90: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
1ca0: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
1cb0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1cc0: 20 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65 3c   }.  if( nWrite<
1cd0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1ce0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
1cf0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
1d00: 74 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f  te(p->pBlob, (vo
1d10: 69 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74 65  id *)buf, nWrite
1d20: 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69  , p->iSeek);.  i
1d30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d40: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
1d50: 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20  dePtr = EIO;.   
1d60: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1d70: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e  .  p->iSeek += n
1d80: 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
1d90: 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nWrite;.}../*.**
1da0: 20 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65   Seek an increme
1db0: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1dc0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1dd0: 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20   incrblobSeek(. 
1de0: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
1df0: 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e  anceData, .  lon
1e00: 67 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20  g offset,.  int 
1e10: 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20  seekMode,.  int 
1e20: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
1e30: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1e40: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
1e50: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
1e60: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69 74  nceData;..  swit
1e70: 63 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a  ch( seekMode ){.
1e80: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53 45      case SEEK_SE
1e90: 54 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  T:.      p->iSee
1ea0: 6b 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  k = offset;.    
1eb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1ec0: 65 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20  e SEEK_CUR:.    
1ed0: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66    p->iSeek += of
1ee0: 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  fset;.      brea
1ef0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b  k;.    case SEEK
1f00: 5f 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69  _END:.      p->i
1f10: 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62  Seek = sqlite3_b
1f20: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c  lob_bytes(p->pBl
1f30: 6f 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20  ob) + offset;.  
1f40: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1f50: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
1f60: 21 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22 29  !"Bad seekMode")
1f70: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1f80: 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74  p->iSeek;.}...st
1f90: 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62 6c  atic void incrbl
1fa0: 6f 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44 61  obWatch(ClientDa
1fb0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
1fc0: 20 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f   int mode){ .  /
1fd0: 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74  * NO-OP */ .}.st
1fe0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
1ff0: 62 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61  bHandle(ClientDa
2000: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
2010: 20 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e 74   int dir, Client
2020: 44 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20 72  Data *hPtr){.  r
2030: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2040: 0a 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 43  .}..static Tcl_C
2050: 68 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72 62  hannelType Incrb
2060: 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d  lobChannelType =
2070: 20 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c   {.  "incrblob",
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65 4e          /* typeN
20a0: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 2a 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c  */.  TCL_CHANNEL
20d0: 5f 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20  _VERSION_2,     
20e0: 20 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73 69          /* versi
20f0: 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f  */.  incrblobClo
2120: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2130: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65          /* close
2140: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70  */.  incrblobInp
2170: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
2180: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75 74          /* input
2190: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74  */.  incrblobOut
21c0: 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  put,            
21d0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70 75          /* outpu
21e0: 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  tProc           
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65 65  */.  incrblobSee
2210: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2220: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b 50          /* seekP
2230: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f 70          /* setOp
2280: 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20  tionProc        
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f 70          /* getOp
22d0: 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20  tionProc        
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61 74  */.  incrblobWat
2300: 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
2310: 20 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63 68          /* watch
2320: 50 72 6f 63 20 28 74 68 69 73 20 69 73 20 61 20  Proc (this is a 
2330: 6e 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20 20  no-op)          
2340: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e  */.  incrblobHan
2350: 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  dle,            
2360: 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48 61          /* getHa
2370: 6e 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79 73  ndleProc (always
2380: 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29 20   returns error) 
2390: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65          /* close
23c0: 32 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  2Proc           
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b          /* block
2410: 4d 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20 20  ModeProc        
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73 68          /* flush
2460: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 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 2f 2a 20 68 61 6e 64 6c          /* handl
24b0: 65 72 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  erProc          
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 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 2f 2a 20 77 69 64 65 53          /* wideS
2500: 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20  eekProc         
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  */.};../*.** Cre
2530: 61 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62 6c  ate a new incrbl
2540: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
2550: 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
2560: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28  IncrblobChannel(
2570: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2580: 6e 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74 65  nterp, .  Sqlite
2590: 44 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73  Db *pDb, .  cons
25a0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63  t char *zDb,.  c
25b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
25c0: 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e, .  const char
25d0: 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71   *zColumn, .  sq
25e0: 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c  lite_int64 iRow,
25f0: 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
2600: 79 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  y.){.  IncrblobC
2610: 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c  hannel *p;.  sql
2620: 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e  ite3 *db = pDb->
2630: 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  db;.  sqlite3_bl
2640: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
2650: 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73   rc;.  int flags
2660: 20 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c   = TCL_READABLE|
2670: 28 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20  (isReadonly ? 0 
2680: 3a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b  : TCL_WRITABLE);
2690: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72 69  ..  /* This vari
26a0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
26b0: 6e 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65 6c  name the channel
26c0: 73 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e  s: "incrblob_[in
26d0: 63 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20  cr count]" */.  
26e0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
26f0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43 68   = 0;.  char zCh
2700: 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63  annel[64];..  rc
2710: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2720: 6f 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54  open(db, zDb, zT
2730: 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69  able, zColumn, i
2740: 52 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79  Row, !isReadonly
2750: 2c 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  , &pBlob);.  if(
2760: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2770: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
2780: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
2790: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
27a0: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
27b0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
27c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27d0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e  ;.  }..  p = (In
27e0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
27f0: 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66  Tcl_Alloc(sizeof
2800: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
2810: 29 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d  ));.  p->iSeek =
2820: 20 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d   0;.  p->pBlob =
2830: 20 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74   pBlob;..  sqlit
2840: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2850: 6f 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43  of(zChannel), zC
2860: 68 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f  hannel, "incrblo
2870: 62 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b  b_%d", ++count);
2880: 0a 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20  .  p->channel = 
2890: 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65  Tcl_CreateChanne
28a0: 6c 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  l(&IncrblobChann
28b0: 65 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c  elType, zChannel
28c0: 2c 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54  , p, flags);.  T
28d0: 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e  cl_RegisterChann
28e0: 65 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68  el(interp, p->ch
28f0: 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69  annel);..  /* Li
2900: 6e 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e 6e  nk the new chann
2910: 65 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c 69  el into the Sqli
2920: 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c  teDb.pIncrblob l
2930: 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65  ist. */.  p->pNe
2940: 78 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62  xt = pDb->pIncrb
2950: 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20  lob;.  p->pPrev 
2960: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  = 0;.  if( p->pN
2970: 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
2980: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
2990: 20 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72    }.  pDb->pIncr
29a0: 62 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70  blob = p;.  p->p
29b0: 44 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c  Db = pDb;..  Tcl
29c0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
29d0: 70 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47  p, (char *)Tcl_G
29e0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d  etChannelName(p-
29f0: 3e 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56  >channel), TCL_V
2a00: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75  OLATILE);.  retu
2a10: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c  rn TCL_OK;.}.#el
2a20: 73 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75  se  /* else clau
2a30: 73 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66 20  se for "#ifndef 
2a40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
2a50: 42 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66 69  BLOB" */.  #defi
2a60: 6e 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62  ne closeIncrblob
2a70: 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65  Channels(pDb).#e
2a80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  ndif../*.** Look
2a90: 20 61 74 20 74 68 65 20 73 63 72 69 70 74 20 70   at the script p
2aa0: 72 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20 20  refix in pCmd.  
2ab0: 57 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75  We will be execu
2ac0: 74 69 6e 67 20 74 68 69 73 20 73 63 72 69 70 74  ting this script
2ad0: 0a 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74 20  .** after first 
2ae0: 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72  appending one or
2af0: 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e   more arguments.
2b00: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
2b10: 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73  nalyzes.** the s
2b20: 63 72 69 70 74 20 74 6f 20 73 65 65 20 69 66 20  cript to see if 
2b30: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
2b40: 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  e Tcl_EvalObjv()
2b50: 20 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a 2a   on the script.*
2b60: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68  * rather than th
2b70: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 54  e more general T
2b80: 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54 63  cl_EvalEx().  Tc
2b90: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20  l_EvalObjv() is 
2ba0: 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a  much.** faster..
2bb0: 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74 68  **.** Scripts th
2bc0: 61 74 20 61 72 65 20 73 61 66 65 20 74 6f 20 75  at are safe to u
2bd0: 73 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61 6c  se with Tcl_Eval
2be0: 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73 20  Objv() consists 
2bf0: 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20  of a.** command 
2c00: 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  name followed by
2c10: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72   zero or more ar
2c20: 67 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f 20  guments with no 
2c30: 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72  [...] or $.** or
2c40: 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62   {...} or ; to b
2c50: 65 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65 2e  e seen anywhere.
2c60: 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20    Most callback 
2c70: 73 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74 0a  scripts consist.
2c80: 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69 6e  ** of just a sin
2c90: 67 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e 61  gle procedure na
2ca0: 6d 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65 74  me and they meet
2cb0: 20 74 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e   this requiremen
2cc0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2cd0: 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62   safeToUseEvalOb
2ce0: 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  jv(Tcl_Interp *i
2cf0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
2d00: 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63  pCmd){.  /* We c
2d10: 6f 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20 73  ould try to do s
2d20: 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54 63  omething with Tc
2d30: 6c 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74 20  l_Parse().  But 
2d40: 77 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a  we will instead.
2d50: 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20 73    ** just do a s
2d60: 65 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69 64  earch for forbid
2d70: 64 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20  den characters. 
2d80: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
2d90: 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68  orbidden.  ** ch
2da0: 61 72 61 63 74 65 72 73 20 61 70 70 65 61 72 20  aracters appear 
2db0: 69 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c  in pCmd, we will
2dc0: 20 72 65 70 6f 72 74 20 74 68 65 20 73 74 72 69   report the stri
2dd0: 6e 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20 20  ng as unsafe..  
2de0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2df0: 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a  *z;.  int n;.  z
2e00: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2e10: 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e  FromObj(pCmd, &n
2e20: 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  );.  while( n-- 
2e30: 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  > 0 ){.    int c
2e40: 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69   = *(z++);.    i
2e50: 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d  f( c=='$' || c==
2e60: 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20  '[' || c==';' ) 
2e70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2e80: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
2e90: 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46 75  ** Find an SqlFu
2ea0: 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 69 74  nc structure wit
2eb0: 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65  h the given name
2ec0: 2e 20 20 4f 72 20 63 72 65 61 74 65 20 61 20 6e  .  Or create a n
2ed0: 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20  ew.** one if an 
2ee0: 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e  existing one can
2ef0: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20 52  not be found.  R
2f00: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2f10: 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63 74  to the.** struct
2f20: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ure..*/.static S
2f30: 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46  qlFunc *findSqlF
2f40: 75 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70 44  unc(SqliteDb *pD
2f50: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2f60: 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63  Name){.  SqlFunc
2f70: 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e   *p, *pNew;.  in
2f80: 74 20 69 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53  t i;.  pNew = (S
2f90: 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f  qlFunc*)Tcl_Allo
2fa0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
2fb0: 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   + strlen(zName)
2fc0: 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e   + 1 );.  pNew->
2fd0: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
2fe0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  pNew[1];.  for(i
2ff0: 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b  =0; zName[i]; i+
3000: 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b  +){ pNew->zName[
3010: 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e 61  i] = tolower(zNa
3020: 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20 70 4e 65 77  me[i]); }.  pNew
3030: 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a  ->zName[i] = 0;.
3040: 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75    for(p=pDb->pFu
3050: 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  nc; p; p=p->pNex
3060: 74 29 7b 20 0a 20 20 20 20 69 66 28 20 73 74 72  t){ .    if( str
3070: 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e  cmp(p->zName, pN
3080: 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ew->zName)==0 ){
3090: 0a 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28  .      Tcl_Free(
30a0: 28 63 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20  (char*)pNew);.  
30b0: 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20      return p;.  
30c0: 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e    }.  }.  pNew->
30d0: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
30e0: 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  terp;.  pNew->pS
30f0: 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70 4e 65  cript = 0;.  pNe
3100: 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  w->pNext = pDb->
3110: 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e 70 46  pFunc;.  pDb->pF
3120: 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65  unc = pNew;.  re
3130: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3140: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64  .** Finalize and
3150: 20 66 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20   free a list of 
3160: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
3170: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
3180: 69 64 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68  id flushStmtCach
3190: 65 28 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  e( SqliteDb *pDb
31a0: 20 29 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65   ){.  SqlPrepare
31b0: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b  dStmt *pPreStmt;
31c0: 0a 0a 20 20 77 68 69 6c 65 28 20 20 70 44 62 2d  ..  while(  pDb-
31d0: 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20  >stmtList ){.   
31e0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
31f0: 65 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  e( pDb->stmtList
3200: 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 70  ->pStmt );.    p
3210: 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73  PreStmt = pDb->s
3220: 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 70 44 62  tmtList;.    pDb
3230: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 44 62  ->stmtList = pDb
3240: 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 4e 65 78  ->stmtList->pNex
3250: 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  t;.    Tcl_Free(
3260: 20 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74   (char*)pPreStmt
3270: 20 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e   );.  }.  pDb->n
3280: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d  Stmt = 0;.  pDb-
3290: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 7d  >stmtLast = 0;.}
32a0: 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c  ../*.** TCL call
32b0: 73 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  s this procedure
32c0: 20 77 68 65 6e 20 61 6e 20 73 71 6c 69 74 65 33   when an sqlite3
32d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e   database comman
32e0: 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e  d is.** deleted.
32f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3300: 44 62 44 65 6c 65 74 65 43 6d 64 28 76 6f 69 64  DbDeleteCmd(void
3310: 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74 65 44   *db){.  SqliteD
3320: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
3330: 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73 68 53  Db*)db;.  flushS
3340: 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a 20  tmtCache(pDb);. 
3350: 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68   closeIncrblobCh
3360: 61 6e 6e 65 6c 73 28 70 44 62 29 3b 0a 20 20 73  annels(pDb);.  s
3370: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 62  qlite3_close(pDb
3380: 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  ->db);.  while( 
3390: 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20  pDb->pFunc ){.  
33a0: 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
33b0: 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20   = pDb->pFunc;. 
33c0: 20 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20     pDb->pFunc = 
33d0: 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20  pFunc->pNext;.  
33e0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
33f0: 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  nt(pFunc->pScrip
3400: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  t);.    Tcl_Free
3410: 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a  ((char*)pFunc);.
3420: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44 62    }.  while( pDb
3430: 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ->pCollate ){.  
3440: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
3450: 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70 43  ollate = pDb->pC
3460: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62 2d  ollate;.    pDb-
3470: 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c  >pCollate = pCol
3480: 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  late->pNext;.   
3490: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
34a0: 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a  )pCollate);.  }.
34b0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
34c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
34d0: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
34e0: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72  }.  if( pDb->zTr
34f0: 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ace ){.    Tcl_F
3500: 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
3510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3520: 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
3530: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3540: 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  Profile);.  }.  
3550: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
3560: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
3570: 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a  Db->zAuth);.  }.
3580: 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c    if( pDb->zNull
3590: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
35a0: 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20  (pDb->zNull);.  
35b0: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 55 70  }.  if( pDb->pUp
35c0: 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  dateHook ){.    
35d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
35e0: 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
35f0: 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  k);.  }.  if( pD
3600: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
3610: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
3620: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 52  RefCount(pDb->pR
3630: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20  ollbackHook);.  
3640: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f  }.  if( pDb->pCo
3650: 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
3660: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3670: 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
3680: 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d 0a 20 20  eNeeded);.  }.  
3690: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
36a0: 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pDb);.}../*.** T
36b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
36c0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64 61 74  alled when a dat
36d0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6c 6f  abase file is lo
36e0: 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79 69 6e  cked while tryin
36f0: 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74 65 20  g.** to execute 
3700: 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  SQL..*/.static i
3710: 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  nt DbBusyHandler
3720: 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74 20 6e  (void *cd, int n
3730: 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69 74 65  Tries){.  Sqlite
3740: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
3750: 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72  eDb*)cd;.  int r
3760: 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b 33  c;.  char zVal[3
3770: 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  0];..  sqlite3_s
3780: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
3790: 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22 25 64 22  Val), zVal, "%d"
37a0: 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72 63 20  , nTries);.  rc 
37b0: 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28 70 44  = Tcl_VarEval(pD
37c0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
37d0: 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c  zBusy, " ", zVal
37e0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 69  , (char*)0);.  i
37f0: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
3800: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
3810: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
3820: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
3830: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
3840: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
3850: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3860: 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65  s invoked as the
3870: 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62   'progress callb
3880: 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74  ack' for the dat
3890: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
38a0: 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48   int DbProgressH
38b0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
38c0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
38d0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
38e0: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
38f0: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72  assert( pDb->zPr
3900: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d  ogress );.  rc =
3910: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
3920: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
3930: 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63  gress);.  if( rc
3940: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
3950: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
3960: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
3970: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
3980: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
3990: 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
39a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
39b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
39c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
39d0: 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63   the SQLite trac
39e0: 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76  e handler whenev
39f0: 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63  er a new.** bloc
3a00: 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63  k of SQL is exec
3a10: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
3a20: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54  cript in pDb->zT
3a30: 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64  race is executed
3a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3a50: 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28   DbTraceHandler(
3a60: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
3a70: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53  char *zSql){.  S
3a80: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3a90: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
3aa0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
3ab0: 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ..  Tcl_DStringI
3ac0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
3ad0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
3ae0: 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  str, pDb->zTrace
3af0: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
3b00: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
3b10: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
3b20: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
3b30: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
3b40: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
3b50: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
3b60: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
3b70: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
3b80: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
3b90: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
3ba0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
3bb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3bc0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
3bd0: 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20   SQLite profile 
3be0: 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20  handler after a 
3bf0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c  statement.** SQL
3c00: 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20   has executed.  
3c10: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
3c20: 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  n pDb->zProfile 
3c30: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  is evaluated..*/
3c40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
3c50: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f  rofileHandler(vo
3c60: 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68  id *cd, const ch
3c70: 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65  ar *zSql, sqlite
3c80: 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53  _uint64 tm){.  S
3c90: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3ca0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
3cb0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
3cc0: 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d  .  char zTm[100]
3cd0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
3ce0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d  rintf(sizeof(zTm
3cf0: 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22  )-1, zTm, "%lld"
3d00: 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , tm);.  Tcl_DSt
3d10: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
3d20: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
3d30: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
3d40: 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  Profile, -1);.  
3d50: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
3d60: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
3d70: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Sql);.  Tcl_DStr
3d80: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
3d90: 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54  (&str, zTm);.  T
3da0: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
3db0: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
3dc0: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
3dd0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
3de0: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73  &str);.  Tcl_Res
3df0: 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  etResult(pDb->in
3e00: 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  terp);.}.#endif.
3e10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3e20: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3e30: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
3e40: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20   is committed.  
3e50: 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70  The.** TCL scrip
3e60: 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  t in pDb->zCommi
3e70: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
3e80: 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f  If it returns no
3e90: 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20  n-zero or.** if 
3ea0: 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  it throws an exc
3eb0: 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e  eption, the tran
3ec0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
3ed0: 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a  d back instead.*
3ee0: 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * of being commi
3ef0: 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tted..*/.static 
3f00: 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  int DbCommitHand
3f10: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
3f20: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
3f30: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
3f40: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
3f50: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
3f60: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
3f70: 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
3f80: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
3f90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
3fa0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
3fb0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3fc0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
3fd0: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
3fe0: 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  d DbRollbackHand
3ff0: 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74  ler(void *client
4000: 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44  Data){.  SqliteD
4010: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4020: 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  Db*)clientData;.
4030: 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52    assert(pDb->pR
4040: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20  ollbackHook);.  
4050: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
4060: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4070: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c  nterp, pDb->pRol
4080: 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b  lbackHook, 0) ){
4090: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
40a0: 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e  undError(pDb->in
40b0: 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  terp);.  }.}..st
40c0: 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64 61  atic void DbUpda
40d0: 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69  teHandler(.  voi
40e0: 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c  d *p, .  int op,
40f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4100: 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  Db, .  const cha
4110: 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69  r *zTbl, .  sqli
4120: 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a 29  te_int64 rowid.)
4130: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
4140: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
4150: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  p;.  Tcl_Obj *pC
4160: 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  md;..  assert( p
4170: 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20  Db->pUpdateHook 
4180: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  );.  assert( op=
4190: 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c  =SQLITE_INSERT |
41a0: 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44  | op==SQLITE_UPD
41b0: 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54  ATE || op==SQLIT
41c0: 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70  E_DELETE );..  p
41d0: 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Cmd = Tcl_Duplic
41e0: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64  ateObj(pDb->pUpd
41f0: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f  ateHook);.  Tcl_
4200: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
4210: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
4220: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
4230: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
4240: 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20  tringObj(.    ( 
4250: 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45  (op==SQLITE_INSE
4260: 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70  RT)?"INSERT":(op
4270: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 29  ==SQLITE_UPDATE)
4280: 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c 45 54  ?"UPDATE":"DELET
4290: 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  E"), -1));.  Tcl
42a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
42b0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
42c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
42d0: 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  zDb, -1));.  Tcl
42e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
42f0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
4300: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4310: 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zTbl, -1));.  Tc
4320: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4330: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4340: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
4350: 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c  j(rowid));.  Tcl
4360: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
4370: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
4380: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
4390: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  }..static void t
43a0: 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28  clCollateNeeded(
43b0: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
43c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
43d0: 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74  int enc,.  const
43e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
43f0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
4400: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43  = (SqliteDb *)pC
4410: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
4420: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70  Script = Tcl_Dup
4430: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
4440: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
4450: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
4460: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54  nt(pScript);.  T
4470: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4480: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69  Element(0, pScri
4490: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
44a0: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
44b0: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
44c0: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
44d0: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63  Script, 0);.  Tc
44e0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
44f0: 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Script);.}../*.*
4500: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4510: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
4520: 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c  uate an SQL coll
4530: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
4540: 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73  mplemented.** us
4550: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a  ing TCL script..
4560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
4570: 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76  lSqlCollate(.  v
4580: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
4590: 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nA,.  const voi
45a0: 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
45b0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
45c0: 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  B.){.  SqlCollat
45d0: 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  e *p = (SqlColla
45e0: 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  te *)pCtx;.  Tcl
45f0: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70  _Obj *pCmd;..  p
4600: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
4610: 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70  ingObj(p->zScrip
4620: 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  t, -1);.  Tcl_In
4630: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
4640: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
4650: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
4660: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
4670: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
4680: 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c  A, nA));.  Tcl_L
4690: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
46a0: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
46b0: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
46c0: 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a  ngObj(zB, nB));.
46d0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
46e0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
46f0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
4700: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
4710: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72  Count(pCmd);.  r
4720: 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f  eturn (atoi(Tcl_
4730: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
4740: 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a  p->interp)));.}.
4750: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4760: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
4770: 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c   evaluate an SQL
4780: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
4790: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54  ented.** using T
47a0: 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  CL script..*/.st
47b0: 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71 6c  atic void tclSql
47c0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
47d0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
47e0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
47f0: 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20  _value**argv){. 
4800: 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71   SqlFunc *p = sq
4810: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
4820: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f  context);.  Tcl_
4830: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74  Obj *pCmd;.  int
4840: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
4850: 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a   if( argc==0 ){.
4860: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
4870: 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  are no arguments
4880: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
4890: 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  , call Tcl_EvalO
48a0: 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20 20  bjEx on the.    
48b0: 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74  ** script object
48c0: 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
48d0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c 20   allows the TCL 
48e0: 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e 65  compiler to gene
48f0: 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  rate.    ** byte
4900: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  code for the com
4910: 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72 73  mand on the firs
4920: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
4930: 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a   thus make.    *
4940: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  * subsequent inv
4950: 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66 61  ocations much fa
4960: 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d  ster. */.    pCm
4970: 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a  d = p->pScript;.
4980: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
4990: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
49a0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
49b0: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
49c0: 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  md, 0);.    Tcl_
49d0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
49e0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
49f0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
4a00: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
4a10: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65  e function, make
4a20: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20   a shallow copy 
4a30: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63  of the.    ** sc
4a40: 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70  ript object, lap
4a50: 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e  pend the argumen
4a60: 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  ts, then evaluat
4a70: 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  e the copy..    
4a80: 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73 68  **.    ** By "sh
4a90: 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65 20  allow" copy, we 
4aa0: 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20  mean a only the 
4ab0: 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f  outer list Tcl_O
4ac0: 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65 64  bj is duplicated
4ad0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65 77  ..    ** The new
4ae0: 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e   Tcl_Obj contain
4af0: 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  s pointers to th
4b00: 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  e original list 
4b10: 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a  elements. .    *
4b20: 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e  * That way, when
4b30: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
4b40: 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d  is run and shimm
4b50: 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65 6c  ers the first el
4b60: 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20  ement.    ** of 
4b70: 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43  the list to tclC
4b80: 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74  mdNameType, that
4b90: 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65   alternate repre
4ba0: 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20  sentation will. 
4bb0: 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76     ** be preserv
4bc0: 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  ed and reused on
4bd0: 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61   the next invoca
4be0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
4bf0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b   Tcl_Obj **aArg;
4c00: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
4c10: 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f     if( Tcl_ListO
4c20: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d  bjGetElements(p-
4c30: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72  >interp, p->pScr
4c40: 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72  ipt, &nArg, &aAr
4c50: 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  g) ){.      sqli
4c60: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
4c70: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
4c80: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
4c90: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
4ca0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
4cb0: 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43 6d    }     .    pCm
4cc0: 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  d = Tcl_NewListO
4cd0: 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a  bj(nArg, aArg);.
4ce0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
4cf0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
4d00: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
4d10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
4d20: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20  ite3_value *pIn 
4d30: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20  = argv[i];.     
4d40: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
4d60: 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74     /* Set pVal t
4d70: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27  o contain the i'
4d80: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69  th column of thi
4d90: 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  s row. */.      
4da0: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
4db0: 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20  value_type(pIn) 
4dc0: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
4dd0: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
4de0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
4df0: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
4e00: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
4e10: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
4e20: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
4e30: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  Obj(sqlite3_valu
4e40: 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74  e_blob(pIn), byt
4e50: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
4e60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4e70: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4e80: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
4e90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
4ea0: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
4eb0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49  3_value_int64(pI
4ec0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n);.          if
4ed0: 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37  ( v>=-2147483647
4ee0: 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34   && v<=214748364
4ef0: 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  7 ){.           
4f00: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49   pVal = Tcl_NewI
4f10: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
4f20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f30: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
4f40: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
4f50: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  v);.          }.
4f60: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4f70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4f80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
4f90: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  LOAT: {.        
4fa0: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c    double r = sql
4fb0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
4fc0: 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  e(pIn);.        
4fd0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
4fe0: 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20  DoubleObj(r);.  
4ff0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5000: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5010: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
5020: 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  L: {.          p
5030: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
5040: 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a 20  ingObj("", 0);. 
5050: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5070: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5080: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
5090: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
50a0: 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20  _bytes(pIn);.   
50b0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
50c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
50d0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
50e0: 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c 20  alue_text(pIn), 
50f0: 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20  bytes);.        
5100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5110: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5120: 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62   rc = Tcl_ListOb
5130: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
5140: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5150: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
5160: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54   rc ){.        T
5170: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
5180: 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 73  pCmd);.        s
5190: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
51a0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c  ror(context, Tcl
51b0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
51c0: 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29  (p->interp), -1)
51d0: 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ; .        retur
51e0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
51f0: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73 65  .    if( !p->use
5200: 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20  EvalObjv ){.    
5210: 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a    /* Tcl_EvalObj
5220: 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61  Ex() will automa
5230: 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c  tically call Tcl
5240: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20 70  _EvalObjv() if p
5250: 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  Cmd.      ** is 
5260: 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20 61  a list without a
5270: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
5280: 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76  tation.  To prev
5290: 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  ent this from.  
52a0: 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67      ** happening
52b0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d 64  , make sure pCmd
52c0: 20 68 61 73 20 61 20 76 61 6c 69 64 20 73 74 72   has a valid str
52d0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
52e0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f  on */.      Tcl_
52f0: 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29 3b  GetString(pCmd);
5300: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
5310: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
5320: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
5330: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
5340: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
5350: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d  Count(pCmd);.  }
5360: 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63  ..  if( rc && rc
5370: 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a  !=TCL_RETURN ){.
5380: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5390: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
53a0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
53b0: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
53c0: 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b  , -1); .  }else{
53d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  .    Tcl_Obj *pV
53e0: 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  ar = Tcl_GetObjR
53f0: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
5400: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
5410: 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 63   u8 *data;.    c
5420: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61  har *zType = pVa
5430: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
5440: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
5450: 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20   : "";.    char 
5460: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
5470: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
5480: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
5490: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
54a0: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29  pVar->bytes==0 )
54b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  {.      /* Only 
54c0: 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79  return a BLOB ty
54d0: 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61  pe if the Tcl va
54e0: 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65  riable is a byte
54f0: 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20  array and.      
5500: 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  ** has no string
5510: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
5520: 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20 3d   */.      data =
5530: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
5540: 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  yFromObj(pVar, &
5550: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
5560: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
5570: 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20  ntext, data, n, 
5580: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5590: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
55a0: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
55b0: 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e  p(zType,"boolean
55c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
55d0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
55e0: 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  (0, pVar, &n);. 
55f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5600: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
5610: 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   n);.    }else i
5620: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
5630: 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c  cmp(zType,"doubl
5640: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
5650: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20  double r;.      
5660: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
5670: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72  mObj(0, pVar, &r
5680: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5690: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
56a0: 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20  ontext, r);.    
56b0: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77  }else if( (c=='w
56c0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
56d0: 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29  e,"wideInt")==0)
56e0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63   ||.          (c
56f0: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
5700: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
5710: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69   ){.      Tcl_Wi
5720: 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54  deInt v;.      T
5730: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
5740: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76  mObj(0, pVar, &v
5750: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5760: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
5770: 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d  ntext, v);.    }
5780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74 61  else{.      data
5790: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
57a0: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
57b0: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
57c0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
57d0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
57e0: 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 64  ntext, (char *)d
57f0: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54  ata, n, SQLITE_T
5800: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
5810: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
5820: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5830: 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  ORIZATION./*.** 
5840: 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68  This is the auth
5850: 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74  entication funct
5860: 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73  ion.  It appends
5870: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
5880: 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65  ion.** type code
5890: 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67   and the two arg
58a0: 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d  uments to zCmd[]
58b0: 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68   then invokes th
58c0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74  e result.** on t
58d0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  he interpreter. 
58e0: 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78   The reply is ex
58f0: 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d  amined to determ
5900: 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75  ine if the.** au
5910: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69  thentication fai
5920: 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a  ls or succeeds..
5930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
5940: 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  th_callback(.  v
5950: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
5960: 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63   code,.  const c
5970: 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f  har *zArg1,.  co
5980: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c  nst char *zArg2,
5990: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
59a0: 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg3,.  const ch
59b0: 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63  ar *zArg4.){.  c
59c0: 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63  har *zCode;.  Tc
59d0: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
59e0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
59f0: 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20   char *zReply;. 
5a00: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
5a10: 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67   (SqliteDb*)pArg
5a20: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64  ;..  switch( cod
5a30: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
5a40: 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20  LITE_COPY       
5a50: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
5a60: 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72  SQLITE_COPY"; br
5a70: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5a80: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
5a90: 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  X      : zCode="
5aa0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
5ab0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
5ac0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
5ad0: 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a  ATE_TABLE      :
5ae0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5af0: 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72  REATE_TABLE"; br
5b00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5b10: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
5b20: 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22  _INDEX : zCode="
5b30: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5b40: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
5b50: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5b60: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
5b70: 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  BLE : zCode="SQL
5b80: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5b90: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
5ba0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5bb0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
5bc0: 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  ER: zCode="SQLIT
5bd0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52  E_CREATE_TEMP_TR
5be0: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
5bf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5c00: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20  REATE_TEMP_VIEW 
5c10: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5c20: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5c30: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
5c40: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5c50: 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a  E_TRIGGER    : z
5c60: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
5c70: 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72  ATE_TRIGGER"; br
5c80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5c90: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
5ca0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
5cb0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
5cc0: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
5cd0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45  case SQLITE_DELE
5ce0: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
5cf0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45  zCode="SQLITE_DE
5d00: 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LETE"; break;.  
5d10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
5d20: 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20  OP_INDEX        
5d30: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5d40: 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  DROP_INDEX"; bre
5d50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5d60: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20  ITE_DROP_TABLE  
5d70: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5d80: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
5d90: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5da0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
5db0: 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43  EMP_INDEX   : zC
5dc0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
5dd0: 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72  _TEMP_INDEX"; br
5de0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5df0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
5e00: 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22  ABLE   : zCode="
5e10: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
5e20: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
5e30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5e40: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
5e50: 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  R : zCode="SQLIT
5e60: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
5e70: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
5e80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
5e90: 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a  P_TEMP_VIEW    :
5ea0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
5eb0: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ROP_TEMP_VIEW"; 
5ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5ed0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
5ee0: 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  GER      : zCode
5ef0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  ="SQLITE_DROP_TR
5f00: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
5f10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
5f20: 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20 20  ROP_VIEW        
5f30: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5f40: 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65  _DROP_VIEW"; bre
5f50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5f60: 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20  ITE_INSERT      
5f70: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5f80: 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62  QLITE_INSERT"; b
5f90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5fa0: 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20  QLITE_PRAGMA    
5fb0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
5fc0: 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b  "SQLITE_PRAGMA";
5fd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5fe0: 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20   SQLITE_READ    
5ff0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6000: 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b  e="SQLITE_READ";
6010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6020: 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20   SQLITE_SELECT  
6030: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6040: 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e="SQLITE_SELECT
6050: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6060: 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  se SQLITE_TRANSA
6070: 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43  CTION       : zC
6080: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e  ode="SQLITE_TRAN
6090: 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b  SACTION"; break;
60a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
60b0: 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 20 20  _UPDATE         
60c0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
60d0: 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61  TE_UPDATE"; brea
60e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
60f0: 54 45 5f 41 54 54 41 43 48 20 20 20 20 20 20 20  TE_ATTACH       
6100: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6110: 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72  LITE_ATTACH"; br
6120: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6130: 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20 20 20  LITE_DETACH     
6140: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6150: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20  SQLITE_DETACH"; 
6160: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6170: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
6180: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
6190: 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  ="SQLITE_ALTER_T
61a0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
61b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
61c0: 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
61d0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
61e0: 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  REINDEX"; break;
61f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6200: 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20  _ANALYZE        
6210: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6220: 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65  TE_ANALYZE"; bre
6230: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6240: 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c  ITE_CREATE_VTABL
6250: 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  E     : zCode="S
6260: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41  QLITE_CREATE_VTA
6270: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
6280: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
6290: 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20 20 3a  P_VTABLE       :
62a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
62b0: 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62 72 65  ROP_VTABLE"; bre
62c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
62d0: 49 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20  ITE_FUNCTION    
62e0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
62f0: 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b  QLITE_FUNCTION";
6300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
6310: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
6320: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6330: 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b  e="????"; break;
6340: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69  .  }.  Tcl_DStri
6350: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
6360: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
6370: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75  d(&str, pDb->zAu
6380: 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  th, -1);.  Tcl_D
6390: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
63a0: 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29  ent(&str, zCode)
63b0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
63c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
63d0: 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31  r, zArg1 ? zArg1
63e0: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
63f0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
6400: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f  nt(&str, zArg2 ?
6410: 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20   zArg2 : "");.  
6420: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
6430: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
6440: 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22  Arg3 ? zArg3 : "
6450: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
6460: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
6470: 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72  str, zArg4 ? zAr
6480: 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d  g4 : "");.  rc =
6490: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
64a0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
64b0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
64c0: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
64d0: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
64e0: 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65   zReply = Tcl_Ge
64f0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
6500: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  b->interp);.  if
6510: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
6520: 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20  "SQLITE_OK")==0 
6530: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
6540: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
6550: 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79  f( strcmp(zReply
6560: 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d  ,"SQLITE_DENY")=
6570: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
6580: 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65  QLITE_DENY;.  }e
6590: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
65a0: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47  Reply,"SQLITE_IG
65b0: 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20  NORE")==0 ){.   
65c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e   rc = SQLITE_IGN
65d0: 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ORE;.  }else{.  
65e0: 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a    rc = 999;.  }.
65f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
6600: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6610: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
6620: 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65  ON */../*.** zTe
6630: 78 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  xt is a pointer 
6640: 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
6650: 20 76 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f   via an sqlite3_
6660: 72 65 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a  result_text().**
6670: 20 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65   or similar inte
6680: 72 66 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74  rface. This rout
6690: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 54 63  ine returns a Tc
66a0: 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c  l string object,
66b0: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63   .** reference c
66c0: 6f 75 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63  ount set to 0, c
66d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
66e0: 78 74 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61  xt. If a transla
66f0: 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20  tion.** between 
6700: 69 73 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d  iso8859 and UTF-
6710: 38 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69  8 is required, i
6720: 74 20 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a  t is preformed..
6730: 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  */.static Tcl_Ob
6740: 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63  j *dbTextToObj(c
6750: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
6760: 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
6770: 61 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54  al;.#ifdef UTF_T
6780: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
6790: 44 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  D.  Tcl_DString 
67a0: 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72  dCol;.  Tcl_DStr
67b0: 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a  ingInit(&dCol);.
67c0: 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f    Tcl_ExternalTo
67d0: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c  UtfDString(NULL,
67e0: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f   zText, -1, &dCo
67f0: 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c  l);.  pVal = Tcl
6800: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
6810: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
6820: 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63  dCol), -1);.  Tc
6830: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
6840: 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56  Col);.#else.  pV
6850: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
6860: 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29  ngObj(zText, -1)
6870: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
6880: 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pVal;.}../*.**
6890: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
68a0: 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65  ads a line of te
68b0: 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c  xt from FILE in,
68c0: 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74   stores.** the t
68d0: 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ext in memory ob
68e0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
68f0: 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73  oc() and returns
6900: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6910: 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c   the text.  NULL
6920: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20   is returned at 
6930: 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20  end of file, or 
6940: 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66  if malloc().** f
6950: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails..**.** The 
6960: 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b  interface is lik
6970: 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74  e "readline" but
6980: 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   no command-line
6990: 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64   editing.** is d
69a0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65  one..**.** copie
69b0: 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66  d from shell.c f
69c0: 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f  rom '.import' co
69d0: 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20  mmand.*/.static 
69e0: 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c  char *local_getl
69f0: 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70  ine(char *zPromp
6a00: 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  t, FILE *in){.  
6a10: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69  char *zLine;.  i
6a20: 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  nt nLine;.  int 
6a30: 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20  n;.  int eol;.. 
6a40: 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20   nLine = 100;.  
6a50: 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  zLine = malloc( 
6a60: 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a  nLine );.  if( z
6a70: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
6a80: 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65   0;.  n = 0;.  e
6a90: 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ol = 0;.  while(
6aa0: 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28   !eol ){.    if(
6ab0: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
6ac0: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
6ad0: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
6ae0: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
6af0: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
6b00: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
6b10: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
6b20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
6b30: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
6b40: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
6b50: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
6b60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
6b70: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
6b80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6b90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
6ba0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
6bb0: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  eol = 1;.      b
6bc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6bd0: 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20  while( zLine[n] 
6be0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ n++; }.    if
6bf0: 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e  ( n>0 && zLine[n
6c00: 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  -1]=='\n' ){.   
6c10: 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c     n--;.      zL
6c20: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
6c30: 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d    eol = 1;.    }
6c40: 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72  .  }.  zLine = r
6c50: 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e  ealloc( zLine, n
6c60: 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  +1 );.  return z
6c70: 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Line;.}../*.** T
6c80: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
6c90: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
6ca0: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
6cb0: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
6cc0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
6cd0: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
6ce0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
6cf0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
6d00: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
6d10: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
6d20: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
6d30: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
6d40: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
6d50: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
6d60: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
6d70: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
6d80: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
6d90: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
6da0: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
6db0: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
6dc0: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
6dd0: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
6de0: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
6df0: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
6e00: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
6e10: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
6e20: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
6e30: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
6e40: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
6e50: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
6e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6e70: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
6e80: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
6e90: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
6ea0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
6eb0: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
6ec0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
6ed0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
6ee0: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
6ef0: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
6f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
6f10: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
6f20: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
6f30: 20 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 20       "busy",    
6f40: 20 20 20 20 20 20 20 20 20 20 22 63 61 63 68 65            "cache
6f50: 22 2c 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22  ",.    "changes"
6f60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6c  ,            "cl
6f70: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
6f80: 20 20 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20    "collate",.   
6f90: 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64   "collation_need
6fa0: 65 64 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68  ed",   "commit_h
6fb0: 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d  ook",       "com
6fc0: 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70  plete",.    "cop
6fd0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
6fe0: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
6ff0: 78 74 65 6e 73 69 6f 6e 22 2c 22 65 72 72 6f 72  xtension","error
7000: 63 6f 64 65 22 2c 0a 20 20 20 20 22 65 76 61 6c  code",.    "eval
7010: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7020: 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20 20   "exists",      
7030: 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22        "function"
7040: 2c 0a 20 20 20 20 22 69 6e 63 72 62 6c 6f 62 22  ,.    "incrblob"
7050: 2c 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 74  ,           "int
7060: 65 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20  errupt",        
7070: 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f   "last_insert_ro
7080: 77 69 64 22 2c 0a 20 20 20 20 22 6e 75 6c 6c 76  wid",.    "nullv
7090: 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20 20  alue",          
70a0: 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20 20 20 20  "onecolumn",    
70b0: 20 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 0a       "profile",.
70c0: 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c 20      "progress", 
70d0: 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65 79            "rekey
70e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
70f0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a  rollback_hook",.
7100: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20      "timeout",  
7110: 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c            "total
7120: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22  _changes",     "
7130: 74 72 61 63 65 22 2c 0a 20 20 20 20 22 74 72 61  trace",.    "tra
7140: 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  nsaction",      
7150: 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c    "update_hook",
7160: 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22         "version"
7170: 2c 0a 20 20 20 20 30 20 20 20 20 20 20 20 20 20  ,.    0         
7180: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b             .  };
7190: 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20  .  enum DB_enum 
71a0: 7b 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49  {.    DB_AUTHORI
71b0: 5a 45 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42  ZER,        DB_B
71c0: 55 53 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  USY,            
71d0: 20 44 42 5f 43 41 43 48 45 2c 0a 20 20 20 20 44   DB_CACHE,.    D
71e0: 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20  B_CHANGES,      
71f0: 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20       DB_CLOSE,  
7200: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c            DB_COL
7210: 4c 41 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c  LATE,.    DB_COL
7220: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20  LATION_NEEDED,  
7230: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20  DB_COMMIT_HOOK, 
7240: 20 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45       DB_COMPLETE
7250: 2c 0a 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20  ,.    DB_COPY,  
7260: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45              DB_E
7270: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
7280: 53 49 4f 4e 2c 44 42 5f 45 52 52 4f 52 43 4f 44  SION,DB_ERRORCOD
7290: 45 2c 0a 20 20 20 20 44 42 5f 45 56 41 4c 2c 20  E,.    DB_EVAL, 
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
72b0: 45 58 49 53 54 53 2c 20 20 20 20 20 20 20 20 20  EXISTS,         
72c0: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 0a 20    DB_FUNCTION,. 
72d0: 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20     DB_INCRBLOB, 
72e0: 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45           DB_INTE
72f0: 52 52 55 50 54 2c 20 20 20 20 20 20 20 20 44 42  RRUPT,        DB
7300: 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57  _LAST_INSERT_ROW
7310: 49 44 2c 0a 20 20 20 20 44 42 5f 4e 55 4c 4c 56  ID,.    DB_NULLV
7320: 41 4c 55 45 2c 20 20 20 20 20 20 20 20 20 44 42  ALUE,         DB
7330: 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20  _ONECOLUMN,     
7340: 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 0a 20     DB_PROFILE,. 
7350: 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20     DB_PROGRESS, 
7360: 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45           DB_REKE
7370: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42  Y,            DB
7380: 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a  _ROLLBACK_HOOK,.
7390: 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20      DB_TIMEOUT, 
73a0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54            DB_TOT
73b0: 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 44  AL_CHANGES,    D
73c0: 42 5f 54 52 41 43 45 2c 0a 20 20 20 20 44 42 5f  B_TRACE,.    DB_
73d0: 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20  TRANSACTION,    
73e0: 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f     DB_UPDATE_HOO
73f0: 4b 2c 20 20 20 20 20 20 44 42 5f 56 45 52 53 49  K,      DB_VERSI
7400: 4f 4e 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e  ON.  };.  /* don
7410: 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e  't leave trailin
7420: 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65  g commas on DB_e
7430: 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73  num, it confuses
7440: 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d   the AIX xlc com
7450: 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20  piler */..  if( 
7460: 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
7470: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7480: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7490: 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  "SUBCOMMAND ..."
74a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
74b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
74c0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
74d0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
74e0: 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c  bjv[1], DB_strs,
74f0: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63   "option", 0, &c
7500: 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65  hoice) ){.    re
7510: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7520: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28    }..  switch( (
7530: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f  enum DB_enum)cho
7540: 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20  ice ){..  /*    
7550: 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f  $db authorizer ?
7560: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
7570: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
7580: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f  iven callback to
7590: 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20   authorize each 
75a0: 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  SQL operation as
75b0: 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70   it is.  ** comp
75c0: 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e  iled.  5 argumen
75d0: 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20  ts are appended 
75e0: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
75f0: 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a  before it is.  *
7600: 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a  * invoked:.  **.
7610: 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61    **   (1) The a
7620: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
7630: 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52  e (ex: SQLITE_CR
7640: 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49  EATE_TABLE, SQLI
7650: 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a  TE_INSERT, ...).
7660: 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74    **   (2) First
7670: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
7680: 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75  e (depends on au
7690: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
76a0: 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63  ).  **   (3) Sec
76b0: 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20  ond descriptive 
76c0: 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20  name.  **   (4) 
76d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
76e0: 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  base (ex: "main"
76f0: 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20  , "temp").  **  
7700: 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69   (5) Name of tri
7710: 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69  gger that is doi
7720: 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20  ng the access.  
7730: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
7740: 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75  back should retu
7750: 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  rn on of the fol
7760: 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20  lowing strings: 
7770: 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20  SQLITE_OK,.  ** 
7780: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f  SQLITE_IGNORE, o
7790: 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20  r SQLITE_DENY.  
77a0: 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
77b0: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72   value is an err
77c0: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  or..  **.  ** If
77d0: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   this method is 
77e0: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20  invoked with no 
77f0: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63  arguments, the c
7800: 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61  urrent authoriza
7810: 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61  tion.  ** callba
7820: 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74  ck string is ret
7830: 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  urned..  */.  ca
7840: 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52  se DB_AUTHORIZER
7850: 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
7860: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
7870: 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70  TION.    Tcl_App
7880: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7890: 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  , "authorization
78a0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
78b0: 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
78c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
78d0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
78e0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
78f0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
7900: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
7910: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
7920: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
7930: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7940: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
7950: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
7960: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
7970: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
7980: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7990: 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29  , pDb->zAuth, 0)
79a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
79b0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
79c0: 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e  *zAuth;.      in
79d0: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
79e0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
79f0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
7a00: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20  pDb->zAuth);.   
7a10: 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68     }.      zAuth
7a20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7a30: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
7a40: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
7a50: 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30  ( zAuth && len>0
7a60: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
7a70: 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c  >zAuth = Tcl_All
7a80: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
7a90: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
7aa0: 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c  b->zAuth, zAuth,
7ab0: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
7ac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
7ad0: 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->zAuth = 0;.  
7ae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7af0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
7b00: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
7b10: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
7b20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
7b30: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
7b40: 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63  db, auth_callbac
7b50: 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  k, pDb);.      }
7b60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
7b70: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
7b80: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
7b90: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
7ba0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
7bb0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
7bc0: 20 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c    $db busy ?CALL
7bd0: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
7be0: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
7bf0: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20   callback if an 
7c00: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74  SQL statement at
7c10: 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20  tempts to open. 
7c20: 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74   ** a locked dat
7c30: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
7c40: 0a 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a  .  case DB_BUSY:
7c50: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
7c60: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
7c70: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
7c80: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41  rp, 2, objv, "CA
7c90: 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20  LLBACK");.      
7ca0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7cb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7cc0: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
7cd0: 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
7ce0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
7cf0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7d00: 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20  rp, pDb->zBusy, 
7d10: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
7d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
7d30: 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20  r *zBusy;.      
7d40: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
7d50: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
7d60: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
7d70: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
7d80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75       }.      zBu
7d90: 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  sy = Tcl_GetStri
7da0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
7db0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
7dc0: 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e  if( zBusy && len
7dd0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
7de0: 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41  b->zBusy = Tcl_A
7df0: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
7e00: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
7e10: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73  pDb->zBusy, zBus
7e20: 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  y, len+1);.     
7e30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7e40: 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a  pDb->zBusy = 0;.
7e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7e60: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
7e70: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
7e80: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
7e90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
7ea0: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
7eb0: 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65  db, DbBusyHandle
7ec0: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
7ed0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
7ee0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
7ef0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
7f00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7f10: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7f20: 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61  .  /*     $db ca
7f30: 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20  che flush.  **  
7f40: 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a     $db cache siz
7f50: 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c  e n.  **.  ** Fl
7f60: 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64  ush the prepared
7f70: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65   statement cache
7f80: 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78  , or set the max
7f90: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
7fa0: 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65   ** cached state
7fb0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  ments..  */.  ca
7fc0: 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20  se DB_CACHE: {. 
7fd0: 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b     char *subCmd;
7fe0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20  .    int n;..   
7ff0: 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a   if( objc<=2 ){.
8000: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
8010: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
8020: 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f  , objv, "cache o
8030: 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20  ption ?arg?");. 
8040: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8050: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8060: 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65   subCmd = Tcl_Ge
8070: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20  tStringFromObj( 
8080: 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20  objv[2], 0 );.  
8090: 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27    if( *subCmd=='
80a0: 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62  f' && strcmp(sub
80b0: 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20  Cmd,"flush")==0 
80c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
80d0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
80e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
80f0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
8100: 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20  , "flush");.    
8110: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8120: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
8130: 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  e{.        flush
8140: 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
8150: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8160: 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d  lse if( *subCmd=
8170: 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73  ='s' && strcmp(s
8180: 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30  ubCmd,"size")==0
8190: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
81a0: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  jc!=4 ){.       
81b0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
81c0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
81d0: 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20  v, "size n");.  
81e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
81f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
8200: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
8210: 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f   TCL_ERROR==Tcl_
8220: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
8230: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
8240: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
8250: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8260: 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  ( interp, "canno
8270: 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a  t convert \"", .
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
8290: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
82a0: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20  Obj(objv[3],0), 
82b0: 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c  "\" to integer",
82c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   0);.          r
82d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
82e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
82f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c            if( n<
8300: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8310: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
8320: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20   pDb );.        
8330: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
8340: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
8350: 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54  >MAX_PREPARED_ST
8360: 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MTS ){.         
8370: 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41     n = MAX_PREPA
8380: 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20  RED_STMTS;.     
8390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
83a0: 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20   pDb->maxStmt = 
83b0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
83c0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
83d0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
83e0: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
83f0: 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c  "bad option \"",
8400: 20 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f   .          Tcl_
8410: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8420: 28 6f 62 6a 76 5b 30 5d 2c 30 29 2c 20 22 5c 22  (objv[0],0), "\"
8430: 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20  : must be flush 
8440: 6f 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20  or size", 0);.  
8450: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8460: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8470: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
8480: 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73       $db changes
8490: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
84a0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
84b0: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
84c0: 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
84d0: 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79  d, or deleted by
84e0: 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72  .  ** the most r
84f0: 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50  ecent INSERT, UP
8500: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
8510: 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e  tatement, not in
8520: 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e  cluding .  ** an
8530: 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  y changes made b
8540: 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
8550: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ms..  */.  case 
8560: 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  DB_CHANGES: {.  
8570: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
8580: 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
8590: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
85a0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
85b0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
85c0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
85d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
85e0: 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
85f0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
8600: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
8610: 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
8620: 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ult, sqlite3_cha
8630: 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
8640: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
8650: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73    /*    $db clos
8660: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74  e.  **.  ** Shut
8670: 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73  down the databas
8680: 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  e.  */.  case DB
8690: 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63  _CLOSE: {.    Tc
86a0: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28  l_DeleteCommand(
86b0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
86c0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
86d0: 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62  v[0], 0));.    b
86e0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
86f0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
8700: 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54  late NAME SCRIPT
8710: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
8720: 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c  e a new SQL coll
8730: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63  ation function c
8740: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
8750: 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  never.  ** that 
8760: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
8770: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
8780: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
8790: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
87a0: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41  .  case DB_COLLA
87b0: 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c  TE: {.    SqlCol
87c0: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a  late *pCollate;.
87d0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
87e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69  .    char *zScri
87f0: 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72  pt;.    int nScr
8800: 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ipt;.    if( obj
8810: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
8820: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8830: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
8840: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
8850: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8860: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8870: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
8880: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
8890: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
88a0: 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65  zScript = Tcl_Ge
88b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
88c0: 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74  bjv[3], &nScript
88d0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20  );.    pCollate 
88e0: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54  = (SqlCollate*)T
88f0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
8900: 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53  (*pCollate) + nS
8910: 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20  cript + 1 );.   
8920: 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30   if( pCollate==0
8930: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
8940: 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ROR;.    pCollat
8950: 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  e->interp = inte
8960: 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  rp;.    pCollate
8970: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
8980: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f  Collate;.    pCo
8990: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d  llate->zScript =
89a0: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74   (char*)&pCollat
89b0: 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70  e[1];.    pDb->p
89c0: 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61  Collate = pColla
89d0: 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  te;.    memcpy(p
89e0: 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74  Collate->zScript
89f0: 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69  , zScript, nScri
8a00: 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73  pt+1);.    if( s
8a10: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
8a20: 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  llation(pDb->db,
8a30: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55   zName, SQLITE_U
8a40: 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43  TF8, .        pC
8a50: 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f  ollate, tclSqlCo
8a60: 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
8a70: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
8a80: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
8a90: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8aa0: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
8ab0: 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ILE);.      retu
8ac0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8ad0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8ae0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
8af0: 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f    $db collation_
8b00: 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20  needed SCRIPT.  
8b10: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
8b20: 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
8b30: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
8b40: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
8b50: 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
8b60: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
8b70: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
8b80: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
8b90: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
8ba0: 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  case DB_COLLATIO
8bb0: 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20  N_NEEDED: {.    
8bc0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
8bd0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
8be0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
8bf0: 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
8c00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8c10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8c20: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f      if( pDb->pCo
8c30: 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
8c40: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
8c50: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
8c60: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
8c70: 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  }.    pDb->pColl
8c80: 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f  ateNeeded = Tcl_
8c90: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
8ca0: 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49  v[2]);.    Tcl_I
8cb0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
8cc0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
8cd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
8ce0: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70  llation_needed(p
8cf0: 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c  Db->db, pDb, tcl
8d00: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
8d10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
8d20: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
8d30: 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
8d40: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
8d50: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
8d60: 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
8d70: 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
8d80: 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
8d90: 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
8da0: 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
8db0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
8dc0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
8dd0: 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
8de0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
8df0: 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
8e00: 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
8e10: 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
8e20: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
8e30: 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
8e40: 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
8e50: 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
8e60: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
8e70: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
8e80: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
8e90: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
8ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8eb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
8ec0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
8ed0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
8ee0: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
8ef0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8f00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
8f10: 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20  >zCommit, 0);.  
8f20: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
8f30: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
8f40: 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  mmit;.      int 
8f50: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
8f60: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
8f70: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
8f80: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
8f90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f       }.      zCo
8fa0: 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  mmit = Tcl_GetSt
8fb0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
8fc0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
8fd0: 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26    if( zCommit &&
8fe0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
8ff0: 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d    pDb->zCommit =
9000: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
9010: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
9020: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d  emcpy(pDb->zComm
9030: 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e  it, zCommit, len
9040: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
9050: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
9060: 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  Commit = 0;.    
9070: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
9080: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  b->zCommit ){.  
9090: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
90a0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
90b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
90c0: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
90d0: 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72   DbCommitHandler
90e0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
90f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
9100: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
9110: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
9120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
9140: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c   /*    $db compl
9150: 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a  ete SQL.  **.  *
9160: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
9170: 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65   SQL is a comple
9180: 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  te SQL statement
9190: 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
91a0: 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e  if.  ** addition
91b0: 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75  al lines of inpu
91c0: 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54  t are needed.  T
91d0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
91e0: 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74  o the.  ** built
91f0: 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65  -in "info comple
9200: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54  te" command of T
9210: 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  cl..  */.  case 
9220: 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23  DB_COMPLETE: {.#
9230: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9240: 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20  IT_COMPLETE.    
9250: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
9260: 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70  ;.    int isComp
9270: 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62  lete;.    if( ob
9280: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
9290: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
92a0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
92b0: 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72   "SQL");.      r
92c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
92d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d  .    }.    isCom
92e0: 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  plete = sqlite3_
92f0: 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65  complete( Tcl_Ge
9300: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9310: 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20  bjv[2], 0) );.  
9320: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
9330: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
9340: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
9350: 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73  tBooleanObj(pRes
9360: 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29  ult, isComplete)
9370: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  ;.#endif.    bre
9380: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
9390: 20 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69   $db copy confli
93a0: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62  ct-algorithm tab
93b0: 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50  le filename ?SEP
93c0: 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44  ARATOR? ?NULLIND
93d0: 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a  ICATOR?.  **.  *
93e0: 2a 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f  * Copy data into
93f0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65   table from file
9400: 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79  name, optionally
9410: 20 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52   using SEPARATOR
9420: 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20  .  ** as column 
9430: 73 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20  separators.  If 
9440: 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  a column contain
9450: 73 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c  s a null string,
9460: 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c   or the.  ** val
9470: 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41  ue of NULLINDICA
9480: 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69  TOR, a NULL is i
9490: 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68 65 20  nserted for the 
94a0: 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e  column..  ** con
94b0: 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
94c0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71  is one of the sq
94d0: 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c  lite conflict al
94e0: 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20  gorithms:.  **  
94f0: 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72    rollback, abor
9500: 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c  t, fail, ignore,
9510: 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e   replace.  ** On
9520: 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
9530: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
9540: 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20  ines processed, 
9550: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
9560: 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62  same.  ** as 'db
9570: 20 63 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f   changes' due to
9580: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
9590: 74 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20  thm selected..  
95a0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64  **.  ** This cod
95b0: 65 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61  e is basically a
95c0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
95d0: 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a  /enhancement of.
95e0: 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
95f0: 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72   shell.c ".impor
9600: 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a  t" command..  **
9610: 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  .  ** This comma
9620: 6e 64 20 75 73 61 67 65 20 69 73 20 65 71 75 69  nd usage is equi
9630: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71  valent to the sq
9640: 6c 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61  lite2.x COPY sta
9650: 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69  tement,.  ** whi
9660: 63 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20  ch imports file 
9670: 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c  data into a tabl
9680: 65 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74  e using the Post
9690: 67 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65  greSQL COPY file
96a0: 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20   format:.  **   
96b0: 24 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69  $db copy $confli
96c0: 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61  t_algo $table_na
96d0: 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20  me $filename \t 
96e0: 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  \\N.  */.  case 
96f0: 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63  DB_COPY: {.    c
9700: 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20  har *zTable;    
9710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9720: 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
9730: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  his table */.   
9740: 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20   char *zFile;   
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9760: 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68  The file from wh
9770: 69 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 64  ich to extract d
9780: 61 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ata */.    char 
9790: 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20  *zConflict;     
97a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
97b0: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
97c0: 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73   to use */.    s
97d0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
97e0: 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  mt;        /* A 
97f0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
9800: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9820: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
9830: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9850: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
9860: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
9870: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
9880: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9890: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
98a0: 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c   bytes in an SQL
98b0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69   string */.    i
98c0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
98d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
98e0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
98f0: 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20     int nSep;    
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9910: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9920: 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20  s in zSep[] */. 
9930: 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20     int nNull;   
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9950: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9960: 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a  s in zNull[] */.
9970: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20      char *zSql; 
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d  /* An SQL statem
99a0: 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ent */.    char 
99b0: 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  *zLine;         
99c0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
99d0: 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74  le line of input
99e0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a   from the file *
99f0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43  /.    char **azC
9a00: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
9a10: 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f    /* zLine[] bro
9a20: 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75  ken up into colu
9a30: 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  mns */.    char 
9a40: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
9a50: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
9a60: 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20   commit changes 
9a70: 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b  */.    FILE *in;
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
9aa0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  file */.    int 
9ab0: 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20  lineno = 0;     
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
9ad0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  number of input 
9ae0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
9af0: 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20   zLineNum[80];  
9b00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
9b10: 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66  number print buf
9b20: 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  fer */.    Tcl_O
9b30: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20  bj *pResult;    
9b40: 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70         /* interp
9b50: 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20   result */..    
9b60: 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20  char *zSep;.    
9b70: 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20  char *zNull;.   
9b80: 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f   if( objc<5 || o
9b90: 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54  bjc>7 ){.      T
9ba0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9bb0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
9bc0: 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46   .         "CONF
9bd0: 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54  LICT-ALGORITHM T
9be0: 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53  ABLE FILENAME ?S
9bf0: 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49  EPARATOR? ?NULLI
9c00: 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20  NDICATOR?");.   
9c10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9c20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
9c30: 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20  f( objc>=6 ){.  
9c40: 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47      zSep = Tcl_G
9c50: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9c60: 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20  objv[5], 0);.   
9c70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
9c80: 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d  ep = "\t";.    }
9c90: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37  .    if( objc>=7
9ca0: 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20   ){.      zNull 
9cb0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
9cc0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20  romObj(objv[6], 
9cd0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
9ce0: 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b       zNull = "";
9cf0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66  .    }.    zConf
9d00: 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  lict = Tcl_GetSt
9d10: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
9d20: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61  [2], 0);.    zTa
9d30: 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ble = Tcl_GetStr
9d40: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
9d50: 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c  3], 0);.    zFil
9d60: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
9d70: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d  gFromObj(objv[4]
9d80: 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
9d90: 20 73 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20   strlen(zSep);. 
9da0: 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65     nNull = strle
9db0: 6e 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66  n(zNull);.    if
9dc0: 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20  ( nSep==0 ){.   
9dd0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9de0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
9df0: 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61  r: non-null sepa
9e00: 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66  rator required f
9e10: 6f 72 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20  or copy",0);.   
9e20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9e30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
9e40: 66 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  f(sqlite3StrICmp
9e50: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c  (zConflict, "rol
9e60: 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a  lback") != 0 &&.
9e70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
9e80: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
9e90: 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20   "abort"   ) != 
9ea0: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
9eb0: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
9ec0: 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20  lict, "fail"    
9ed0: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
9ee0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
9ef0: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f  zConflict, "igno
9f00: 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20  re"  ) != 0 &&. 
9f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
9f20: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
9f30: 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30  "replace" ) != 0
9f40: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
9f50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9f60: 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c  rp, "Error: \"",
9f70: 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20   zConflict, .   
9f80: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
9f90: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
9fa0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
9fb0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
9fc0: 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
9fd0: 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
9fe0: 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a  r replace", 0);.
9ff0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
a000: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
a010: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
a020: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
a030: 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
a040: 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
a050: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
a060: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a070: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
a080: 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  : no such table:
a090: 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a   ", zTable, 0);.
a0a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
a0b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
a0c0: 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e    nByte = strlen
a0d0: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
a0e0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
a0f0: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
a100: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
a110: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a120: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
a130: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
a140: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a150: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
a160: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
a170: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
a180: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
a190: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
a1a0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
a1b0: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
a1c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
a1d0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
a1e0: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
a1f0: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
a200: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a210: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
a220: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
a230: 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
a240: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
a250: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
a260: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a270: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
a280: 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b  t malloc()", 0);
a290: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
a2a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
a2b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
a2c0: 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53  ntf(nByte+50, zS
a2d0: 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25  ql, "INSERT OR %
a2e0: 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55  q INTO '%q' VALU
a2f0: 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20  ES(?",.         
a300: 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c  zConflict, zTabl
a310: 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
a320: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  en(zSql);.    fo
a330: 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
a340: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
a350: 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
a360: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
a370: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
a380: 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
a390: 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
a3a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
a3b0: 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
a3c0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
a3d0: 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  t, 0);.    free(
a3e0: 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
a3f0: 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
a400: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a410: 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
a420: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
a430: 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
a440: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
a450: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
a460: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a470: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20  R;.    }.    in 
a480: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
a490: 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
a4a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
a4b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a4c0: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
a4d0: 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
a4e0: 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  ", zFile, NULL);
a4f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
a500: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
a510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
a520: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
a530: 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63    azCol = malloc
a540: 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30  ( sizeof(azCol[0
a550: 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20  ])*(nCol+1) );. 
a560: 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
a570: 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  ) {.      Tcl_Ap
a580: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a590: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74  p, "Error: can't
a5a0: 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a   malloc()", 0);.
a5b0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
a5c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a5d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a5e0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
a5f0: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
a600: 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
a610: 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d  );.    zCommit =
a620: 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77   "COMMIT";.    w
a630: 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c  hile( (zLine = l
a640: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20  ocal_getline(0, 
a650: 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  in))!=0 ){.     
a660: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
a670: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e  i = 0;.      lin
a680: 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43  eno++;.      azC
a690: 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20  ol[0] = zLine;. 
a6a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d       for(i=0, z=
a6b0: 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  zLine; *z; z++){
a6c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d  .        if( *z=
a6d0: 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e  =zSep[0] && strn
a6e0: 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65  cmp(z, zSep, nSe
a6f0: 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)==0 ){.       
a700: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
a710: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
a720: 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29      if( i<nCol )
a730: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
a740: 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70  Col[i] = &z[nSep
a750: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ];.            z
a760: 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20   += nSep-1;.    
a770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a780: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
a790: 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b  if( i+1!=nCol ){
a7a0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
a7b0: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Err;.        int
a7c0: 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 28 7a   nErr = strlen(z
a7d0: 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20  File) + 200;.   
a7e0: 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c       zErr = mall
a7f0: 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20  oc(nErr);.      
a800: 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
a810: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a820: 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a  snprintf(nErr, z
a830: 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Err,.           
a840: 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e    "Error: %s lin
a850: 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
a860: 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
a870: 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c  a but found %d",
a880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  .             zF
a890: 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f  ile, lineno, nCo
a8a0: 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
a8b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a8c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
a8d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
a8e0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
a8f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43      }.        zC
a900: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
a910: 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
a920: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
a930: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
a940: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a950: 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c  /* check for nul
a960: 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62  l data, if so, b
a970: 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20  ind as null */. 
a980: 20 20 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c         if ((nNul
a990: 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a  l>0 && strcmp(az
a9a0: 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d  Col[i], zNull)==
a9b0: 30 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43  0) || strlen(azC
a9c0: 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20  ol[i])==0) {.   
a9d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
a9e0: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
a9f0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  i+1);.        }e
aa00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
aa10: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
aa20: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43  (pStmt, i+1, azC
aa30: 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  ol[i], -1, SQLIT
aa40: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
aa50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
aa60: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
aa70: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63  pStmt);.      rc
aa80: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
aa90: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66  (pStmt);.      f
aaa0: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
aab0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
aac0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
aad0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
aae0: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22  interp,"Error: "
aaf0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
ab00: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
ab10: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
ab20: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
ab30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ab40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
ab50: 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66  ee(azCol);.    f
ab60: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73  close(in);.    s
ab70: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
ab80: 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69  pStmt);.    (voi
ab90: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
aba0: 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c  Db->db, zCommit,
abb0: 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20   0, 0, 0);..    
abc0: 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d  if( zCommit[0] =
abd0: 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f  = 'C' ){.      /
abe0: 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72  * success, set r
abf0: 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20  esult as number 
ac00: 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
ac10: 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ed */.      pRes
ac20: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
ac30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
ac40: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74        Tcl_SetInt
ac50: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e  Obj(pResult, lin
ac60: 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eno);.      rc =
ac70: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
ac80: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69  se{.      /* fai
ac90: 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e  lure, append lin
aca0: 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64  eno where failed
acb0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
acc0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
acd0: 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69  f(zLineNum), zLi
ace0: 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e  neNum,"%d",linen
acf0: 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  o);.      Tcl_Ap
ad00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ad10: 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c  p,", failed whil
ad20: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e  e processing lin
ad30: 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29  e: ",zLineNum,0)
ad40: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
ad50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
ad60: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
ad70: 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
ad80: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
ad90: 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a  sion BOOLEAN.  *
ada0: 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20  *.  ** Turn the 
adb0: 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e  extension loadin
adc0: 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20  g feature on or 
add0: 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20  off.  It if off 
ade0: 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e  by.  ** default.
adf0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
ae00: 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
ae10: 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66  NSION: {.#ifndef
ae20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
ae30: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
ae40: 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69  int onoff;.    i
ae50: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
ae60: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ae70: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
ae80: 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29  objv, "BOOLEAN")
ae90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
aea0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
aeb0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
aec0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
aed0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
aee0: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20  onoff) ){.      
aef0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
af00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
af10: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
af20: 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64  extension(pDb->d
af30: 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62  b, onoff);.    b
af40: 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20  reak;.#else.    
af50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
af60: 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73  (interp, "extens
af70: 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74  ion loading is t
af80: 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d  urned off at com
af90: 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20  pile-time",.    
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
afc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69  TCL_ERROR;.#endi
afd0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  f.  }..  /*.  **
afe0: 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64      $db errorcod
aff0: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  e.  **.  ** Retu
b000: 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65  rn the numeric e
b010: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77  rror code that w
b020: 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  as returned by t
b030: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20  he most recent. 
b040: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
b050: 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f  te3_exec()..  */
b060: 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52  .  case DB_ERROR
b070: 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  CODE: {.    Tcl_
b080: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b090: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b0a0: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  bj(sqlite3_errco
b0b0: 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  de(pDb->db)));. 
b0c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
b0d0: 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24   .  /*.  **    $
b0e0: 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72  db eval $sql ?ar
b0f0: 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65  ray? ?{  ...code
b100: 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24  ... }?.  **    $
b110: 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71  db onecolumn $sq
b120: 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  l.  **.  ** The 
b130: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
b140: 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74   $sql is evaluat
b150: 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f  ed.  For each ro
b160: 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  w, the values ar
b170: 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e  e.  ** placed in
b180: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
b190: 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72   array named "ar
b1a0: 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65  ray" and ...code
b1b0: 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e  ... is executed.
b1c0: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
b1d0: 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20   and "code" are 
b1e0: 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f  omitted, then no
b1f0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65   callback is eve
b200: 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a  ry invoked..  **
b210: 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61   If "array" is a
b220: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
b230: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20  then the values 
b240: 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61  are placed in va
b250: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61  riables.  ** tha
b260: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
b270: 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c  name as the fiel
b280: 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ds extracted by 
b290: 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  the query..  **.
b2a0: 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75    ** The onecolu
b2b0: 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65  mn method is the
b2c0: 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a   equivalent of:.
b2d0: 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20    **     lindex 
b2e0: 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20  [$db eval $sql] 
b2f0: 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  0.  */.  case DB
b300: 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61  _ONECOLUMN:.  ca
b310: 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20 63 61  se DB_EVAL:.  ca
b320: 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20 7b 0a  se DB_EXISTS: {.
b330: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
b340: 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65  zSql;      /* Ne
b350: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
b360: 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20   to execute */. 
b370: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
b380: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57 68 61  Left;     /* Wha
b390: 74 20 69 73 20 6c 65 66 74 20 61 66 74 65 72 20  t is left after 
b3a0: 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20 7a 53  first stmt in zS
b3b0: 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ql */.    sqlite
b3c0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
b3d0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c   /* Compiled SQL
b3e0: 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20   statment */.   
b3f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
b400: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
b410: 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20 77 68  of array into wh
b420: 69 63 68 20 72 65 73 75 6c 74 73 20 61 72 65 20  ich results are 
b430: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54  written */.    T
b440: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
b450: 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20        /* Script 
b460: 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20  to run for each 
b470: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
b480: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61    Tcl_Obj **apPa
b490: 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 61  rm;      /* Para
b4a0: 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65 65 64  meters that need
b4b0: 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   a Tcl_DecrRefCo
b4c0: 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  unt() */.    int
b4d0: 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20   nParm;         
b4e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b4f0: 20 65 6e 74 72 69 65 73 20 75 73 65 64 20 69 6e   entries used in
b500: 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20   apParm[] */.   
b510: 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b   Tcl_Obj *aParm[
b520: 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74 69  10];    /* Stati
b530: 63 20 73 70 61 63 65 20 66 6f 72 20 61 70 50 61  c space for apPa
b540: 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d  rm[] in the comm
b550: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 54  on case */.    T
b560: 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20  cl_Obj *pRet;   
b570: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
b580: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f  o be returned */
b590: 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64  .    SqlPrepared
b5a0: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20  Stmt *pPreStmt; 
b5b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
b5c0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
b5d0: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ent */.    int r
b5e0: 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63 68 6f  c2;..    if( cho
b5f0: 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29 7b 0a  ice==DB_EVAL ){.
b600: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33        if( objc<3
b610: 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20   || objc>5 ){.  
b620: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
b630: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
b640: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52  , objv, "SQL ?AR
b650: 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50  RAY-NAME? ?SCRIP
b660: 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  T?");.        re
b670: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
b690: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
b6a0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
b6b0: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
b6c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b6d0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
b6e0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
b6f0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
b700: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22  , 2, objv, "SQL"
b710: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
b720: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b730: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
b740: 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53  hoice==DB_EXISTS
b750: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74   ){.        pRet
b760: 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61   = Tcl_NewBoolea
b770: 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20 20 20  nObj(0);.       
b780: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
b790: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d  t(pRet);.      }
b7a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 52  else{.        pR
b7b0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
b7c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
b7d0: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70  jc==3 ){.      p
b7e0: 41 72 72 61 79 20 3d 20 70 53 63 72 69 70 74 20  Array = pScript 
b7f0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
b800: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
b810: 20 20 20 20 70 41 72 72 61 79 20 3d 20 30 3b 0a      pArray = 0;.
b820: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
b830: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c  objv[3];.    }el
b840: 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79  se{.      pArray
b850: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
b860: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53 74 72    if( Tcl_GetStr
b870: 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d 3d 3d  ing(pArray)[0]==
b880: 30 20 29 20 70 41 72 72 61 79 20 3d 20 30 3b 0a  0 ) pArray = 0;.
b890: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
b8a0: 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a  objv[4];.    }..
b8b0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
b8c0: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ount(objv[2]);. 
b8d0: 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65     zSql = Tcl_Ge
b8e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
b8f0: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
b900: 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f  while( rc==TCL_O
b910: 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a  K && zSql[0] ){.
b920: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b950: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
b960: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
b970: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b980: 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72  f bind parameter
b990: 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74 20 2a  s in the pStmt *
b9a0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  /.      int nCol
b9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b9c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b9d0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
b9e0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
b9f0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
ba00: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 2f 2a  olName = 0;   /*
ba10: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
ba20: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20   names */.      
ba30: 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  int len;        
ba40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
ba50: 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66 20 7a  ring length of z
ba60: 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20  Sql */.  .      
ba70: 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
ba80: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
ba90: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
baa0: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 6e  been compiled an
bab0: 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68  d.      ** which
bac0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 65 78   matches the nex
bad0: 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20 53 51  t sequence of SQ
bae0: 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  L..      */.    
baf0: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
bb00: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44     pPreStmt = pD
bb10: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20  b->stmtList;.   
bb20: 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28     len = strlen(
bb30: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  zSql);.      if(
bb40: 20 70 50 72 65 53 74 6d 74 20 26 26 20 73 71 6c   pPreStmt && sql
bb50: 69 74 65 33 5f 65 78 70 69 72 65 64 28 70 50 72  ite3_expired(pPr
bb60: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 20 29 7b  eStmt->pStmt) ){
bb70: 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74  .        flushSt
bb80: 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20  mtCache(pDb);.  
bb90: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d        pPreStmt =
bba0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
bbb0: 20 20 66 6f 72 28 3b 20 70 50 72 65 53 74 6d 74    for(; pPreStmt
bbc0: 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65 53  ; pPreStmt=pPreS
bbd0: 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  tmt->pNext){.   
bbe0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72       int n = pPr
bbf0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20  eStmt->nSql;.   
bc00: 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 20       if( len>=n 
bc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
bc20: 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d  memcmp(pPreStmt-
bc30: 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d  >zSql, zSql, n)=
bc40: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  =0.            &
bc50: 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c  & (zSql[n]==0 ||
bc60: 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29   zSql[n-1]==';')
bc70: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
bc80: 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50        pStmt = pP
bc90: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20  reStmt->pStmt;. 
bca0: 20 20 20 20 20 20 20 20 20 7a 4c 65 66 74 20 3d           zLeft =
bcb0: 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d   &zSql[pPreStmt-
bcc0: 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 20  >nSql];..       
bcd0: 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72 65     /* When a pre
bce0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
bcf0: 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b  is found, unlink
bd00: 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20 20   it from the.   
bd10: 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20         ** cache 
bd20: 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c  list.  It will l
bd30: 61 74 65 72 20 62 65 20 61 64 64 65 64 20 62 61  ater be added ba
bd40: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
bd50: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
bd60: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
bd70: 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  st in order to i
bd80: 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70  mplement LRU rep
bd90: 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  lacement..      
bda0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
bdb0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70   if( pPreStmt->p
bdc0: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
bdd0: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50      pPreStmt->pP
bde0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72  rev->pNext = pPr
bdf0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
be00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
be10: 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e             pDb->
be20: 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53  stmtList = pPreS
be30: 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  tmt->pNext;.    
be40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
be50: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e    if( pPreStmt->
be60: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
be70: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
be80: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50  Next->pPrev = pP
be90: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20  reStmt->pPrev;. 
bea0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d              pDb-
bec0: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
bed0: 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Stmt->pPrev;.   
bee0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bef0: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b     pDb->nStmt--;
bf00: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
bf10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bf20: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
bf30: 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73  If no prepared s
bf40: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75  tatement was fou
bf50: 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20 74 68 65  nd.  Compile the
bf60: 20 53 51 4c 20 74 65 78 74 0a 20 20 20 20 20 20   SQL text.      
bf70: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  */.      if( pSt
bf80: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt==0 ){.       
bf90: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
bfa0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
bfb0: 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  pDb->db, zSql, -
bfc0: 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66  1, &pStmt, &zLef
bfd0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
bfe0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
bff0: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
c000: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  oObj(sqlite3_err
c010: 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  msg(pDb->db)));.
c020: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
c030: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
c040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c050: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
c060: 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   pStmt==0 ){.   
c070: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
c080: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
c090: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29  rcode(pDb->db) )
c0a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
c0b0: 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20   A compile-time 
c0c0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61  error in the sta
c0d0: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20  tement.         
c0e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
c0f0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
c100: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
c110: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  tToObj(sqlite3_e
c120: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29  rrmsg(pDb->db)))
c130: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
c140: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
c150: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c160: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
c170: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
c180: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   The statement w
c190: 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e  as a no-op.  Con
c1a0: 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78  tinue to the nex
c1b0: 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
c1c0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
c1d0: 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20  e SQL string..  
c1e0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
c1f0: 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20           zSql = 
c200: 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  zLeft;.         
c210: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
c220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c230: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
c240: 74 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  t( pPreStmt==0 )
c250: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c260: 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20   /* Bind values 
c270: 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  to parameters th
c280: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24 20  at begin with $ 
c290: 6f 72 20 3a 0a 20 20 20 20 20 20 2a 2f 20 20 0a  or :.      */  .
c2a0: 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c        nVar = sql
c2b0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
c2c0: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
c2d0: 3b 0a 20 20 20 20 20 20 6e 50 61 72 6d 20 3d 20  ;.      nParm = 
c2e0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 56 61  0;.      if( nVa
c2f0: 72 3e 73 69 7a 65 6f 66 28 61 50 61 72 6d 29 2f  r>sizeof(aParm)/
c300: 73 69 7a 65 6f 66 28 61 50 61 72 6d 5b 30 5d 29  sizeof(aParm[0])
c310: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61   ){.        apPa
c320: 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29  rm = (Tcl_Obj**)
c330: 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a 73  Tcl_Alloc(nVar*s
c340: 69 7a 65 6f 66 28 61 70 50 61 72 6d 5b 30 5d 29  izeof(apParm[0])
c350: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
c360: 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d          apParm =
c370: 20 61 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   aParm;.      }.
c380: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
c390: 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <=nVar; i++){.  
c3a0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
c3b0: 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65 33   *zVar = sqlite3
c3c0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
c3d0: 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  name(pStmt, i);.
c3e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 56 61 72          if( zVar
c3f0: 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d  !=0 && (zVar[0]=
c400: 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d  ='$' || zVar[0]=
c410: 3d 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d  =':' || zVar[0]=
c420: 3d 27 40 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='@') ){.       
c430: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72     Tcl_Obj *pVar
c440: 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78   = Tcl_GetVar2Ex
c450: 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31  (interp, &zVar[1
c460: 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], 0, 0);.      
c470: 20 20 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a      if( pVar ){.
c480: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
c490: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  n;.            u
c4a0: 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20  8 *data;.       
c4b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65       char *zType
c4c0: 20 3d 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   = pVar->typePtr
c4d0: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
c4e0: 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20  ->name : "";.   
c4f0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20           char c 
c500: 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20  = zType[0];.    
c510: 20 20 20 20 20 20 20 20 69 66 28 20 7a 56 61 72          if( zVar
c520: 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a 20 20 20 20  [0]=='@' ||.    
c530: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
c540: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
c550: 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d  pe,"bytearray")=
c560: 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65  =0 && pVar->byte
c570: 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  s==0) ){.       
c580: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61         /* Load a
c590: 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68   BLOB type if th
c5a0: 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69  e Tcl variable i
c5b0: 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e  s a bytearray an
c5c0: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
c5d0: 2a 2a 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72  ** it has no str
c5e0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
c5f0: 6f 6e 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20  on or the host. 
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
c610: 70 61 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 62  parameter name b
c620: 65 67 69 6e 73 20 77 69 74 68 20 22 40 22 2e 20  egins with "@". 
c630: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
c640: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
c650: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
c660: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
c670: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c680: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
c690: 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51  , i, data, n, SQ
c6a0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
c6c0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
c6d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
c6e0: 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b    apParm[nParm++
c6f0: 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20  ] = pVar;.      
c700: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c710: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
c720: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
c730: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
c740: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74        Tcl_GetInt
c750: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
c760: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
c770: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c780: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
c790: 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   i, n);.        
c7a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
c7b0: 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='d' && strcmp(z
c7c0: 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Type,"double")==
c7d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
c7e0: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
c7f0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
c800: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
c810: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 72  interp, pVar, &r
c820: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
c830: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
c840: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20 72  uble(pStmt, i, r
c850: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
c860: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27  else if( (c=='w'
c870: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
c880: 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20  ,"wideInt")==0) 
c890: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
c8a0: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
c8b0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
c8c0: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
c8d0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64           Tcl_Wid
c8e0: 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20  eInt v;.        
c8f0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64        Tcl_GetWid
c900: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
c910: 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20  rp, pVar, &v);. 
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
c930: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
c940: 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20  pStmt, i, v);.  
c950: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
c960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
c970: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
c980: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
c990: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72  ringFromObj(pVar
c9a0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
c9b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
c9c0: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c  d_text(pStmt, i,
c9d0: 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e   (char *)data, n
c9e0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
c9f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ca00: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
ca10: 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20  (pVar);.        
ca20: 20 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61        apParm[nPa
ca30: 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20  rm++] = pVar;.  
ca40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ca50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ca60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ca70: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d  _bind_null( pStm
ca80: 74 2c 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20  t, i );.        
ca90: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
caa0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
cab0: 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e  Compute column n
cac0: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43  ames */.      nC
cad0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
cae0: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
caf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72  ;.      if( pScr
cb00: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ipt ){.        a
cb10: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f  pColName = (Tcl_
cb20: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
cb30: 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a   sizeof(Tcl_Obj*
cb40: 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  )*nCol );.      
cb50: 20 20 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d    if( apColName=
cb60: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
cb70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
cb80: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cb90: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
cba0: 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  ] = dbTextToObj(
cbb0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
cbc0: 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
cbd0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
cbe0: 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e  rRefCount(apColN
cbf0: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ame[i]);.       
cc00: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
cc10: 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20    /* If results 
cc20: 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  are being stored
cc30: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72   in an array var
cc40: 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61  iable, then crea
cc50: 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
cc60: 61 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66  array(*) entry f
cc70: 6f 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20  or that array.  
cc80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
cc90: 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20   pArray ){.     
cca0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c     Tcl_Obj *pCol
ccb0: 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  List = Tcl_NewOb
ccc0: 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  j();.        Tcl
ccd0: 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63  _Obj *pStar = Tc
cce0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
ccf0: 2a 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  *", -1);.       
cd00: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
cd10: 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20  t(pColList);.   
cd20: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cd30: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
cd40: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
cd50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
cd60: 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c  nterp, pColList,
cd70: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a   apColName[i]);.
cd80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cd90: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
cda0: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
cdb0: 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74   pStar, pColList
cdc0: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  ,0);.        Tcl
cdd0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
cde0: 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  olList);.       
cdf0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
ce00: 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20  t(pStar);.      
ce10: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63  }..      /* Exec
ce20: 75 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20  ute the SQL.    
ce30: 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
ce40: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20  ( rc==TCL_OK && 
ce50: 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f  pStmt && SQLITE_
ce60: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
ce70: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
ce80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ce90: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cea0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
ceb0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20  al;.          . 
cec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
ced0: 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pVal to contain 
cee0: 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20  the i'th column 
cef0: 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a  of this row. */.
cf00: 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
cf10: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
cf20: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20  _type(pStmt, i) 
cf30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
cf40: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
cf50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
cf60: 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c   int bytes = sql
cf70: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
cf80: 73 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  s(pStmt, i);.   
cf90: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
cfa0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
cfb0: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ayObj(sqlite3_co
cfc0: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
cfd0: 20 69 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20   i), bytes);.   
cfe0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
cff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
d000: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
d010: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
d020: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
d030: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20   sqlite_int64 v 
d040: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
d050: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29  _int64(pStmt, i)
d060: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d070: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
d080: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
d090: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
d0a0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
d0b0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a  l_NewIntObj(v);.
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
d0d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
d0e0: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
d0f0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
d100: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d110: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
d120: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
d130: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
d140: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
d150: 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  AT: {.          
d160: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
d170: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
d180: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  uble(pStmt, i);.
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
d1a0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
d1b0: 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20  leObj(r);.      
d1c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d1d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d1e0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
d1f0: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
d200: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
d210: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44  = dbTextToObj(pD
d220: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
d230: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
d240: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d250: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
d260: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t: {.           
d270: 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74     pVal = dbText
d280: 54 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71  ToObj((char *)sq
d290: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
d2a0: 74 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20  t(pStmt, i));.  
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
d2c0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
d2d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
d2e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
d2f0: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
d300: 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d       if( pArray=
d310: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
d320: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
d330: 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c  r2(interp, apCol
d340: 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c  Name[i], 0, pVal
d350: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
d360: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d370: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
d380: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41  tVar2(interp, pA
d390: 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  rray, apColName[
d3a0: 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20  i], pVal, 0);.  
d3b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d3c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d3d0: 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f  choice==DB_ONECO
d3e0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
d3f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74      assert( pRet
d400: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
d410: 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29     if( pRet==0 )
d420: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d430: 70 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20  pRet = pVal;.   
d440: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
d450: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
d460: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
d470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
d480: 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20  = TCL_BREAK;.   
d490: 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f           i = nCo
d4a0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  l;.          }el
d4b0: 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44  se if( choice==D
d4c0: 42 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20  B_EXISTS ){.    
d4d0: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
d4e0: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74              pRet
d500: 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61   = Tcl_NewBoolea
d510: 6e 4f 62 6a 28 31 29 3b 0a 20 20 20 20 20 20 20  nObj(1);.       
d520: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
d530: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
d540: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
d550: 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20  L_BREAK;.       
d560: 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20       i = nCol;. 
d570: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
d580: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
d590: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
d5a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
d5b0: 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, pVal);.      
d5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d5d0: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
d5e0: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
d5f0: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
d600: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
d610: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
d620: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
d630: 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20  L_CONTINUE ){.  
d640: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
d650: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  CL_OK;.         
d660: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d670: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
d680: 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
d690: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
d6a0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  _OK;.      }..  
d6b0: 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20      /* Free the 
d6c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65  column name obje
d6d0: 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  cts */.      if(
d6e0: 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20   pScript ){.    
d6f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d700: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
d710: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
d720: 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b  Count(apColName[
d730: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
d740: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
d750: 28 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65  (char*)apColName
d760: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
d770: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f    /* Free the bo
d780: 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62  und string and b
d790: 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a  lob parameters *
d7a0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
d7b0: 20 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nParm; i++){.
d7c0: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
d7d0: 52 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b  RefCount(apParm[
d7e0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
d7f0: 20 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61     if( apParm!=a
d800: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
d810: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
d820: 61 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  apParm);.      }
d830: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
d840: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
d850: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63   If the result c
d860: 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43  ode is SQLITE_SC
d870: 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20  HEMA, then.     
d880: 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74   ** flush the st
d890: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e  atement cache an
d8a0: 64 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d  d try the statem
d8b0: 65 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20  ent again..     
d8c0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20   */.      rc2 = 
d8d0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
d8e0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
d8f0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 72  SQLITE_SCHEMA==r
d900: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  c2 ){.        /*
d910: 20 41 66 74 65 72 20 61 20 73 63 68 65 6d 61 20   After a schema 
d920: 63 68 61 6e 67 65 2c 20 66 6c 75 73 68 20 74 68  change, flush th
d930: 65 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20  e cache and try 
d940: 74 6f 20 72 75 6e 20 74 68 65 0a 20 20 20 20 20  to run the.     
d950: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
d960: 61 67 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2f  again.        */
d970: 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74  .        flushSt
d980: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
d990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d9a0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
d9b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
d9c0: 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65  eStmt ) Tcl_Free
d9d0: 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74  ((char*)pPreStmt
d9e0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
d9f0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
da00: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
da10: 72 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rc2 ){.        /
da20: 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20  * If a run-time 
da30: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
da40: 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61  port the error a
da50: 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a  nd stop reading.
da60: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
da70: 51 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  QL.        */.  
da80: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
da90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
daa0: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
dab0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
dac0: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  b)));.        sq
dad0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
dae0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Stmt);.        r
daf0: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
db00: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
db10: 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28  tmt ) Tcl_Free((
db20: 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b  char*)pPreStmt);
db30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
db40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
db50: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20  pDb->maxStmt<=0 
db60: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
db70: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75   the cache is tu
db80: 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f  rned off, deallo
db90: 63 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d  cated the statem
dba0: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ent */.        i
dbb0: 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63  f( pPreStmt ) Tc
dbc0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50  l_Free((char*)pP
dbd0: 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  reStmt);.       
dbe0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
dbf0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
dc00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
dc10: 2a 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72  * Everything wor
dc20: 6b 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  ked and the cach
dc30: 65 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c  e is operational
dc40: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65  ..        ** Cre
dc50: 61 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65  ate a new SqlPre
dc60: 70 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74  paredStmt struct
dc70: 75 72 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f  ure if we need o
dc80: 6e 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  ne..        ** (
dc90: 49 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  If we already ha
dca0: 76 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75  ve one we can ju
dcb0: 73 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20  st reuse it.).  
dcc0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
dcd0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30   if( pPreStmt==0
dce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65   ){.          le
dcf0: 6e 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c  n = zLeft - zSql
dd00: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
dd10: 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61  Stmt = (SqlPrepa
dd20: 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c  redStmt*)Tcl_All
dd30: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65  oc( sizeof(*pPre
dd40: 53 74 6d 74 29 20 2b 20 6c 65 6e 20 29 3b 0a 20  Stmt) + len );. 
dd50: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
dd60: 65 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  eStmt==0 ) retur
dd70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
dd80: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
dd90: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
dda0: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
ddb0: 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a  mt->nSql = len;.
ddc0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
ddd0: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
dde0: 20 7a 53 71 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20   zSql, len);.   
ddf0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
de00: 3e 7a 53 71 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a  >zSql[len] = 0;.
de10: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
de20: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72     /* Add the pr
de30: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
de40: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
de50: 67 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  g of the cache l
de60: 69 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ist.        */. 
de70: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
de80: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74  >pNext = pDb->st
de90: 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  mtList;.        
dea0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
deb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
dec0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29   pDb->stmtList )
ded0: 7b 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  {.         pDb->
dee0: 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20  stmtList->pPrev 
def0: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20  = pPreStmt;.    
df00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44      }.        pD
df10: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
df20: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  reStmt;.        
df30: 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  if( pDb->stmtLas
df40: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
df50: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e    assert( pDb->n
df60: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
df70: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
df80: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
df90: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
dfa0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
dfb0: 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a  pDb->nStmt>0 );.
dfc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dfd0: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a    pDb->nStmt++;.
dfe0: 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49     .        /* I
dff0: 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61  f we have too ma
e000: 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  ny statement in 
e010: 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68  cache, remove th
e020: 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74  e surplus from t
e030: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e  he.        ** en
e040: 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  d of the cache l
e050: 69 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ist..        */.
e060: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
e070: 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d  Db->nStmt>pDb->m
e080: 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  axStmt ){.      
e090: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
e0a0: 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61  lize(pDb->stmtLa
e0b0: 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
e0c0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
e0d0: 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ast = pDb->stmtL
e0e0: 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ast->pPrev;.    
e0f0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
e100: 63 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c  char*)pDb->stmtL
e110: 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20  ast->pNext);.   
e120: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
e130: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Last->pNext = 0;
e140: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
e150: 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20  nStmt--;.       
e160: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
e170: 20 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20    /* Proceed to 
e180: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
e190: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c  nt */.      zSql
e1a0: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a   = zLeft;.    }.
e1b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
e1c0: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a  ount(objv[2]);..
e1d0: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
e1e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
e1f0: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  L_OK ){.        
e200: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
e210: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
e220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63        }.      Tc
e230: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
e240: 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Ret);.    }else 
e250: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
e260: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65  {.      Tcl_Rese
e270: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
e280: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
e290: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
e2a0: 20 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f       $db functio
e2b0: 6e 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20  n NAME SCRIPT.  
e2c0: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
e2d0: 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f   new SQL functio
e2e0: 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
e2f0: 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75  Whenever that fu
e300: 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  nction is.  ** c
e310: 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
e320: 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
e330: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
e340: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55   */.  case DB_FU
e350: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71  NCTION: {.    Sq
e360: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  lFunc *pFunc;.  
e370: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
e380: 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  pt;.    char *zN
e390: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ame;.    if( obj
e3a0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
e3b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
e3c0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
e3d0: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
e3e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e3f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
e400: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
e410: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
e420: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
e430: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
e440: 5d 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66  ];.    pFunc = f
e450: 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20  indSqlFunc(pDb, 
e460: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
e470: 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72  pFunc==0 ) retur
e480: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e490: 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72   if( pFunc->pScr
e4a0: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ipt ){.      Tcl
e4b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46  _DecrRefCount(pF
e4c0: 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20  unc->pScript);. 
e4d0: 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e     }.    pFunc->
e4e0: 70 53 63 72 69 70 74 20 3d 20 70 53 63 72 69 70  pScript = pScrip
e4f0: 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  t;.    Tcl_IncrR
e500: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
e510: 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65  ;.    pFunc->use
e520: 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54  EvalObjv = safeT
e530: 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74  oUseEvalObjv(int
e540: 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20  erp, pScript);. 
e550: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
e560: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
e570: 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  pDb->db, zName, 
e580: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
e590: 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20  .        pFunc, 
e5a0: 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  tclSqlFunc, 0, 0
e5b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
e5c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e5d0: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
e5e0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  ;.      Tcl_SetR
e5f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
e600: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
e610: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
e620: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
e630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
e640: 2a 20 4d 75 73 74 20 66 6c 75 73 68 20 61 6e 79  * Must flush any
e650: 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e   cached statemen
e660: 74 73 20 2a 2f 0a 20 20 20 20 20 20 66 6c 75 73  ts */.      flus
e670: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
e680: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
e690: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
e6a0: 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72 62  **     $db incrb
e6b0: 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20  lob ?-readonly? 
e6c0: 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d  ?DB? TABLE COLUM
e6d0: 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63  N ROWID.  */.  c
e6e0: 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a  ase DB_INCRBLOB:
e6f0: 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
e700: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
e710: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e720: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63  ult(interp, "inc
e730: 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61  rblob not availa
e740: 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
e750: 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  d", 0);.    retu
e760: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
e770: 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65  lse.    int isRe
e780: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adonly = 0;.    
e790: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
e7a0: 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f  = "main";.    co
e7b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
e7c0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
e7d0: 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73   *zColumn;.    s
e7e0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77  qlite_int64 iRow
e7f0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
e800: 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c  for the -readonl
e810: 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  y option */.    
e820: 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74  if( objc>3 && st
e830: 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
e840: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72  ng(objv[2]), "-r
e850: 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  eadonly")==0 ){.
e860: 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79        isReadonly
e870: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
e880: 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73   if( objc!=(5+is
e890: 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a  Readonly) && obj
e8a0: 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c!=(6+isReadonly
e8b0: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ) ){.      Tcl_W
e8c0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
e8d0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 2, objv, "?-
e8e0: 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
e8f0: 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
e900: 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  D");.      retur
e910: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e920: 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
e930: 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  ==(6+isReadonly)
e940: 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   ){.      zDb = 
e950: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
e960: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  jv[2]);.    }.  
e970: 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
e980: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
e990: 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c  jc-3]);.    zCol
e9a0: 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  umn = Tcl_GetStr
e9b0: 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d  ing(objv[objc-2]
e9c0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
e9d0: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
e9e0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f  j(interp, objv[o
e9f0: 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a  bjc-1], &iRow);.
ea00: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c  .    if( rc==TCL
ea10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
ea20: 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62  = createIncrblob
ea30: 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20  Channel(.       
ea40: 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20     interp, pDb, 
ea50: 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
ea60: 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65  lumn, iRow, isRe
ea70: 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a  adonly.      );.
ea80: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ea90: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
eaa0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69  *.  **     $db i
eab0: 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20  nterrupt.  **.  
eac0: 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65  ** Interrupt the
ead0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
eae0: 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c  e inner-most SQL
eaf0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54   interpreter.  T
eb00: 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20  his.  ** causes 
eb10: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
eb20: 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  t to return an e
eb30: 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49  rror of SQLITE_I
eb40: 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20  NTERRUPT..  */. 
eb50: 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55   case DB_INTERRU
eb60: 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  PT: {.    sqlite
eb70: 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d  3_interrupt(pDb-
eb80: 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  >db);.    break;
eb90: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
eba0: 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75      $db nullvalu
ebb0: 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a  e ?STRING?.  **.
ebc0: 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74    ** Change text
ebd0: 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c   used when a NUL
ebe0: 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f  L comes back fro
ebf0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
ec00: 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a  If ?STRING?.  **
ec10: 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
ec20: 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
ec30: 74 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f  t string used fo
ec40: 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  r NULL is return
ec50: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49  ed..  ** If STRI
ec60: 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  NG is present, t
ec70: 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65  hen STRING is re
ec80: 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  turned..  **.  *
ec90: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c  /.  case DB_NULL
eca0: 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28  VALUE: {.    if(
ecb0: 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
ecc0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
ecd0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
ece0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
ecf0: 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20  NULLVALUE");.   
ed00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ed10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
ed20: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
ed30: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
ed40: 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d     char *zNull =
ed50: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
ed60: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
ed70: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
ed80: 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20  pDb->zNull ){.  
ed90: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
eda0: 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20  Db->zNull);.    
edb0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e    }.      if( zN
edc0: 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ull && len>0 ){.
edd0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
ede0: 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ll = Tcl_Alloc( 
edf0: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
ee00: 20 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e     strncpy(pDb->
ee10: 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65  zNull, zNull, le
ee20: 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  n);.        pDb-
ee30: 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c  >zNull[len] = '\
ee40: 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0';.      }else{
ee50: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
ee60: 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ull = 0;.      }
ee70: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
ee80: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ee90: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
eea0: 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20  pDb->zNull));.  
eeb0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
eec0: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
eed0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
eee0: 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  d .  **.  ** Ret
eef0: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
ef00: 68 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49  hich is the ROWI
ef10: 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  D for the most r
ef20: 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20  ecent insert..  
ef30: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53  */.  case DB_LAS
ef40: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20  T_INSERT_ROWID: 
ef50: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
ef60: 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f  Result;.    Tcl_
ef70: 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20  WideInt rowid;. 
ef80: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
ef90: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
efa0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
efb0: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
efc0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
efd0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
efe0: 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33   rowid = sqlite3
eff0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
f000: 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  id(pDb->db);.   
f010: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
f020: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f030: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
f040: 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75  WideIntObj(pResu
f050: 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20  lt, rowid);.    
f060: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
f070: 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45  .  ** The DB_ONE
f080: 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73  COLUMN method is
f090: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67   implemented tog
f0a0: 65 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 56  ether with DB_EV
f0b0: 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20  AL..  */..  /*  
f0c0: 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f    $db progress ?
f0d0: 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a  N CALLBACK?.  **
f0e0: 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68   .  ** Invoke th
f0f0: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
f100: 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
f110: 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
f120: 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
f130: 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
f140: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
f150: 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
f160: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
f170: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
f180: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
f190: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f1a0: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
f1b0: 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20  Progress, 0);.  
f1c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
f1d0: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
f1e0: 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67       char *zProg
f1f0: 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  ress;.      int 
f200: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e  len;.      int N
f210: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f  ;.      if( TCL_
f220: 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
f230: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
f240: 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20  jv[2], &N) ){.  
f250: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f260: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b  _ERROR;.      };
f270: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f280: 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
f290: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
f2a0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20  b->zProgress);. 
f2b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
f2c0: 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74  ogress = Tcl_Get
f2d0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f2e0: 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[3], &len);.  
f2f0: 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73      if( zProgres
f300: 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  s && len>0 ){.  
f310: 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67        pDb->zProg
f320: 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  ress = Tcl_Alloc
f330: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
f340: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
f350: 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f  >zProgress, zPro
f360: 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20  gress, len+1);. 
f370: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f380: 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
f390: 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ss = 0;.      }.
f3a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f3b0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
f3c0: 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20  LBACK.      if( 
f3d0: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
f3e0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
f3f0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
f400: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f410: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
f420: 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50  (pDb->db, N, DbP
f430: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20  rogressHandler, 
f440: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
f450: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
f460: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
f470: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
f480: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
f490: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
f4a0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
f4b0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f4c0: 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c  2, objv, "N CALL
f4d0: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
f4e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f4f0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
f500: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
f510: 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42  b profile ?CALLB
f520: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
f530: 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
f540: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
f550: 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
f560: 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73  after each SQL s
f570: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
f580: 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65  at has run.  The
f590: 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
f5a0: 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20   and the amount 
f5b0: 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61  of elapse time a
f5c0: 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64  re.  ** appended
f5d0: 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
f5e0: 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69  ore the script i
f5f0: 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  s run..  */.  ca
f600: 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b  se DB_PROFILE: {
f610: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
f620: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
f630: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f640: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
f650: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
f660: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f670: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f680: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
f690: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
f6a0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
f6b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f6c0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
f6d0: 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  file, 0);.      
f6e0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f6f0: 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c     char *zProfil
f700: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e;.      int len
f710: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
f720: 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
f730: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
f740: 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
f750: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
f760: 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  file = Tcl_GetSt
f770: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f780: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
f790: 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26    if( zProfile &
f7a0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
f7b0: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
f7c0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
f7d0: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
f7e0: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
f7f0: 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c  ofile, zProfile,
f800: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
f810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
f820: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b  b->zProfile = 0;
f830: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
f840: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
f850: 43 45 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CE.      if( pDb
f860: 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
f870: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
f880: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
f890: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
f8a0: 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50  ile(pDb->db, DbP
f8b0: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70  rofileHandler, p
f8c0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
f8d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f8e0: 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64  3_profile(pDb->d
f8f0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
f900: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
f910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f920: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
f930: 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a   rekey KEY.  **.
f940: 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20    ** Change the 
f950: 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f  encryption key o
f960: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
f970: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20  open database.. 
f980: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45   */.  case DB_RE
f990: 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e  KEY: {.    int n
f9a0: 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  Key;.    void *p
f9b0: 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  Key;.    if( obj
f9c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
f9d0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f9e0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
f9f0: 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65  "KEY");.      re
fa00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fa10: 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d      }.    pKey =
fa20: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
fa30: 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
fa40: 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66  , &nKey);.#ifdef
fa50: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
fa60: 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  C.    rc = sqlit
fa70: 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62  e3_rekey(pDb->db
fa80: 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
fa90: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
faa0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
fab0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
fac0: 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30  te3ErrStr(rc), 0
fad0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
fae0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
faf0: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
fb00: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
fb10: 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20      $db timeout 
fb20: 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a  MILLESECONDS.  *
fb30: 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72  *.  ** Delay for
fb40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
fb50: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63  illiseconds spec
fb60: 69 66 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c  ified when a fil
fb70: 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  e is locked..  *
fb80: 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45  /.  case DB_TIME
fb90: 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d  OUT: {.    int m
fba0: 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  s;.    if( objc!
fbb0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
fbc0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
fbd0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d  erp, 2, objv, "M
fbe0: 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20  ILLISECONDS");. 
fbf0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fc00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
fc10: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
fc20: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
fc30: 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  bjv[2], &ms) ) r
fc40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
fc60: 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64  y_timeout(pDb->d
fc70: 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61  b, ms);.    brea
fc80: 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20  k;.  }.  .  /*. 
fc90: 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61   **     $db tota
fca0: 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  l_changes.  **. 
fcb0: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
fcc0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
fcd0: 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
fce0: 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
fcf0: 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  eleted .  ** sin
fd00: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
fd10: 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74  handle was creat
fd20: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
fd30: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
fd40: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
fd50: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66  *pResult;.    if
fd60: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
fd70: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
fd80: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
fd90: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
fda0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fdb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73  ;.    }.    pRes
fdc0: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
fdd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
fde0: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
fdf0: 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74  j(pResult, sqlit
fe00: 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
fe10: 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  (pDb->db));.    
fe20: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
fe30: 20 20 20 20 24 64 62 20 74 72 61 63 65 20 3f 43      $db trace ?C
fe40: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
fe50: 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
fe60: 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
fe70: 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
fe80: 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c  ine for each SQL
fe90: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
fea0: 74 68 61 74 20 69 73 20 65 78 65 63 75 74 65 64  that is executed
feb0: 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  .  The text of t
fec0: 68 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64  he SQL is append
fed0: 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62  ed to CALLBACK b
fee0: 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  efore.  ** it is
fef0: 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a   executed..  */.
ff00: 20 20 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a    case DB_TRACE:
ff10: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
ff20: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
ff30: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
ff40: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
ff50: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
ff60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ff70: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
ff80: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
ff90: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
ffa0: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
ffb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ffc0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61  nterp, pDb->zTra
ffd0: 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ce, 0);.      }.
ffe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fff0: 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20   char *zTrace;. 
10000 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
10010 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
10020 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
10030 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
10040 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ace);.      }.  
10050 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c      zTrace = Tcl
10060 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10070 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
10080 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61  ;.      if( zTra
10090 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ce && len>0 ){. 
100a0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
100b0 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ce = Tcl_Alloc( 
100c0 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
100d0 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
100e0 54 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c  Trace, zTrace, l
100f0 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
10100 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
10110 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  >zTrace = 0;.   
10120 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
10130 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
10140 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
10150 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
10160 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
10170 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
10180 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
10190 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64  >db, DbTraceHand
101a0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
101b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
101c0 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
101d0 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
101e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
101f0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
10200 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
10210 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66  ransaction [-def
10220 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65  erred|-immediate
10230 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52  |-exclusive] SCR
10240 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74  IPT.  **.  ** St
10250 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
10260 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65  ction (if we are
10270 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
10280 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20  the midst of a. 
10290 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
102a0 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65   and execute the
102b0 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49   TCL script SCRI
102c0 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50  PT.  After SCRIP
102d0 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  T.  ** completes
102e0 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20  , either commit 
102f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
10300 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  or roll it back 
10310 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74  if SCRIPT.  ** t
10320 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
10330 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65  on.  Or if no ne
10340 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73  w transation was
10350 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74   started, do not
10360 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20  hing..  ** pass 
10370 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e  the exception on
10380 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   up the stack.. 
10390 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
103a0 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72  mmand was inspir
103b0 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61  ed by Dave Thoma
103c0 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79  s's talk on Ruby
103d0 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30   at the.  ** 200
103e0 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20  5 O'Reilly Open 
103f0 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f  Source Conventio
10400 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a  n (OSCON)..  */.
10410 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41    case DB_TRANSA
10420 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74  CTION: {.    int
10430 20 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63   inTrans;.    Tc
10440 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
10450 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10460 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22  zBegin = "BEGIN"
10470 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
10480 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
10490 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
104a0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
104b0 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20  , objv, "[TYPE] 
104c0 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
104d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
104e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
104f0 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
10500 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
10510 32 5d 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  2];.    } else {
10520 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
10530 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f  nst char *TTYPE_
10540 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  strs[] = {.     
10550 20 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20     "deferred",  
10560 20 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22   "exclusive",  "
10570 69 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20  immediate", 0.  
10580 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75      };.      enu
10590 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20  m TTYPE_enum {. 
105a0 20 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46         TTYPE_DEF
105b0 45 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43  ERRED, TTYPE_EXC
105c0 4c 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d  LUSIVE, TTYPE_IM
105d0 4d 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b  MEDIATE.      };
105e0 0a 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65  .      int ttype
105f0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
10600 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
10610 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
10620 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72   TTYPE_strs, "tr
10630 61 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c  ansaction type",
10640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
10660 2c 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20  , &ttype) ){.   
10670 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10680 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
10690 20 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e       switch( (en
106a0 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74  um TTYPE_enum)tt
106b0 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ype ){.        c
106c0 61 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52  ase TTYPE_DEFERR
106d0 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ED:    /* no-op 
106e0 2a 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  */;             
106f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10700 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58     case TTYPE_EX
10710 43 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69  CLUSIVE:   zBegi
10720 6e 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55  n = "BEGIN EXCLU
10730 53 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20  SIVE";  break;. 
10740 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
10750 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a  E_IMMEDIATE:   z
10760 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49  Begin = "BEGIN I
10770 4d 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61  MMEDIATE";  brea
10780 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
10790 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
107a0 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e  3];.    }.    in
107b0 54 72 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33  Trans = !sqlite3
107c0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
107d0 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66  pDb->db);.    if
107e0 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20  ( !inTrans ){.  
107f0 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
10800 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
10810 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29  zBegin, 0, 0, 0)
10820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
10830 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
10840 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
10850 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54  0);.    if( !inT
10860 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 63 6f  rans ){.      co
10870 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a  nst char *zEnd;.
10880 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
10890 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  L_ERROR ){.     
108a0 20 20 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42     zEnd = "ROLLB
108b0 41 43 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c  ACK";.      } el
108c0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e  se {.        zEn
108d0 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20  d = "COMMIT";.  
108e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
108f0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
10900 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30  ->db, zEnd, 0, 0
10910 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
10920 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
10930 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ->db, "ROLLBACK"
10940 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
10950 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
10960 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
10970 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74   **    $db updat
10980 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  e_hook ?script?.
10990 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c    **    $db roll
109a0 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  back_hook ?scrip
109b0 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
109c0 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a  B_UPDATE_HOOK: .
109d0 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41    case DB_ROLLBA
109e0 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20  CK_HOOK: {..    
109f0 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f  /* set ppHook to
10a00 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74   point at pUpdat
10a10 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61  eHook or pRollba
10a20 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e  ckHook, dependin
10a30 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65  g on .    ** whe
10a40 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65  ther [$db update
10a50 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72  _hook] or [$db r
10a60 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61  ollback_hook] wa
10a70 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a  s invoked..    *
10a80 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
10a90 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28  ppHook; .    if(
10aa0 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41   choice==DB_UPDA
10ab0 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20  TE_HOOK ){.     
10ac0 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
10ad0 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20  pUpdateHook;.   
10ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
10af0 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f  Hook = &pDb->pRo
10b00 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20  llbackHook;.    
10b10 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  }..    if( objc!
10b20 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
10b30 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  .       Tcl_Wron
10b40 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10b50 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49   2, objv, "?SCRI
10b60 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65  PT?");.       re
10b70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10b80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70      }.    if( *p
10b90 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54  pHook ){.      T
10ba0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10bb0 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29  interp, *ppHook)
10bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
10bd0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ==3 ){.        T
10be0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
10bf0 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
10c00 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20    *ppHook = 0;. 
10c10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10c20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
10c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
10c40 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20  *ppHook) );.    
10c50 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61    if( Tcl_GetCha
10c60 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29  rLength(objv[2])
10c70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  >0 ){.        *p
10c80 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b  pHook = objv[2];
10c90 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
10ca0 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
10cb0 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
10cc0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75  }..    sqlite3_u
10cd0 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e  pdate_hook(pDb->
10ce0 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74  db, (pDb->pUpdat
10cf0 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61  eHook?DbUpdateHa
10d00 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
10d10 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c      sqlite3_roll
10d20 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  back_hook(pDb->d
10d30 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  b,(pDb->pRollbac
10d40 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b  kHook?DbRollback
10d50 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b  Handler:0),pDb);
10d60 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ..    break;.  }
10d70 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65  ..  /*    $db ve
10d80 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rsion.  **.  ** 
10d90 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69  Return the versi
10da0 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  on string for th
10db0 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  is database..  *
10dc0 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53  /.  case DB_VERS
10dd0 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ION: {.    Tcl_S
10de0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
10df0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
10e00 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54  _libversion(), T
10e10 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
10e20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d  break;.  }...  }
10e30 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53   /* End of the S
10e40 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20  WITCH statement 
10e50 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
10e60 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  }../*.**   sqlit
10e70 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41  e3 DBNAME FILENA
10e80 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20  ME ?MODE? ?-key 
10e90 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  KEY?.**.** This 
10ea0 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20  is the main Tcl 
10eb0 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74  command.  When t
10ec0 68 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20  he "sqlite" Tcl 
10ed0 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e  command is.** in
10ee0 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74  voked, this rout
10ef0 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63  ine runs to proc
10f00 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64  ess that command
10f10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
10f20 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41  t argument, DBNA
10f30 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72  ME, is an arbitr
10f40 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ary name for a n
10f50 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  ew.** database c
10f60 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73  onnection.  This
10f70 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73   command creates
10f80 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e   a new command n
10f90 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74  amed.** DBNAME t
10fa0 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63  hat is used to c
10fb0 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e  ontrol that conn
10fc0 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74  ection.  The dat
10fd0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
10fe0 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77  ion is deleted w
10ff0 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63  hen the DBNAME c
11000 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65  ommand is delete
11010 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  d..**.** The sec
11020 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
11030 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11040 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
11050 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 73  ontains.** the s
11060 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
11070 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 63 63  hat is to be acc
11080 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  essed..**.** For
11090 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
110a0 73 2c 20 77 65 20 61 6c 73 6f 20 73 75 70 70 6f  s, we also suppo
110b0 72 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  rt the following
110c0 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33  :.**.**  sqlite3
110d0 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a   -encoding.**.**
110e0 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74 68         Return th
110f0 65 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  e encoding used 
11100 62 79 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  by LIKE and GLOB
11110 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 43 68 6f   operators.  Cho
11120 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 61 72  ices.**       ar
11130 65 20 55 54 46 2d 38 20 61 6e 64 20 69 73 6f 38  e UTF-8 and iso8
11140 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  859..**.**  sqli
11150 74 65 33 20 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a  te3 -version.**.
11160 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20  **       Return 
11170 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
11180 65 72 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  er of the SQLite
11190 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20   library..**.** 
111a0 20 73 71 6c 69 74 65 33 20 2d 74 63 6c 2d 75 73   sqlite3 -tcl-us
111b0 65 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20  es-utf.**.**    
111c0 20 20 20 52 65 74 75 72 6e 20 22 31 22 20 69 66     Return "1" if
111d0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61   compiled with a
111e0 20 54 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e   Tcl uses UTF-8.
111f0 20 20 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a    Return "0" if.
11200 2a 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55  **       not.  U
11210 73 65 64 20 62 79 20 74 65 73 74 73 20 74 6f 20  sed by tests to 
11220 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69  make sure the li
11230 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
11240 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72  ed .**       cor
11250 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
11260 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69  c int DbMain(voi
11270 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
11280 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
11290 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  bjc,Tcl_Obj *con
112a0 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69  st*objv){.  Sqli
112b0 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20  teDb *p;.  void 
112c0 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  *pKey = 0;.  int
112d0 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e   nKey = 0;.  con
112e0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
112f0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a   char *zErrMsg;.
11300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
11310 69 6c 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ile;.  Tcl_DStri
11320 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  ng translatedFil
11330 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a  ename;.  if( obj
11340 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==2 ){.    zArg
11350 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11360 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
11370 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   0);.    if( str
11380 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69  cmp(zArg,"-versi
11390 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  on")==0 ){.     
113a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
113b0 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33  t(interp,sqlite3
113c0 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20  _version,0);.   
113d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
113e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
113f0 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61  strcmp(zArg,"-ha
11400 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a  s-codec")==0 ){.
11410 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
11420 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63  S_CODEC.      Tc
11430 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11440 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65  nterp,"1",0);.#e
11450 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  lse.      Tcl_Ap
11460 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11470 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66  p,"0",0);.#endif
11480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11490 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
114a0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
114b0 22 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 22 29  "-tcl-uses-utf")
114c0 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 54 43  ==0 ){.#ifdef TC
114d0 4c 5f 55 54 46 5f 4d 41 58 0a 20 20 20 20 20 20  L_UTF_MAX.      
114e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
114f0 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a  (interp,"1",0);.
11500 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f  #else.      Tcl_
11510 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11520 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64  erp,"0",0);.#end
11530 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
11540 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
11550 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20  }.  if( objc==5 
11560 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20  || objc==6 ){.  
11570 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
11580 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
11590 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b 0a  jv[objc-2], 0);.
115a0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
115b0 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29  Arg,"-key")==0 )
115c0 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54  {.      pKey = T
115d0 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
115e0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63  romObj(objv[objc
115f0 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20  -1], &nKey);.   
11600 20 20 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20 20     objc -= 2;.  
11610 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62    }.  }.  if( ob
11620 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
11630 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
11640 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11650 20 31 2c 20 6f 62 6a 76 2c 20 0a 23 69 66 64 65   1, objv, .#ifde
11660 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
11670 45 43 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45  EC.      "HANDLE
11680 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79 20   FILENAME ?-key 
11690 43 4f 44 45 43 2d 4b 45 59 3f 22 0a 23 65 6c 73  CODEC-KEY?".#els
116a0 65 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20  e.      "HANDLE 
116b0 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 22  FILENAME ?MODE?"
116c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20  .#endif.    );. 
116d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
116e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d  ROR;.  }.  zErrM
116f0 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53  sg = 0;.  p = (S
11700 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c  qliteDb*)Tcl_All
11710 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
11720 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
11730 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
11740 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f  t(interp, "mallo
11750 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53  c failed", TCL_S
11760 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
11770 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11780 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
11790 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
117a0 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
117b0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
117c0 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  v[2], 0);.  zFil
117d0 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74  e = Tcl_Translat
117e0 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70  eFileName(interp
117f0 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c  , zFile, &transl
11800 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  atedFilename);. 
11810 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46   sqlite3_open(zF
11820 69 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  ile, &p->db);.  
11830 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
11840 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
11850 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  ame);.  if( SQLI
11860 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
11870 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
11880 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
11890 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
118a0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
118b0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
118c0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
118d0 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  ->db);.    p->db
118e0 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66   = 0;.  }.#ifdef
118f0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
11900 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28  C.  sqlite3_key(
11910 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  p->db, pKey, nKe
11920 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  y);.#endif.  if(
11930 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
11940 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
11950 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20  nterp, zErrMsg, 
11960 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
11970 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
11980 72 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  r*)p);.    sqlit
11990 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
119a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
119b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d  _ERROR;.  }.  p-
119c0 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50  >maxStmt = NUM_P
119d0 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
119e0 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74   p->interp = int
119f0 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63  erp;.  zArg = Tc
11a00 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
11a10 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
11a20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
11a30 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
11a40 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28  Arg, DbObjCmd, (
11a50 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
11a60 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  eCmd);..  /* If 
11a70 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
11a80 4c 49 54 45 5f 54 45 53 54 20 74 75 72 6e 65 64  LITE_TEST turned
11a90 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67 69 73 74   on, then regist
11aa0 65 72 20 74 68 65 20 22 6d 64 35 73 75 6d 22 0a  er the "md5sum".
11ab0 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f    ** SQL functio
11ac0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
11ad0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
11ae0 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 4d     extern void M
11af0 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69  d5_Register(sqli
11b00 74 65 33 2a 29 3b 0a 23 69 66 64 65 66 20 53 51  te3*);.#ifdef SQ
11b10 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20  LITE_MEMDEBUG.  
11b20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 66 61 69 6c    int mallocfail
11b30 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c   = sqlite3_iMall
11b40 6f 63 46 61 69 6c 3b 0a 20 20 20 20 73 71 6c 69  ocFail;.    sqli
11b50 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20  te3_iMallocFail 
11b60 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
11b70 4d 64 35 5f 52 65 67 69 73 74 65 72 28 70 2d 3e  Md5_Register(p->
11b80 64 62 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  db);.#ifdef SQLI
11b90 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20  TE_MEMDEBUG.    
11ba0 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
11bb0 61 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66 61 69 6c  ail = mallocfail
11bc0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  ;.#endif.  }.#en
11bd0 64 69 66 20 20 0a 20 20 72 65 74 75 72 6e 20 54  dif  .  return T
11be0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
11bf0 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20  Provide a dummy 
11c00 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66  Tcl_InitStubs if
11c10 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
11c20 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a  is as a static.*
11c30 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  * library..*/.#i
11c40 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54  fndef USE_TCL_ST
11c50 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c  UBS.# undef  Tcl
11c60 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66  _InitStubs.# def
11c70 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ine Tcl_InitStub
11c80 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  s(a,b,c).#endif.
11c90 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
11ca0 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41   we have a PACKA
11cb0 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f  GE_VERSION macro
11cc0 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20   defined.  This 
11cd0 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e  will be.** defin
11ce0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
11cf0 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65   by the TEA make
11d00 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72  file.  But other
11d10 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f   makefiles.** do
11d20 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a   not define it..
11d30 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41  */.#ifndef PACKA
11d40 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66  GE_VERSION.# def
11d50 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ine PACKAGE_VERS
11d60 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ION SQLITE_VERSI
11d70 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ON.#endif../*.**
11d80 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
11d90 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   module..**.** T
11da0 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63  his Tcl module c
11db0 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73  ontains only a s
11dc0 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f  ingle new Tcl co
11dd0 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c  mmand named "sql
11de0 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20  ite"..** (Hence 
11df0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65  there is no name
11e00 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73  space.  There is
11e10 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69   no point in usi
11e20 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a  ng a namespace.*
11e30 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69  * if the extensi
11e40 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73  on only supplies
11e50 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20   one new name!) 
11e60 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
11e70 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64  mmand is.** used
11e80 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53   to open a new S
11e90 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
11ea0 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28   See the DbMain(
11eb0 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a  ) routine above.
11ec0 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
11ed0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
11ee0 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  /.EXTERN int Sql
11ef0 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
11f00 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
11f10 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69   Tcl_InitStubs(i
11f20 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29  nterp, "8.4", 0)
11f30 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
11f40 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
11f50 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
11f60 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
11f70 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
11f80 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
11f90 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
11fa0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
11fb0 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
11fc0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
11fd0 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f   "sqlite", (Tcl_
11fe0 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
11ff0 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
12000 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
12010 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41  rp, "sqlite", PA
12020 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a  CKAGE_VERSION);.
12030 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12040 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63  .}.EXTERN int Tc
12050 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63  lsqlite3_Init(Tc
12060 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12070 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
12080 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
12090 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  }.EXTERN int Sql
120a0 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63  ite3_SafeInit(Tc
120b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
120c0 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
120d0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
120e0 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e  clsqlite3_SafeIn
120f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
12100 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
12110 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65  CL_OK; }..#ifnde
12120 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
12130 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e  X_ONLY.EXTERN in
12140 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
12150 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12160 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
12170 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
12180 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
12190 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  sqlite_Init(Tcl_
121a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
121b0 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
121c0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
121d0 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
121e0 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
121f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12200 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
12210 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
12220 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54  qlite_SafeInit(T
12230 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12240 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
12250 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K; }.#endif..#if
12260 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a  def TCLSH./*****
12270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122b0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
122c0 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77  code that follow
122d0 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  s is used to bui
122e0 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43  ld standalone TC
122f0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a  L interpreters.*
12300 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
12310 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f  macro TCLSH is o
12320 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20  ne, then put in 
12330 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68  code this for th
12340 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74  e.** "main" rout
12350 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ine that will in
12360 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64  itialize Tcl and
12370 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d   take input from
12380 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
12390 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48  ut..*/.#if TCLSH
123a0 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72 20  ==1.static char 
123b0 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
123c0 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
123d0 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20    "while {![eof 
123e0 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20  stdin]} {\n".   
123f0 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c   "if {$line!=\"\
12400 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70  "} {\n".      "p
12410 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
12420 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20  "> \"\n".    "} 
12430 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
12440 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
12450 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"% \"\n".    "
12460 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20  }\n".    "flush 
12470 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61  stdout\n".    "a
12480 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73  ppend line [gets
12490 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22   stdin]\n".    "
124a0 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65  if {[info comple
124b0 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a  te $line]} {\n".
124c0 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63        "if {[catc
124d0 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c  h {uplevel #0 $l
124e0 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c  ine} result]} {\
124f0 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
12500 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a   stderr \"Error:
12510 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20   $result\"\n".  
12520 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24      "} elseif {$
12530 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c  result!=\"\"} {\
12540 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
12550 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20   $result\n".    
12560 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73    "}\n".      "s
12570 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
12580 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
12590 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
125a0 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c  e \\n\n".    "}\
125b0 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e  n".  "}\n".;.#en
125c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
125d0 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
125e0 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20 74   two, then get t
125f0 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64  he main loop cod
12600 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20  e out of.** the 
12610 73 65 70 61 72 61 74 65 20 66 69 6c 65 20 22 73  separate file "s
12620 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e  paceanal_tcl.h".
12630 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  .*/.#if TCLSH==2
12640 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
12650 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63  inloop[] = .#inc
12660 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c 5f  lude "spaceanal_
12670 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a  tcl.h".;.#endif.
12680 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d  .#define TCLSH_M
12690 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65  AIN main   /* Ne
126a0 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74  eded to fake out
126b0 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74   mktclapp */.int
126c0 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20   TCLSH_MAIN(int 
126d0 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
126e0 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  v){.  Tcl_Interp
126f0 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
12700 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61  FindExecutable(a
12710 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72  rgv[0]);.  inter
12720 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e  p = Tcl_CreateIn
12730 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74 65  terp();.  Sqlite
12740 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
12750 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
12760 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
12770 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
12780 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  1_Init(Tcl_Inter
12790 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
127a0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f  int Sqlitetest2_
127b0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
127c0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
127d0 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e  t Sqlitetest3_In
127e0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
127f0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
12800 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
12810 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
12820 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
12830 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54  litetest5_Init(T
12840 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
12850 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
12860 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c  tetest6_Init(Tcl
12870 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
12880 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
12890 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49  test7_Init(Tcl_I
128a0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
128b0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
128c0 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st8_Init(Tcl_Int
128d0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
128e0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
128f0 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  9_Init(Tcl_Inter
12900 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
12910 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c  int Md5_Init(Tcl
12920 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
12930 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
12940 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c  testsse_Init(Tcl
12950 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
12960 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
12970 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54  testasync_Init(T
12980 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
12990 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
129a0 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69  tetesttclvar_Ini
129b0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
129c0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
129d0 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f  qlitetestschema_
129e0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
129f0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
12a00 74 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74  t Sqlitetest_aut
12a10 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  oext_Init(Tcl_In
12a20 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
12a30 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
12a40 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c  t_hexio_Init(Tcl
12a50 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
12a60 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
12a70 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f  config_Init(Tcl_
12a80 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20 20 53  Interp*);..    S
12a90 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
12aa0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
12ab0 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e  itetest2_Init(in
12ac0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
12ad0 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65  etest3_Init(inte
12ae0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
12af0 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70  est4_Init(interp
12b00 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
12b10 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t5_Init(interp);
12b20 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 36  .    Sqlitetest6
12b30 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
12b40 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49     Sqlitetest7_I
12b50 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
12b60 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69   Sqlitetest8_Ini
12b70 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
12b80 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28  qlitetest9_Init(
12b90 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
12ba0 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69  itetestasync_Ini
12bb0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
12bc0 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f  qlitetesttclvar_
12bd0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
12be0 20 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65    Sqlitetestsche
12bf0 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ma_Init(interp);
12c00 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
12c10 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74  autoext_Init(int
12c20 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
12c30 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28  test_hexio_Init(
12c40 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
12c50 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69  iteconfig_Init(i
12c60 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d 64 35 5f  nterp);.    Md5_
12c70 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69  Init(interp);.#i
12c80 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a  fdef SQLITE_SSE.
12c90 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 73      Sqlitetestss
12ca0 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  e_Init(interp);.
12cb0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
12cc0 66 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20  f.  if( argc>=2 
12cd0 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20  || TCLSH==2 ){. 
12ce0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68     int i;.    ch
12cf0 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20  ar zArgc[32];.  
12d00 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
12d10 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29  tf(sizeof(zArgc)
12d20 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61  , zArgc, "%d", a
12d30 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a  rgc-(3-TCLSH));.
12d40 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
12d50 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41  nterp,"argc", zA
12d60 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  rgc, TCL_GLOBAL_
12d70 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
12d80 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
12d90 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c  gv0",argv[1],TCL
12da0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
12db0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
12dc0 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c  terp,"argv", "",
12dd0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
12de0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54  );.    for(i=3-T
12df0 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b  CLSH; i<argc; i+
12e00 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  +){.      Tcl_Se
12e10 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72  tVar(interp, "ar
12e20 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20  gv", argv[i],.  
12e30 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42          TCL_GLOB
12e40 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49  AL_ONLY | TCL_LI
12e50 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c  ST_ELEMENT | TCL
12e60 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a  _APPEND_VALUE);.
12e70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43      }.    if( TC
12e80 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76  LSH==1 && Tcl_Ev
12e90 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61  alFile(interp, a
12ea0 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20  rgv[1])!=TCL_OK 
12eb0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
12ec0 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c  har *zInfo = Tcl
12ed0 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _GetVar(interp, 
12ee0 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c  "errorInfo", TCL
12ef0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
12f00 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d       if( zInfo==
12f10 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65  0 ) zInfo = inte
12f20 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20  rp->result;.    
12f30 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
12f40 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72  ,"%s: %s\n", *ar
12f50 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20  gv, zInfo);.    
12f60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
12f70 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63  }.  }.  if( argc
12f80 3c 3d 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20  <=1 || TCLSH==2 
12f90 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61  ){.    Tcl_Globa
12fa0 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d  lEval(interp, zM
12fb0 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20  ainloop);.  }.  
12fc0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
12fd0 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a     if /* TCLSH */.