/ Hex Artifact Content
Login

Artifact df53bcb8239658c5ce45762c9837cc7f38c680de:


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 31 20 32 30 30 37  e.c,v 1.191 2007
0220: 2f 30 36 2f 31 39 20 31 37 3a 34 38 3a 35 37 20  /06/19 17:48:57 
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 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63   (c=='b' && strc
55b0: 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61  mp(zType,"boolea
55c0: 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20  n")==0) ||.     
55d0: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
55e0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
55f0: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
5600: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
5610: 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b  bj(0, pVar, &n);
5620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5630: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
5640: 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, n);.    }else
5650: 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
5660: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75  trcmp(zType,"dou
5670: 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
5680: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
5690: 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
56a0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
56b0: 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &r);.      sqlit
56c0: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
56d0: 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20  (context, r);.  
56e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
56f0: 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  w' && strcmp(zTy
5700: 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30  pe,"wideInt")==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 63 3d 3d 27          if( c=='
c520: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
c530: 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d  pe,"bytearray")=
c540: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
c550: 20 20 20 20 20 26 26 20 28 70 56 61 72 2d 3e 62       && (pVar->b
c560: 79 74 65 73 3d 3d 30 20 7c 7c 20 7a 56 61 72 5b  ytes==0 || zVar[
c570: 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20 20 20 20  0]=='@') ){.    
c580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c            /* Onl
c590: 79 20 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79  y load a BLOB ty
c5a0: 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61  pe if the Tcl va
c5b0: 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65  riable is a byte
c5c0: 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20  array and.      
c5d0: 20 20 20 20 20 20 20 20 2a 2a 20 65 69 74 68 65          ** eithe
c5e0: 72 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69  r it has no stri
c5f0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
c600: 6e 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20  n or the host.  
c610: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
c620: 61 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 62 65  arameter name be
c630: 67 69 6e 73 20 77 69 74 68 20 22 40 22 2e 20 2a  gins with "@". *
c640: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
c650: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79  data = Tcl_GetBy
c660: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70  teArrayFromObj(p
c670: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
c680: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c690: 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
c6a0: 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c   i, data, n, SQL
c6b0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
c6c0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
c6d0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72  ncrRefCount(pVar
c6e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
c6f0: 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d   apParm[nParm++]
c700: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
c710: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
c720: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
c730: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
c740: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
c750: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
c760: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
c770: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
c780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
c790: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
c7a0: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26  (interp, pVar, &
c7b0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
c7c0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
c7d0: 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b  nt(pStmt, i, n);
c7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
c7f0: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
c800: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
c810: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
c820: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
c830: 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  le r;.          
c840: 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c      Tcl_GetDoubl
c850: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
c860: 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20   pVar, &r);.    
c870: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c880: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
c890: 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20  tmt, i, r);.    
c8a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c8b0: 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63  ( c=='w' && strc
c8c0: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
c8d0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
c8e0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65          Tcl_Wide
c8f0: 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20  Int v;.         
c900: 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65       Tcl_GetWide
c910: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
c920: 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20  p, pVar, &v);.  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c940: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
c950: 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20  Stmt, i, v);.   
c960: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
c980: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
c990: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
c9a0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
c9b0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
c9c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
c9d0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20  _text(pStmt, i, 
c9e0: 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c  (char *)data, n,
c9f0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
ca00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
ca10: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
ca20: 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pVar);.         
ca30: 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72       apParm[nPar
ca40: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
ca50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ca60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ca70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ca80: 62 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74  bind_null( pStmt
ca90: 2c 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20 20  , i );.         
caa0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
cab0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
cac0: 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  ompute column na
cad0: 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f  mes */.      nCo
cae0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
caf0: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
cb00: 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69  .      if( pScri
cb10: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  pt ){.        ap
cb20: 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f  ColName = (Tcl_O
cb30: 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  bj**)Tcl_Alloc( 
cb40: 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29  sizeof(Tcl_Obj*)
cb50: 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  *nCol );.       
cb60: 20 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d 3d   if( apColName==
cb70: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
cb80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
cb90: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
cba0: 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d      apColName[i]
cbb0: 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73   = dbTextToObj(s
cbc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
cbd0: 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  me(pStmt,i));.  
cbe0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
cbf0: 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61  RefCount(apColNa
cc00: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  me[i]);.        
cc10: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
cc20: 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61   /* If results a
cc30: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20  re being stored 
cc40: 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  in an array vari
cc50: 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74  able, then creat
cc60: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 61  e.      ** the a
cc70: 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f  rray(*) entry fo
cc80: 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20  r that array.   
cc90: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
cca0: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
ccb0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c    Tcl_Obj *pColL
ccc0: 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ist = Tcl_NewObj
ccd0: 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ();.        Tcl_
cce0: 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c  Obj *pStar = Tcl
ccf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a  _NewStringObj("*
cd00: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ", -1);.        
cd10: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
cd20: 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20  (pColList);.    
cd30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
cd40: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cd50: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
cd60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
cd70: 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20  terp, pColList, 
cd80: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
cd90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cda0: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
cdb0: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
cdc0: 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c  pStar, pColList,
cdd0: 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  0);.        Tcl_
cde0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f  DecrRefCount(pCo
cdf0: 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  lList);.        
ce00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
ce10: 28 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20 7d  (pStar);.      }
ce20: 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63 75  ..      /* Execu
ce30: 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20  te the SQL.     
ce40: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
ce50: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70   rc==TCL_OK && p
ce60: 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 52  Stmt && SQLITE_R
ce70: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
ce80: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
ce90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
cea0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ceb0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
cec0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  l;.          .  
ced0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70          /* Set p
cee0: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
cef0: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
cf00: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
cf10: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
cf20: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
cf30: 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20 29  type(pStmt, i) )
cf40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
cf50: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
cf60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
cf70: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
cf80: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
cf90: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
cfa0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
cfb0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
cfc0: 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  yObj(sqlite3_col
cfd0: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
cfe0: 69 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  i), bytes);.    
cff0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d010: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
d020: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
d030: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d040: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
d050: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d060: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b  int64(pStmt, i);
d070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
d080: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
d090: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
d0a0: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
d0b0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
d0c0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  _NewIntObj(v);. 
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
d0e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
d0f0: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
d100: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
d110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
d120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
d130: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
d140: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
d150: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
d160: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
d170: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
d180: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
d190: 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ble(pStmt, i);. 
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
d1b0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  l = Tcl_NewDoubl
d1c0: 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20  eObj(r);.       
d1d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d1e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d1f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
d200: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
d210: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
d220: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62   dbTextToObj(pDb
d230: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ->zNull);.      
d240: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d250: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d260: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
d270: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
d280: 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54    pVal = dbTextT
d290: 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  oObj((char *)sql
d2a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
d2b0: 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20  (pStmt, i));.   
d2c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
d2d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
d2e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
d2f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
d300: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
d310: 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d      if( pArray==
d320: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
d330: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
d340: 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e  2(interp, apColN
d350: 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c  ame[i], 0, pVal,
d360: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
d370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d380: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
d390: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72  Var2(interp, pAr
d3a0: 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  ray, apColName[i
d3b0: 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  ], pVal, 0);.   
d3c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d3d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
d3e0: 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c  hoice==DB_ONECOL
d3f0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
d400: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d     assert( pRet=
d410: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
d420: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
d430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
d440: 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20  Ret = pVal;.    
d450: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
d460: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
d470: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
d480: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
d490: 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20   TCL_BREAK;.    
d4a0: 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c          i = nCol
d4b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
d4c0: 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42  e if( choice==DB
d4d0: 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20  _EXISTS ){.     
d4e0: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
d4f0: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
d500: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20             pRet 
d510: 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  = Tcl_NewBoolean
d520: 4f 62 6a 28 31 29 3b 0a 20 20 20 20 20 20 20 20  Obj(1);.        
d530: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
d540: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
d550: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
d560: 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20  _BREAK;.        
d570: 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20      i = nCol;.  
d580: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d590: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c             Tcl_L
d5a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
d5b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
d5c0: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , pVal);.       
d5d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
d5e0: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53   .        if( pS
d5f0: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
d600: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
d610: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
d620: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 20  cript, 0);.     
d630: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
d640: 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20 20  _CONTINUE ){.   
d650: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
d660: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  L_OK;.          
d670: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
d680: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
d690: 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
d6a0: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
d6b0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  OK;.      }..   
d6c0: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63     /* Free the c
d6d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65 63  olumn name objec
d6e0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
d6f0: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
d700: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
d710: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
d720: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
d730: 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69  ount(apColName[i
d740: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
d750: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
d760: 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29  char*)apColName)
d770: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d780: 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75   /* Free the bou
d790: 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c  nd string and bl
d7a0: 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ob parameters */
d7b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
d7c0: 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nParm; i++){. 
d7d0: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
d7e0: 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69  efCount(apParm[i
d7f0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
d800: 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61 50    if( apParm!=aP
d810: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 54  arm ){.        T
d820: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61  cl_Free((char*)a
d830: 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  pParm);.      }.
d840: 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20  .      /* Reset 
d850: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
d860: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  If the result co
d870: 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43 48  de is SQLITE_SCH
d880: 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  EMA, then.      
d890: 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74 61  ** flush the sta
d8a0: 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e 64  tement cache and
d8b0: 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d 65   try the stateme
d8c0: 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20  nt again..      
d8d0: 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73  */.      rc2 = s
d8e0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
d8f0: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  mt);.      if( S
d900: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 72 63  QLITE_SCHEMA==rc
d910: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
d920: 41 66 74 65 72 20 61 20 73 63 68 65 6d 61 20 63  After a schema c
d930: 68 61 6e 67 65 2c 20 66 6c 75 73 68 20 74 68 65  hange, flush the
d940: 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20 74   cache and try t
d950: 6f 20 72 75 6e 20 74 68 65 0a 20 20 20 20 20 20  o run the.      
d960: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61    ** statement a
d970: 67 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  gain.        */.
d980: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
d990: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
d9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
d9b0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
d9c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
d9d0: 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28  Stmt ) Tcl_Free(
d9e0: 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29  (char*)pPreStmt)
d9f0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
da00: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ue;.      }else 
da10: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
da20: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  c2 ){.        /*
da30: 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65   If a run-time e
da40: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70  rror occurs, rep
da50: 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e  ort the error an
da60: 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20  d stop reading. 
da70: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
da80: 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  L.        */.   
da90: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
daa0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
dab0: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
dac0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
dad0: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  )));.        sql
dae0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
daf0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  tmt);.        rc
db00: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
db10: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
db20: 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63  mt ) Tcl_Free((c
db30: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  har*)pPreStmt);.
db40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
db50: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
db60: 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 29  Db->maxStmt<=0 )
db70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
db80: 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72  the cache is tur
db90: 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63  ned off, dealloc
dba0: 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65  ated the stateme
dbb0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  nt */.        if
dbc0: 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c  ( pPreStmt ) Tcl
dbd0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72  _Free((char*)pPr
dbe0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  eStmt);.        
dbf0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
dc00: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d  (pStmt);.      }
dc10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
dc20: 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   Everything work
dc30: 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
dc40: 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c 2e   is operational.
dc50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65 61  .        ** Crea
dc60: 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70  te a new SqlPrep
dc70: 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75  aredStmt structu
dc80: 72 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f 6e  re if we need on
dc90: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 49  e..        ** (I
dca0: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
dcb0: 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75 73  e one we can jus
dcc0: 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20 20  t reuse it.).   
dcd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
dce0: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
dcf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
dd00: 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c 3b   = zLeft - zSql;
dd10: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
dd20: 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72  tmt = (SqlPrepar
dd30: 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f  edStmt*)Tcl_Allo
dd40: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65 53  c( sizeof(*pPreS
dd50: 74 6d 74 29 20 2b 20 6c 65 6e 20 29 3b 0a 20 20  tmt) + len );.  
dd60: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
dd70: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
dd80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
dd90: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
dda0: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
ddb0: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
ddc0: 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20  t->nSql = len;. 
ddd0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
dde0: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
ddf0: 7a 53 71 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  zSql, len);.    
de00: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
de10: 7a 53 71 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20  zSql[len] = 0;. 
de20: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
de30: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
de40: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
de50: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
de60: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
de70: 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  st.        */.  
de80: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
de90: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
dea0: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70  tList;.        p
deb0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d  PreStmt->pPrev =
dec0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
ded0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
dee0: 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  .         pDb->s
def0: 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  tmtList->pPrev =
df00: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
df10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
df20: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
df30: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  eStmt;.        i
df40: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
df50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
df60: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
df70: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
df80: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
df90: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
dfa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dfb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
dfc0: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
dfd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dfe0: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20   pDb->nStmt++;. 
dff0: 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66    .        /* If
e000: 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e   we have too man
e010: 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63  y statement in c
e020: 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65  ache, remove the
e030: 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74 68   surplus from th
e040: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 64  e.        ** end
e050: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
e060: 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  st..        */. 
e070: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 44         while( pD
e080: 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61  b->nStmt>pDb->ma
e090: 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  xStmt ){.       
e0a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
e0b0: 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ize(pDb->stmtLas
e0c0: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
e0d0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
e0e0: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61  st = pDb->stmtLa
e0f0: 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  st->pPrev;.     
e100: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
e110: 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61  har*)pDb->stmtLa
e120: 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20  st->pNext);.    
e130: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
e140: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
e150: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
e160: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
e170: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e180: 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20 74   /* Proceed to t
e190: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
e1a0: 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20  t */.      zSql 
e1b0: 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20  = zLeft;.    }. 
e1c0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
e1d0: 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20  unt(objv[2]);.. 
e1e0: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
e1f0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
e200: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
e210: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
e220: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
e230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
e240: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
e250: 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  et);.    }else i
e260: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
e270: 0a 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74  .      Tcl_Reset
e280: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
e290: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
e2a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
e2b0: 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e      $db function
e2c0: 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a   NAME SCRIPT.  *
e2d0: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
e2e0: 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  new SQL function
e2f0: 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57   called NAME.  W
e300: 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e  henever that fun
e310: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61  ction is.  ** ca
e320: 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52  lled, invoke SCR
e330: 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20  IPT to evaluate 
e340: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  the function..  
e350: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e  */.  case DB_FUN
e360: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c  CTION: {.    Sql
e370: 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20  Func *pFunc;.   
e380: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
e390: 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  t;.    char *zNa
e3a0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  me;.    if( objc
e3b0: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
e3c0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e3d0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
e3e0: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
e3f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
e400: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
e410: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
e420: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
e430: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70  jv[2], 0);.    p
e440: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
e450: 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69  ;.    pFunc = fi
e460: 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a  ndSqlFunc(pDb, z
e470: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
e480: 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  Func==0 ) return
e490: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e4a0: 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69  if( pFunc->pScri
e4b0: 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  pt ){.      Tcl_
e4c0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75  DecrRefCount(pFu
e4d0: 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  nc->pScript);.  
e4e0: 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70    }.    pFunc->p
e4f0: 53 63 72 69 70 74 20 3d 20 70 53 63 72 69 70 74  Script = pScript
e500: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
e510: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
e520: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45  .    pFunc->useE
e530: 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f  valObjv = safeTo
e540: 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65  UseEvalObjv(inte
e550: 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20  rp, pScript);.  
e560: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
e570: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
e580: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  Db->db, zName, -
e590: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  1, SQLITE_UTF8,.
e5a0: 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74          pFunc, t
e5b0: 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  clSqlFunc, 0, 0)
e5c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e5d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e5e0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
e5f0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
e600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
e610: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
e620: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
e630: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
e640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
e650: 20 4d 75 73 74 20 66 6c 75 73 68 20 61 6e 79 20   Must flush any 
e660: 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
e670: 73 20 2a 2f 0a 20 20 20 20 20 20 66 6c 75 73 68  s */.      flush
e680: 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
e690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
e6a0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
e6b0: 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c  *     $db incrbl
e6c0: 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  ob ?-readonly? ?
e6d0: 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
e6e0: 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61   ROWID.  */.  ca
e6f0: 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20  se DB_INCRBLOB: 
e700: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e710: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
e720: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e730: 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72  lt(interp, "incr
e740: 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62  blob not availab
e750: 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
e760: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
e770: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
e780: 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61  se.    int isRea
e790: 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63  donly = 0;.    c
e7a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
e7b0: 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e   "main";.    con
e7c0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b  st char *zTable;
e7d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e7e0: 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  *zColumn;.    sq
e7f0: 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 3b  lite_int64 iRow;
e800: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
e810: 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79  or the -readonly
e820: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69   option */.    i
e830: 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72  f( objc>3 && str
e840: 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  cmp(Tcl_GetStrin
e850: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65  g(objv[2]), "-re
e860: 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20  adonly")==0 ){. 
e870: 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
e880: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
e890: 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52  if( objc!=(5+isR
e8a0: 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63  eadonly) && objc
e8b0: 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  !=(6+isReadonly)
e8c0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
e8d0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e8e0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72  p, 2, objv, "?-r
e8f0: 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41  eadonly? ?DB? TA
e900: 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44  BLE COLUMN ROWID
e910: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
e920: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e930: 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  }..    if( objc=
e940: 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20  =(6+isReadonly) 
e950: 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54  ){.      zDb = T
e960: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e970: 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  v[2]);.    }.   
e980: 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
e990: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
e9a0: 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75  c-3]);.    zColu
e9b0: 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  mn = Tcl_GetStri
e9c0: 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29  ng(objv[objc-2])
e9d0: 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47  ;.    rc = Tcl_G
e9e0: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
e9f0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62  (interp, objv[ob
ea00: 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a  jc-1], &iRow);..
ea10: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
ea20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
ea30: 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43   createIncrblobC
ea40: 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20  hannel(.        
ea50: 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a    interp, pDb, z
ea60: 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c  Db, zTable, zCol
ea70: 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65 61  umn, iRow, isRea
ea80: 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20  donly.      );. 
ea90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
eaa0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
eab0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
eac0: 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a  terrupt.  **.  *
ead0: 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65 20  * Interrupt the 
eae0: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
eaf0: 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20   inner-most SQL 
eb00: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
eb10: 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74  is.  ** causes t
eb20: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
eb30: 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
eb40: 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e  ror of SQLITE_IN
eb50: 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20  TERRUPT..  */.  
eb60: 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50  case DB_INTERRUP
eb70: 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T: {.    sqlite3
eb80: 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e  _interrupt(pDb->
eb90: 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  db);.    break;.
eba0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
ebb0: 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
ebc0: 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
ebd0: 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
ebe0: 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
ebf0: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
ec00: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
ec10: 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
ec20: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
ec30: 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
ec40: 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
ec50: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
ec60: 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
ec70: 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
ec80: 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
ec90: 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
eca0: 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
ecb0: 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
ecc0: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
ecd0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
ece0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ecf0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
ed00: 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
ed10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ed20: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
ed30: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
ed40: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
ed50: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
ed60: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ed70: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
ed80: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
ed90: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
eda0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
edb0: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
edc0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
edd0: 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
ede0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
edf0: 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
ee00: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
ee10: 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a    strncpy(pDb->z
ee20: 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e  Null, zNull, len
ee30: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
ee40: 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30  zNull[len] = '\0
ee50: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ';.      }else{.
ee60: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
ee70: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
ee80: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
ee90: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
eea0: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70  p, dbTextToObj(p
eeb0: 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20  Db->zNull));.   
eec0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
eed0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c  *.  **     $db l
eee0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
eef0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75   .  **.  ** Retu
ef00: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
ef10: 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44  ich is the ROWID
ef20: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
ef30: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a  cent insert..  *
ef40: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54  /.  case DB_LAST
ef50: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b  _INSERT_ROWID: {
ef60: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
ef70: 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57  esult;.    Tcl_W
ef80: 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20  ideInt rowid;.  
ef90: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
efa0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
efb0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
efc0: 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
efd0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
efe0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
eff0: 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
f000: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
f010: 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  d(pDb->db);.    
f020: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
f030: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
f040: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57  p);.    Tcl_SetW
f050: 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  ideIntObj(pResul
f060: 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62  t, rowid);.    b
f070: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
f080: 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43    ** The DB_ONEC
f090: 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20  OLUMN method is 
f0a0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65  implemented toge
f0b0: 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 56 41  ther with DB_EVA
f0c0: 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20  L..  */..  /*   
f0d0: 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e   $db progress ?N
f0e0: 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20   CALLBACK?.  ** 
f0f0: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
f100: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
f110: 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20  every N virtual 
f120: 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20  machine opcodes 
f130: 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a  while executing.
f140: 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
f150: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
f160: 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28  GRESS: {.    if(
f170: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
f180: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
f190: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
f1a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f1b0: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  (interp, pDb->zP
f1c0: 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20  rogress, 0);.   
f1d0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
f1e0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
f1f0: 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72      char *zProgr
f200: 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ess;.      int l
f210: 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b  en;.      int N;
f220: 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  .      if( TCL_O
f230: 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
f240: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
f250: 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 09 72 65  v[2], &N) ){..re
f260: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f270: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
f280: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
f290: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  s ){.        Tcl
f2a0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67  _Free(pDb->zProg
f2b0: 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ress);.      }. 
f2c0: 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d       zProgress =
f2d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f2e0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
f2f0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
f300: 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e  zProgress && len
f310: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
f320: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54  b->zProgress = T
f330: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
f340: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
f350: 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65  cpy(pDb->zProgre
f360: 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c  ss, zProgress, l
f370: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
f380: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
f390: 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >zProgress = 0;.
f3a0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
f3b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
f3c0: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20  RESS_CALLBACK.  
f3d0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
f3e0: 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
f3f0: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
f400: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
f410: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
f420: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
f430: 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48  , N, DbProgressH
f440: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
f450: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f460: 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72     sqlite3_progr
f470: 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  ess_handler(pDb-
f480: 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  >db, 0, 0, 0);. 
f490: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
f4a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
f4b0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f4c0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
f4d0: 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a   "N CALLBACK");.
f4e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f4f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f500: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
f510: 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c  /*    $db profil
f520: 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  e ?CALLBACK?.  *
f530: 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61  *.  ** Make arra
f540: 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f  ngements to invo
f550: 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20  ke the CALLBACK 
f560: 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65 61  routine after ea
f570: 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
f580: 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72  .  ** that has r
f590: 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66  un.  The text of
f5a0: 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65   the SQL and the
f5b0: 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73   amount of elaps
f5c0: 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20  e time are.  ** 
f5d0: 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c  appended to CALL
f5e0: 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20  BACK before the 
f5f0: 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20  script is run.. 
f600: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
f610: 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28  OFILE: {.    if(
f620: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
f630: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f640: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
f650: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
f660: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
f670: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
f680: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
f690: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
f6a0: 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
f6b0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
f6c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
f6d0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29  Db->zProfile, 0)
f6e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
f6f0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
f700: 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20  *zProfile;.     
f710: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
f720: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
f730: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
f740: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66  _Free(pDb->zProf
f750: 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ile);.      }.  
f760: 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54      zProfile = T
f770: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
f780: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
f790: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  n);.      if( zP
f7a0: 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20  rofile && len>0 
f7b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
f7c0: 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41  zProfile = Tcl_A
f7d0: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
f7e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
f7f0: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a  pDb->zProfile, z
f800: 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b  Profile, len+1);
f810: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f820: 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66        pDb->zProf
f830: 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ile = 0;.      }
f840: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f850: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20  OMIT_TRACE.     
f860: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
f870: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  le ){.        pD
f880: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
f890: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
f8a0: 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d  te3_profile(pDb-
f8b0: 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48 61  >db, DbProfileHa
f8c0: 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
f8d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f8e0: 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
f8f0: 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  e(pDb->db, 0, 0)
f900: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
f910: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
f920: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
f930: 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b       $db rekey K
f940: 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  EY.  **.  ** Cha
f950: 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74 69  nge the encrypti
f960: 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75  on key on the cu
f970: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74  rrently open dat
f980: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
f990: 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20  se DB_REKEY: {. 
f9a0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
f9b0: 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20   void *pKey;.   
f9c0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
f9d0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f9e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f9f0: 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a  , objv, "KEY");.
fa00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
fa10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
fa20: 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
fa30: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
fa40: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29  (objv[2], &nKey)
fa50: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fa60: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72 63  HAS_CODEC.    rc
fa70: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79   = sqlite3_rekey
fa80: 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  (pDb->db, pKey, 
fa90: 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72  nKey);.    if( r
faa0: 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
fab0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fac0: 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  rp, sqlite3ErrSt
fad0: 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20  r(rc), 0);.     
fae0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
faf0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
fb00: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
fb10: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
fb20: 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43  timeout MILLESEC
fb30: 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ONDS.  **.  ** D
fb40: 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d  elay for the num
fb50: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
fb60: 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68  nds specified wh
fb70: 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63  en a file is loc
fb80: 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ked..  */.  case
fb90: 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20   DB_TIMEOUT: {. 
fba0: 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69     int ms;.    i
fbb0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
fbc0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
fbd0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
fbe0: 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f  objv, "MILLISECO
fbf0: 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74  NDS");.      ret
fc00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fc10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
fc20: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
fc30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
fc40: 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  &ms) ) return TC
fc50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  L_ERROR;.    sql
fc60: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
fc70: 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a  t(pDb->db, ms);.
fc80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
fc90: 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20   .  /*.  **     
fca0: 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  $db total_change
fcb0: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  s.  **.  ** Retu
fcc0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
fcd0: 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
fce0: 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74  modified, insert
fcf0: 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a  ed, or deleted .
fd00: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64    ** since the d
fd10: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
fd20: 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  as created..  */
fd30: 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c  .  case DB_TOTAL
fd40: 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
fd50: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
fd60: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
fd70: 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
fd80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
fd90: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
fda0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
fdb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fdc0: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
fdd0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
fde0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
fdf0: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
fe00: 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  t, sqlite3_total
fe10: 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
fe20: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
fe30: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
fe40: 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
fe50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
fe60: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
fe70: 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
fe80: 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
fe90: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
fea0: 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
feb0: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
fec0: 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
fed0: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
fee0: 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
fef0: 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
ff00: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
ff10: 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
ff20: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
ff30: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
ff40: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
ff50: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
ff60: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
ff70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ff80: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
ff90: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
ffa0: 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
ffb0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ffc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
ffd0: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a  Db->zTrace, 0);.
ffe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
fff0: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
10000 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74  Trace;.      int
10010 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
10020 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
10030 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
10040 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
10050 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61      }.      zTra
10060 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ce = Tcl_GetStri
10070 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
10080 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
10090 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65  if( zTrace && le
100a0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
100b0 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c  Db->zTrace = Tcl
100c0 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
100d0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
100e0 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a  y(pDb->zTrace, z
100f0 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20  Trace, len+1);. 
10100 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10110 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
10120 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
10130 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10140 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28  _TRACE.      if(
10150 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
10160 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
10170 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
10180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
10190 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54  ace(pDb->db, DbT
101a0 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  raceHandler, pDb
101b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
101c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
101d0 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30  trace(pDb->db, 0
101e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
101f0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
10200 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
10210 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
10220 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
10230 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
10240 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  ive] SCRIPT.  **
10250 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  .  ** Start a ne
10260 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  w transaction (i
10270 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
10280 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73  eady in the mids
10290 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e  t of a.  ** tran
102a0 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65  saction) and exe
102b0 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72  cute the TCL scr
102c0 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74  ipt SCRIPT.  Aft
102d0 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63  er SCRIPT.  ** c
102e0 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72  ompletes, either
102f0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
10300 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20  saction or roll 
10310 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50  it back if SCRIP
10320 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e  T.  ** throws an
10330 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20   exception.  Or 
10340 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61  if no new transa
10350 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
10360 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
10370 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65  ** pass the exce
10380 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20  ption on up the 
10390 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
103a0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61   This command wa
103b0 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61  s inspired by Da
103c0 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b  ve Thomas's talk
103d0 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a   on Ruby at the.
103e0 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c    ** 2005 O'Reil
103f0 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43  ly Open Source C
10400 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e  onvention (OSCON
10410 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
10420 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b  B_TRANSACTION: {
10430 0a 20 20 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  .    int inTrans
10440 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
10450 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73  Script;.    cons
10460 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d  t char *zBegin =
10470 20 22 42 45 47 49 4e 22 3b 0a 20 20 20 20 69 66   "BEGIN";.    if
10480 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
10490 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
104a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
104b0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
104c0 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54 22 29  "[TYPE] SCRIPT")
104d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
104e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
104f0 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
10500 29 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  ){.      pScript
10510 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20   = objv[2];.    
10520 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73  } else {.      s
10530 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
10540 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d   *TTYPE_strs[] =
10550 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65   {.        "defe
10560 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73  rred",   "exclus
10570 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74  ive",  "immediat
10580 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20  e", 0.      };. 
10590 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f       enum TTYPE_
105a0 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54  enum {.        T
105b0 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54  TYPE_DEFERRED, T
105c0 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  TYPE_EXCLUSIVE, 
105d0 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a  TTYPE_IMMEDIATE.
105e0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
105f0 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20  nt ttype;.      
10600 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
10610 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
10620 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73  objv[2], TTYPE_s
10630 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f  trs, "transactio
10640 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20  n type",.       
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65         0, &ttype
10670 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10680 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69       }.      swi
106a0 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45  tch( (enum TTYPE
106b0 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20  _enum)ttype ){. 
106c0 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
106d0 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f  E_DEFERRED:    /
106e0 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20  * no-op */;     
106f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
10700 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
10710 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a  TTYPE_EXCLUSIVE:
10720 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47     zBegin = "BEG
10730 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20  IN EXCLUSIVE";  
10740 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
10750 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49  ase TTYPE_IMMEDI
10760 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20  ATE:   zBegin = 
10770 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45  "BEGIN IMMEDIATE
10780 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
10790 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
107a0 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
107b0 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20  }.    inTrans = 
107c0 21 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74  !sqlite3_get_aut
107d0 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64 62 29  ocommit(pDb->db)
107e0 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61  ;.    if( !inTra
107f0 6e 73 20 29 7b 0a 20 20 20 20 20 20 28 76 6f 69  ns ){.      (voi
10800 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
10810 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20  Db->db, zBegin, 
10820 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
10830 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
10840 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
10850 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
10860 69 66 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a  if( !inTrans ){.
10870 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
10880 20 2a 7a 45 6e 64 3b 0a 20 20 20 20 20 20 69 66   *zEnd;.      if
10890 28 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 20  ( rc==TCL_ERROR 
108a0 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20  ){.        zEnd 
108b0 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
108c0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
108d0 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 43 4f 4d       zEnd = "COM
108e0 4d 49 54 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  MIT";.      }.  
108f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
10900 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45  exec(pDb->db, zE
10910 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a  nd, 0, 0, 0) ){.
10920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10930 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52  exec(pDb->db, "R
10940 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20  OLLBACK", 0, 0, 
10950 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
10960 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
10970 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
10980 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f  db update_hook ?
10990 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20  script?.  **    
109a0 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  $db rollback_hoo
109b0 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a  k ?script?.  */.
109c0 20 20 63 61 73 65 20 44 42 5f 55 50 44 41 54 45    case DB_UPDATE
109d0 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44  _HOOK: .  case D
109e0 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a  B_ROLLBACK_HOOK:
109f0 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 70   {..    /* set p
10a00 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61  pHook to point a
10a10 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72  t pUpdateHook or
10a20 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20   pRollbackHook, 
10a30 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20  depending on .  
10a40 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64    ** whether [$d
10a50 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f  b update_hook] o
10a60 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f  r [$db rollback_
10a70 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65  hook] was invoke
10a80 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  d..    */.    Tc
10a90 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20  l_Obj **ppHook; 
10aa0 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
10ab0 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20  =DB_UPDATE_HOOK 
10ac0 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20  ){.      ppHook 
10ad0 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48  = &pDb->pUpdateH
10ae0 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ook;.    }else{.
10af0 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26        ppHook = &
10b00 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
10b10 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ok;.    }..    i
10b20 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
10b30 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
10b40 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10b50 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
10b60 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  , "?SCRIPT?");. 
10b70 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10b80 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10b90 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b    if( *ppHook ){
10ba0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
10bb0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10bc0 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
10bd0 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
10be0 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
10bf0 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
10c00 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f  ;.        *ppHoo
10c10 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 0;.      }. 
10c20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
10c30 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 61 73  c==3 ){.      as
10c40 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29  sert( !(*ppHook)
10c50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   );.      if( Tc
10c60 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28  l_GetCharLength(
10c70 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20  objv[2])>0 ){.  
10c80 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20        *ppHook = 
10c90 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  objv[2];.       
10ca0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
10cb0 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
10cc0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
10cd0 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f  qlite3_update_ho
10ce0 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70 44 62  ok(pDb->db, (pDb
10cf0 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62  ->pUpdateHook?Db
10d00 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29  UpdateHandler:0)
10d10 2c 20 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , pDb);.    sqli
10d20 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  te3_rollback_hoo
10d30 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e  k(pDb->db,(pDb->
10d40 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62  pRollbackHook?Db
10d50 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a  RollbackHandler:
10d60 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62 72  0),pDb);..    br
10d70 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
10d80 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20    $db version.  
10d90 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
10da0 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  he version strin
10db0 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  g for this datab
10dc0 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
10dd0 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20   DB_VERSION: {. 
10de0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
10df0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
10e00 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  )sqlite3_libvers
10e10 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49  ion(), TCL_STATI
10e20 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  C);.    break;. 
10e30 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20   }...  } /* End 
10e40 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74  of the SWITCH st
10e50 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74  atement */.  ret
10e60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10e70 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d     sqlite3 DBNAM
10e80 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45  E FILENAME ?MODE
10e90 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a  ? ?-key KEY?.**.
10ea0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d  ** This is the m
10eb0 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e  ain Tcl command.
10ec0 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69    When the "sqli
10ed0 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  te" Tcl command 
10ee0 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74  is.** invoked, t
10ef0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
10f00 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74   to process that
10f10 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
10f20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
10f30 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61  nt, DBNAME, is a
10f40 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65  n arbitrary name
10f50 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61   for a new.** da
10f60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10f70 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  n.  This command
10f80 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63   creates a new c
10f90 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20  ommand named.** 
10fa0 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75  DBNAME that is u
10fb0 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  sed to control t
10fc0 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  hat connection. 
10fd0 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   The database.**
10fe0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64   connection is d
10ff0 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
11000 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69  DBNAME command i
11010 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
11020 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
11030 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
11040 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
11050 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  y that contains.
11060 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 20 64 61  ** the sqlite da
11070 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 74  tabase that is t
11080 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 0a 2a  o be accessed..*
11090 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67  *.** For testing
110a0 20 70 75 72 70 6f 73 65 73 2c 20 77 65 20 61 6c   purposes, we al
110b0 73 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20 66  so support the f
110c0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
110d0 20 73 71 6c 69 74 65 33 20 2d 65 6e 63 6f 64 69   sqlite3 -encodi
110e0 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52  ng.**.**       R
110f0 65 74 75 72 6e 20 74 68 65 20 65 6e 63 6f 64 69  eturn the encodi
11100 6e 67 20 75 73 65 64 20 62 79 20 4c 49 4b 45 20  ng used by LIKE 
11110 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f  and GLOB operato
11120 72 73 2e 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20  rs.  Choices.** 
11130 20 20 20 20 20 20 61 72 65 20 55 54 46 2d 38 20        are UTF-8 
11140 61 6e 64 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a  and iso8859..**.
11150 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 76 65 72  **  sqlite3 -ver
11160 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  sion.**.**      
11170 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73   Return the vers
11180 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  ion number of th
11190 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
111a0 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33  ..**.**  sqlite3
111b0 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a   -tcl-uses-utf.*
111c0 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72  *.**       Retur
111d0 6e 20 22 31 22 20 69 66 20 63 6f 6d 70 69 6c 65  n "1" if compile
111e0 64 20 77 69 74 68 20 61 20 54 63 6c 20 75 73 65  d with a Tcl use
111f0 73 20 55 54 46 2d 38 2e 20 20 52 65 74 75 72 6e  s UTF-8.  Return
11200 20 22 30 22 20 69 66 0a 2a 2a 20 20 20 20 20 20   "0" if.**      
11210 20 6e 6f 74 2e 20 20 55 73 65 64 20 62 79 20 74   not.  Used by t
11220 65 73 74 73 20 74 6f 20 6d 61 6b 65 20 73 75 72  ests to make sur
11230 65 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  e the library wa
11240 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20  s compiled .**  
11250 20 20 20 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a       correctly..
11260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
11270 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54  Main(void *cd, T
11280 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11290 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f  p, int objc,Tcl_
112a0 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29  Obj *const*objv)
112b0 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b  {.  SqliteDb *p;
112c0 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20  .  void *pKey = 
112d0 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  0;.  int nKey = 
112e0 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
112f0 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a  *zArg;.  char *z
11300 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e 73 74 20  ErrMsg;.  const 
11310 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 54  char *zFile;.  T
11320 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61 6e 73  cl_DString trans
11330 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a 20  latedFilename;. 
11340 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
11350 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47      zArg = Tcl_G
11360 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
11370 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  objv[1], 0);.   
11380 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
11390 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20  ,"-version")==0 
113a0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
113b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
113c0 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e  ,sqlite3_version
113d0 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ,0);.      retur
113e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
113f0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
11400 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22  Arg,"-has-codec"
11410 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )==0 ){.#ifdef S
11420 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
11430 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
11440 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31  Result(interp,"1
11450 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ",0);.#else.    
11460 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11470 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29  lt(interp,"0",0)
11480 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
11490 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
114a0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
114b0 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d 75 73  mp(zArg,"-tcl-us
114c0 65 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b 0a 23  es-utf")==0 ){.#
114d0 69 66 64 65 66 20 54 43 4c 5f 55 54 46 5f 4d 41  ifdef TCL_UTF_MA
114e0 58 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  X.      Tcl_Appe
114f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11500 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20  "1",0);.#else.  
11510 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11520 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c  sult(interp,"0",
11530 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
11540 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11560 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d  objc==5 || objc=
11570 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  =6 ){.    zArg =
11580 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11590 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d  omObj(objv[objc-
115a0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  2], 0);.    if( 
115b0 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65  strcmp(zArg,"-ke
115c0 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
115d0 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
115e0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
115f0 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b  bjv[objc-1], &nK
11600 65 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a 63 20  ey);.      objc 
11610 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  -= 2;.    }.  }.
11620 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
11630 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
11640 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11650 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11660 2c 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  , .#ifdef SQLITE
11670 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
11680 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d   "HANDLE FILENAM
11690 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d 4b 45  E ?-key CODEC-KE
116a0 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  Y?".#else.      
116b0 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
116c0 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69 66 0a   ?MODE?".#endif.
116d0 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72      );.    retur
116e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
116f0 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  .  zErrMsg = 0;.
11700 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a    p = (SqliteDb*
11710 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
11720 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
11730 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  p==0 ){.    Tcl_
11740 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
11750 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  , "malloc failed
11760 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ", TCL_STATIC);.
11770 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11780 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  RROR;.  }.  mems
11790 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
117a0 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  *p));.  zFile = 
117b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
117c0 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
117d0 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
117e0 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d  TranslateFileNam
117f0 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c  e(interp, zFile,
11800 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65   &translatedFile
11810 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  name);.  sqlite3
11820 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 26 70 2d  _open(zFile, &p-
11830 3e 64 62 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  >db);.  Tcl_DStr
11840 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61  ingFree(&transla
11850 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  tedFilename);.  
11860 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
11870 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
11880 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72  ->db) ){.    zEr
11890 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
118a0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
118b0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
118c0 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b));.    sqlite3
118d0 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
118e0 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
118f0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
11900 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
11910 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
11920 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64  Key, nKey);.#end
11930 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
11940 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
11950 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
11960 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
11970 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
11980 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
11990 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
119a0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
119b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
119c0 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74    }.  p->maxStmt
119d0 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f   = NUM_PREPARED_
119e0 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65  STMTS;.  p->inte
119f0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a  rp = interp;.  z
11a00 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
11a10 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
11a20 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  1], 0);.  Tcl_Cr
11a30 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
11a40 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f  nterp, zArg, DbO
11a50 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c  bjCmd, (char*)p,
11a60 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 0a   DbDeleteCmd);..
11a70 20 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64    /* If compiled
11a80 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
11a90 54 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65  T turned on, the
11aa0 6e 20 72 65 67 69 73 74 65 72 20 74 68 65 20 22  n register the "
11ab0 6d 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c  md5sum".  ** SQL
11ac0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
11ad0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
11ae0 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
11af0 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73  n void Md5_Regis
11b00 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23  ter(sqlite3*);.#
11b10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
11b20 44 45 42 55 47 0a 20 20 20 20 69 6e 74 20 6d 61  DEBUG.    int ma
11b30 6c 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c 69 74  llocfail = sqlit
11b40 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 0a  e3_iMallocFail;.
11b50 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
11b60 6c 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e  locFail = 0;.#en
11b70 64 69 66 0a 20 20 20 20 4d 64 35 5f 52 65 67 69  dif.    Md5_Regi
11b80 73 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23 69 66  ster(p->db);.#if
11b90 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  def SQLITE_MEMDE
11ba0 42 55 47 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  BUG.    sqlite3_
11bb0 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6d 61  iMallocFail = ma
11bc0 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64 69 66  llocfail;.#endif
11bd0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a 20 20  .  }.#endif  .  
11be0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11bf0 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
11c00 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74  a dummy Tcl_Init
11c10 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20  Stubs if we are 
11c20 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20  using this as a 
11c30 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72  static.** librar
11c40 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53  y..*/.#ifndef US
11c50 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e  E_TCL_STUBS.# un
11c60 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75  def  Tcl_InitStu
11c70 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f  bs.# define Tcl_
11c80 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29  InitStubs(a,b,c)
11c90 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
11ca0 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
11cb0 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49   a PACKAGE_VERSI
11cc0 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  ON macro defined
11cd0 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a  .  This will be.
11ce0 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d  ** defined autom
11cf0 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20  atically by the 
11d00 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42  TEA makefile.  B
11d10 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c  ut other makefil
11d20 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66  es.** do not def
11d30 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ine it..*/.#ifnd
11d40 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ef PACKAGE_VERSI
11d50 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b  ON.# define PACK
11d60 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49  AGE_VERSION SQLI
11d70 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69  TE_VERSION.#endi
11d80 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  f../*.** Initial
11d90 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
11da0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20  .**.** This Tcl 
11db0 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20  module contains 
11dc0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65  only a single ne
11dd0 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61  w Tcl command na
11de0 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a  med "sqlite"..**
11df0 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69 73   (Hence there is
11e00 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20   no namespace.  
11e10 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  There is no poin
11e20 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d  t in using a nam
11e30 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65  espace.** if the
11e40 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20   extension only 
11e50 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77  supplies one new
11e60 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73 71   name!)  The "sq
11e70 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73  lite" command is
11e80 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  .** used to open
11e90 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61   a new SQLite da
11ea0 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68 65  tabase.  See the
11eb0 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e   DbMain() routin
11ec0 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61  e above.** for a
11ed0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
11ee0 61 74 69 6f 6e 2e 0a 2a 2f 0a 45 58 54 45 52 4e  ation..*/.EXTERN
11ef0 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69   int Sqlite3_Ini
11f00 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
11f10 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69  terp){.  Tcl_Ini
11f20 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22  tStubs(interp, "
11f30 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  8.4", 0);.  Tcl_
11f40 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
11f50 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
11f60 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  3", (Tcl_ObjCmdP
11f70 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
11f80 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f  0);.  Tcl_PkgPro
11f90 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71  vide(interp, "sq
11fa0 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f  lite3", PACKAGE_
11fb0 56 45 52 53 49 4f 4e 29 3b 0a 20 20 54 63 6c 5f  VERSION);.  Tcl_
11fc0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
11fd0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
11fe0 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
11ff0 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
12000 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76  );.  Tcl_PkgProv
12010 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ide(interp, "sql
12020 69 74 65 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  ite", PACKAGE_VE
12030 52 53 49 4f 4e 29 3b 0a 20 20 72 65 74 75 72 6e  RSION);.  return
12040 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52   TCL_OK;.}.EXTER
12050 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
12060 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12070 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
12080 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
12090 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e  nterp); }.EXTERN
120a0 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66   int Sqlite3_Saf
120b0 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
120c0 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
120d0 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
120e0 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
120f0 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
12100 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12110 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
12120 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12130 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 45  _3_SUFFIX_ONLY.E
12140 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
12150 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12160 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
12170 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
12180 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e  nterp); }.EXTERN
12190 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49   int Tclsqlite_I
121a0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
121b0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
121c0 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
121d0 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69  erp); }.EXTERN i
121e0 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e  nt Sqlite_SafeIn
121f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
12200 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
12210 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20  CL_OK; }.EXTERN 
12220 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53 61  int Tclsqlite_Sa
12230 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
12240 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
12250 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e  rn TCL_OK; }.#en
12260 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c 53  dif..#ifdef TCLS
12270 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  H./*************
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122c0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
122d0 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65  t follows is use
122e0 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64  d to build stand
122f0 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70  alone TCL interp
12300 72 65 74 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  reters.*/../*.**
12310 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43   If the macro TC
12320 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e  LSH is one, then
12330 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69   put in code thi
12340 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61  s for the.** "ma
12350 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74  in" routine that
12360 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65   will initialize
12370 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e   Tcl and take in
12380 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e  put from.** stan
12390 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 23  dard input..*/.#
123a0 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74  if TCLSH==1.stat
123b0 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f  ic char zMainloo
123c0 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e  p[] =.  "set lin
123d0 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65  e {}\n".  "while
123e0 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20   {![eof stdin]} 
123f0 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c  {\n".    "if {$l
12400 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ine!=\"\"} {\n".
12410 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
12420 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22  ewline \"> \"\n"
12430 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e  .    "} else {\n
12440 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
12450 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c  onewline \"% \"\
12460 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20  n".    "}\n".   
12470 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e   "flush stdout\n
12480 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69  ".    "append li
12490 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c  ne [gets stdin]\
124a0 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66  n".    "if {[inf
124b0 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65  o complete $line
124c0 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69  ]} {\n".      "i
124d0 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76  f {[catch {uplev
124e0 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73  el #0 $line} res
124f0 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ult]} {\n".     
12500 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20     "puts stderr 
12510 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74  \"Error: $result
12520 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65  \"\n".      "} e
12530 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d  lseif {$result!=
12540 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  \"\"} {\n".     
12550 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74     "puts $result
12560 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a  \n".      "}\n".
12570 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20        "set line 
12580 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73  {}\n".    "} els
12590 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70  e {\n".      "ap
125a0 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22  pend line \\n\n"
125b0 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c  .    "}\n".  "}\
125c0 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  n".;.#endif../*.
125d0 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
125e0 54 43 4c 53 48 20 69 73 20 74 77 6f 2c 20 74 68  TCLSH is two, th
125f0 65 6e 20 67 65 74 20 74 68 65 20 6d 61 69 6e 20  en get the main 
12600 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f 66  loop code out of
12610 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 65  .** the separate
12620 20 66 69 6c 65 20 22 73 70 61 63 65 61 6e 61 6c   file "spaceanal
12630 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20  _tcl.h"..*/.#if 
12640 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20  TCLSH==2.static 
12650 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d  char zMainloop[]
12660 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70   = .#include "sp
12670 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b  aceanal_tcl.h".;
12680 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
12690 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e   TCLSH_MAIN main
126a0 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20     /* Needed to 
126b0 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70  fake out mktclap
126c0 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d  p */.int TCLSH_M
126d0 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  AIN(int argc, ch
126e0 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63  ar **argv){.  Tc
126f0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12700 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63  ;.  Tcl_FindExec
12710 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b  utable(argv[0]);
12720 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f  .  interp = Tcl_
12730 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a  CreateInterp();.
12740 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69    Sqlite3_Init(i
12750 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53  nterp);.#ifdef S
12760 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
12770 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
12780 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
12790 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
127a0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
127b0 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c  tetest2_Init(Tcl
127c0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
127d0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
127e0 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49  test3_Init(Tcl_I
127f0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
12800 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
12810 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st4_Init(Tcl_Int
12820 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
12830 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
12840 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  5_Init(Tcl_Inter
12850 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
12860 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f  int Sqlitetest6_
12870 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
12880 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
12890 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e  t Sqlitetest7_In
128a0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
128b0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
128c0 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74  Sqlitetest8_Init
128d0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
128e0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
128f0 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54  litetest9_Init(T
12900 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
12910 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f   extern int Md5_
12920 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
12930 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
12940 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f  t Sqlitetestsse_
12950 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
12960 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
12970 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e  t Sqlitetestasyn
12980 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
12990 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
129a0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74 63  int Sqlitetesttc
129b0 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lvar_Init(Tcl_In
129c0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
129d0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
129e0 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c  tschema_Init(Tcl
129f0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
12a00 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
12a10 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69  test_autoext_Ini
12a20 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
12a30 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
12a40 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f  qlitetest_hexio_
12a50 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
12a60 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
12a70 74 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49  t Sqliteconfig_I
12a80 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
12a90 3b 0a 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  ;..    Sqlitetes
12aa0 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t1_Init(interp);
12ab0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32  .    Sqlitetest2
12ac0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
12ad0 20 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49     Sqlitetest3_I
12ae0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
12af0 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
12b00 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
12b10 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
12b20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
12b30 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e  itetest6_Init(in
12b40 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
12b50 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65  etest7_Init(inte
12b60 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
12b70 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70  est8_Init(interp
12b80 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
12b90 74 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t9_Init(interp);
12ba0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61  .    Sqlitetesta
12bb0 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  sync_Init(interp
12bc0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
12bd0 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74  ttclvar_Init(int
12be0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
12bf0 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28  testschema_Init(
12c00 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
12c10 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f  itetest_autoext_
12c20 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
12c30 20 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78    Sqlitetest_hex
12c40 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  io_Init(interp);
12c50 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69  .    Sqliteconfi
12c60 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  g_Init(interp);.
12c70 20 20 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74      Md5_Init(int
12c80 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  erp);.#ifdef SQL
12c90 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69  ITE_SSE.    Sqli
12ca0 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69  tetestsse_Init(i
12cb0 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20  nterp);.#endif. 
12cc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
12cd0 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48  argc>=2 || TCLSH
12ce0 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==2 ){.    int i
12cf0 3b 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67 63  ;.    char zArgc
12d00 5b 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [32];.    sqlite
12d10 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
12d20 66 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c  f(zArgc), zArgc,
12d30 20 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54   "%d", argc-(3-T
12d40 43 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f  CLSH));.    Tcl_
12d50 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
12d60 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c  rgc", zArgc, TCL
12d70 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
12d80 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
12d90 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67  terp,"argv0",arg
12da0 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f  v[1],TCL_GLOBAL_
12db0 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
12dc0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
12dd0 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f  gv", "", TCL_GLO
12de0 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66  BAL_ONLY);.    f
12df0 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c  or(i=3-TCLSH; i<
12e00 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
12e10 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
12e20 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67  erp, "argv", arg
12e30 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[i],.          
12e40 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20  TCL_GLOBAL_ONLY 
12e50 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  | TCL_LIST_ELEME
12e60 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f  NT | TCL_APPEND_
12e70 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20  VALUE);.    }.  
12e80 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26    if( TCLSH==1 &
12e90 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69  & Tcl_EvalFile(i
12ea0 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21  nterp, argv[1])!
12eb0 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
12ec0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
12ed0 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28  fo = Tcl_GetVar(
12ee0 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e  interp, "errorIn
12ef0 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  fo", TCL_GLOBAL_
12f00 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28  ONLY);.      if(
12f10 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66   zInfo==0 ) zInf
12f20 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75  o = interp->resu
12f30 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  lt;.      fprint
12f40 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73  f(stderr,"%s: %s
12f50 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66  \n", *argv, zInf
12f60 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
12f70 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
12f80 69 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54  if( argc<=1 || T
12f90 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54  CLSH==2 ){.    T
12fa0 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e  cl_GlobalEval(in
12fb0 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29  terp, zMainloop)
12fc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
12fd0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43  ;.}.#endif /* TC
12fe0 4c 53 48 20 2a 2f 0a                             LSH */.