/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 01312c2af41189ff20335d6ac64e3dbda57e627b:


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 32 32 31 20 32 30 30 38  e.c,v 1.221 2008
0220: 2f 30 39 2f 30 31 20 32 30 3a 33 38 3a 31 32 20  /09/01 20:38:12 
0230: 73 68 61 6e 65 20 45 78 70 20 24 0a 2a 2f 0a 23  shane Exp $.*/.#
0240: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
0250: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0260: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 61  h>../*.** Some a
0270: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 63 6c 75 64  dditional includ
0280: 65 20 66 69 6c 65 73 20 61 72 65 20 6e 65 65 64  e files are need
0290: 65 64 20 69 66 20 74 68 69 73 20 66 69 6c 65 20  ed if this file 
02a0: 69 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 6e 64  is not.** append
02b0: 65 64 20 74 6f 20 74 68 65 20 61 6d 61 6c 67 61  ed to the amalga
02c0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  mation..*/.#ifnd
02d0: 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  ef SQLITE_AMALGA
02e0: 4d 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65  MATION.# include
02f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0300: 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62   include <stdlib
0310: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0320: 74 72 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75  tring.h>.# inclu
0330: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 20  de <assert.h>.# 
0340: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0350: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  >.#endif../*. * 
0360: 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f  Windows needs to
0370: 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62   know which symb
0380: 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20  ols to export.  
0390: 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  Unix does not.. 
03a0: 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73  * BUILD_sqlite s
03b0: 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e  hould be undefin
03c0: 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f  ed for Unix.. */
03d0: 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71  .#ifdef BUILD_sq
03e0: 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f  lite.#undef TCL_
03f0: 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64  STORAGE_CLASS.#d
0400: 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47  efine TCL_STORAG
0410: 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52  E_CLASS DLLEXPOR
0420: 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c  T.#endif /* BUIL
0430: 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65  D_sqlite */..#de
0440: 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45  fine NUM_PREPARE
0450: 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69  D_STMTS 10.#defi
0460: 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f  ne MAX_PREPARED_
0470: 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a  STMTS 100../*.**
0480: 20 49 66 20 54 43 4c 20 75 73 65 73 20 55 54 46   If TCL uses UTF
0490: 2d 38 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73  -8 and SQLite is
04a0: 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
04b0: 73 65 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e  se iso8859, then
04c0: 20 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64   we.** have to d
04d0: 6f 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  o a translation 
04e0: 77 68 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65  when going betwe
04f0: 65 6e 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74  en the two.  Set
0500: 20 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41   the .** UTF_TRA
0510: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20  NSLATION_NEEDED 
0520: 6d 61 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74  macro to indicat
0530: 65 20 74 68 61 74 20 77 65 20 6e 65 65 64 20 74  e that we need t
0540: 6f 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61  o do.** this tra
0550: 6e 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23  nslation.  .*/.#
0560: 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55  if defined(TCL_U
0570: 54 46 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69  TF_MAX) && !defi
0580: 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29  ned(SQLITE_UTF8)
0590: 0a 23 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52  .# define UTF_TR
05a0: 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  ANSLATION_NEEDED
05b0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
05c0: 20 4e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f   New SQL functio
05d0: 6e 73 20 63 61 6e 20 62 65 20 63 72 65 61 74 65  ns can be create
05e0: 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73  d as TCL scripts
05f0: 2e 20 20 45 61 63 68 20 73 75 63 68 20 66 75 6e  .  Each such fun
0600: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63  ction.** is desc
0610: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
0620: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0630: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
0640: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0650: 63 74 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75  ct SqlFunc SqlFu
0660: 6e 63 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75  nc;.struct SqlFu
0670: 6e 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nc {.  Tcl_Inter
0680: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
0690: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
06a0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
06b0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
06c0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
06d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f       /* The Tcl_
06e0: 4f 62 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69  Obj representati
06f0: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70 74  on of the script
0700: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61   */.  int useEva
0710: 6c 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54  lObjv;      /* T
0720: 72 75 65 20 69 66 20 69 74 20 69 73 20 73 61 66  rue if it is saf
0730: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
0740: 6c 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20  lObjv */.  char 
0750: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
0760: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73   /* Name of this
0770: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53   function */.  S
0780: 71 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20  qlFunc *pNext;  
0790: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e       /* Next fun
07a0: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73  ction on the lis
07b0: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
07c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63  .};../*.** New c
07d0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
07e0: 65 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  es function can 
07f0: 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43  be created as TC
0800: 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68  L scripts.  Each
0810: 20 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f   such.** functio
0820: 6e 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62  n is described b
0830: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  y an instance of
0840: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0850: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
0860: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 43  edef struct SqlC
0870: 6f 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74  ollate SqlCollat
0880: 65 3b 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c  e;.struct SqlCol
0890: 6c 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74  late {.  Tcl_Int
08a0: 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f  erp *interp;   /
08b0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
08c0: 72 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74  ret to execute t
08d0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
08e0: 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20   char *zScript; 
08f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63         /* The sc
0900: 72 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a  ript to be run *
0910: 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  /.  SqlCollate *
0920: 70 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78  pNext;    /* Nex
0930: 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  t function on th
0940: 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  e list of them a
0950: 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ll */.};../*.** 
0960: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
0970: 6e 74 73 20 61 72 65 20 63 61 63 68 65 64 20 66  nts are cached f
0980: 6f 72 20 66 61 73 74 65 72 20 65 78 65 63 75 74  or faster execut
0990: 69 6f 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61  ion.  Each prepa
09a0: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
09b0: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
09c0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
09d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
09e0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
09f0: 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 50 72  def struct SqlPr
0a00: 65 70 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72  eparedStmt SqlPr
0a10: 65 70 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75  eparedStmt;.stru
0a20: 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ct SqlPreparedSt
0a30: 6d 74 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72  mt {.  SqlPrepar
0a40: 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20  edStmt *pNext;  
0a50: 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65  /* Next in linke
0a60: 64 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50  d list */.  SqlP
0a70: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
0a80: 65 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  ev;  /* Previous
0a90: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   on the list */.
0aa0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
0ab0: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68  pStmt;     /* Th
0ac0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
0ad0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ment */.  int nS
0ae0: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
0af0: 20 20 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a     /* chars in z
0b00: 53 71 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74  Sql[] */.  const
0b10: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
0b20: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
0b30: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
0b40: 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20   */.};..typedef 
0b50: 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43  struct IncrblobC
0b60: 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62 43  hannel IncrblobC
0b70: 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54  hannel;../*.** T
0b80: 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
0b90: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
0ba0: 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 20  ucture for each 
0bb0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a  SQLite database.
0bc0: 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  ** that has been
0bd0: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 53   opened by the S
0be0: 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72 66  QLite TCL interf
0bf0: 61 63 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ace..*/.typedef 
0c00: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
0c10: 53 71 6c 69 74 65 44 62 3b 0a 73 74 72 75 63 74  SqliteDb;.struct
0c20: 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71   SqliteDb {.  sq
0c30: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
0c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0c50: 22 72 65 61 6c 22 20 64 61 74 61 62 61 73 65 20  "real" database 
0c60: 73 74 72 75 63 74 75 72 65 2e 20 4d 55 53 54 20  structure. MUST 
0c70: 42 45 20 46 49 52 53 54 20 2a 2f 0a 20 20 54 63  BE FIRST */.  Tc
0c80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0c90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
0ca0: 69 6e 74 65 72 70 72 65 74 65 72 20 75 73 65 64  interpreter used
0cb0: 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
0cc0: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  se */.  char *zB
0cd0: 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  usy;            
0ce0: 20 20 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63     /* The busy c
0cf0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0d00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  */.  char *zComm
0d10: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
0d20: 2f 2a 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f  /* The commit ho
0d30: 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  ok callback rout
0d40: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
0d50: 54 72 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Trace;          
0d60: 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65      /* The trace
0d70: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0d80: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72  e */.  char *zPr
0d90: 6f 66 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  ofile;          
0da0: 20 20 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c 65    /* The profile
0db0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0dc0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72  e */.  char *zPr
0dd0: 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20 20 20  ogress;         
0de0: 20 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73    /* The progres
0df0: 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  s callback routi
0e00: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  ne */.  char *zA
0e10: 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  uth;            
0e20: 20 20 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72     /* The author
0e30: 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ization callback
0e40: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e   routine */.  in
0e50: 74 20 64 69 73 61 62 6c 65 41 75 74 68 3b 20 20  t disableAuth;  
0e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0e70: 62 6c 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a  ble the authoriz
0e80: 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73 20  er if it exists 
0e90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  */.  char *zNull
0ea0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0eb0: 2f 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73 74  /* Text to subst
0ec0: 69 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c  itute for an SQL
0ed0: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20   NULL value */. 
0ee0: 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b   SqlFunc *pFunc;
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
0f00: 69 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74  ist of SQL funct
0f10: 69 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ions */.  Tcl_Ob
0f20: 6a 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20  j *pUpdateHook; 
0f30: 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68       /* Update h
0f40: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
0f50: 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ny) */.  Tcl_Obj
0f60: 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b   *pRollbackHook;
0f70: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
0f80: 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20  hook script (if 
0f90: 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c  any) */.  SqlCol
0fa0: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20  late *pCollate; 
0fb0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
0fc0: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
0fd0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
0fe0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
0ff0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1000: 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72  n code of most r
1010: 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  ecent sqlite3_ex
1020: 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ec() */.  Tcl_Ob
1030: 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  j *pCollateNeede
1040: 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f  d;   /* Collatio
1050: 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70 74 20  n needed script 
1060: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
1070: 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20  Stmt *stmtList; 
1080: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61  /* List of prepa
1090: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f  red statements*/
10a0: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
10b0: 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a  mt *stmtLast; /*
10c0: 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20   Last statement 
10d0: 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
10e0: 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20   int maxStmt;   
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1100: 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20  he next maximum 
1110: 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69  number of stmtLi
1120: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d  st */.  int nStm
1130: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1140: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1150: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74  statements in st
1160: 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72  mtList */.  Incr
1170: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e  blobChannel *pIn
1180: 63 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64  crblob;/* Linked
1190: 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e   list of open in
11a0: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20  crblob channels 
11b0: 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e  */.};..struct In
11c0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a  crblobChannel {.
11d0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
11e0: 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73  pBlob;      /* s
11f0: 71 6c 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64  qlite3 blob hand
1200: 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62  le */.  SqliteDb
1210: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
1220: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
1230: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1240: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ion */.  int iSe
1250: 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ek;             
1260: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65     /* Current se
1270: 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54  ek offset */.  T
1280: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e  cl_Channel chann
1290: 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  el;      /* Chan
12a0: 6e 65 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a  nel identifier *
12b0: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
12c0: 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a  nel *pNext;   /*
12d0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
12e0: 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f  all open incrblo
12f0: 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20  b channels */.  
1300: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1310: 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e  *pPrev;   /* Lin
1320: 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
1330: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
1340: 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 23 69  annels */.};..#i
1350: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1360: 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a  T_INCRBLOB./*.**
1370: 20 43 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72 62   Close all incrb
1380: 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70 65  lob channels ope
1390: 6e 65 64 20 75 73 69 6e 67 20 64 61 74 61 62 61  ned using databa
13a0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 44  se connection pD
13b0: 62 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  b..** This is ca
13c0: 6c 6c 65 64 20 77 68 65 6e 20 73 68 75 74 74 69  lled when shutti
13d0: 6e 67 20 64 6f 77 6e 20 74 68 65 20 64 61 74 61  ng down the data
13e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
13f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1400: 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61  closeIncrblobCha
1410: 6e 6e 65 6c 73 28 53 71 6c 69 74 65 44 62 20 2a  nnels(SqliteDb *
1420: 70 44 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  pDb){.  Incrblob
1430: 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49 6e  Channel *p;.  In
1440: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1450: 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d 70  Next;..  for(p=p
1460: 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20 70  Db->pIncrblob; p
1470: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
1480: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
1490: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ;..    /* Note: 
14a0: 43 61 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73 74  Calling unregist
14b0: 65 72 20 68 65 72 65 20 63 61 6c 6c 20 54 63 6c  er here call Tcl
14c0: 5f 43 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69 6e  _Close on the in
14d0: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c 20  crblob channel, 
14e0: 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 64 65  .    ** which de
14f0: 6c 65 74 65 73 20 74 68 65 20 49 6e 63 72 62 6c  letes the Incrbl
1500: 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74  obChannel struct
1510: 75 72 65 20 61 74 20 2a 70 2e 20 53 6f 20 64 6f  ure at *p. So do
1520: 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   not.    ** call
1530: 20 54 63 6c 5f 46 72 65 65 28 29 20 68 65 72 65   Tcl_Free() here
1540: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  ..    */.    Tcl
1550: 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e  _UnregisterChann
1560: 65 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  el(pDb->interp, 
1570: 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 7d  p->channel);.  }
1580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
1590: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
15a0: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
15b0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
15c0: 6c 6f 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74 44  lobClose(ClientD
15d0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
15e0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
15f0: 74 65 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c 6f  terp){.  Incrblo
1600: 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49  bChannel *p = (I
1610: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1620: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20  )instanceData;. 
1630: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1640: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e  3_blob_close(p->
1650: 70 42 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74 65  pBlob);.  sqlite
1660: 33 20 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d 3e  3 *db = p->pDb->
1670: 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  db;..  /* Remove
1680: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f   the channel fro
1690: 6d 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70  m the SqliteDb.p
16a0: 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a  Incrblob list. *
16b0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  /.  if( p->pNext
16c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
16d0: 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
16e0: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ev;.  }.  if( p-
16f0: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
1700: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
1710: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
1720: 69 66 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63  if( p->pDb->pInc
1730: 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20 20  rblob==p ){.    
1740: 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f  p->pDb->pIncrblo
1750: 62 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  b = p->pNext;.  
1760: 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  }..  /* Free the
1770: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1780: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1790: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tcl_Free((char *
17a0: 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  )p);..  if( rc!=
17b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17c0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
17d0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
17e0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
17f0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
1800: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1810: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
1820: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1830: 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
1840: 66 72 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e  from an incremen
1850: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
1860: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1870: 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20  incrblobInput(. 
1880: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
1890: 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 63 68 61  anceData, .  cha
18a0: 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 62  r *buf, .  int b
18b0: 75 66 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65  ufSize,.  int *e
18c0: 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20  rrorCodePtr.){. 
18d0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
18e0: 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43   *p = (IncrblobC
18f0: 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63  hannel *)instanc
1900: 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65  eData;.  int nRe
1910: 61 64 20 3d 20 62 75 66 53 69 7a 65 3b 20 20 20  ad = bufSize;   
1920: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1930: 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
1940: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b   */.  int nBlob;
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
1970: 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a   of the blob */.
1980: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19a0: 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  * sqlite error c
19b0: 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20  ode */..  nBlob 
19c0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62  = sqlite3_blob_b
19d0: 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a  ytes(p->pBlob);.
19e0: 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b    if( (p->iSeek+
19f0: 6e 52 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a  nRead)>nBlob ){.
1a00: 20 20 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f      nRead = nBlo
1a10: 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a  b-p->iSeek;.  }.
1a20: 20 20 69 66 28 20 6e 52 65 61 64 3c 3d 30 20 29    if( nRead<=0 )
1a30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1a40: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
1a50: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d  te3_blob_read(p-
1a60: 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29  >pBlob, (void *)
1a70: 62 75 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69  buf, nRead, p->i
1a80: 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21  Seek);.  if( rc!
1a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1aa0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
1ab0: 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
1ac0: 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69   -1;.  }..  p->i
1ad0: 53 65 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20  Seek += nRead;. 
1ae0: 20 72 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d   return nRead;.}
1af0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
1b00: 74 61 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65  ta to an increme
1b10: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1b20: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1b30: 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 28   incrblobOutput(
1b40: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  .  ClientData in
1b50: 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 43  stanceData, .  C
1b60: 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20  ONST char *buf, 
1b70: 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a  .  int toWrite,.
1b80: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65    int *errorCode
1b90: 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f  Ptr.){.  Incrblo
1ba0: 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49  bChannel *p = (I
1bb0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1bc0: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20  )instanceData;. 
1bd0: 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f   int nWrite = to
1be0: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  Write;        /*
1bf0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1c00: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
1c10: 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  nt nBlob;       
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c30: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
1c40: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72   blob */.  int r
1c50: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c60: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1c70: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
1c80: 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  nBlob = sqlit
1c90: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
1ca0: 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28  >pBlob);.  if( (
1cb0: 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29  p->iSeek+nWrite)
1cc0: 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65  >nBlob ){.    *e
1cd0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
1ce0: 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e  NVAL;.    return
1cf0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   -1;.  }.  if( n
1d00: 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20  Write<=0 ){.    
1d10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1d20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
1d30: 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f  ob_write(p->pBlo
1d40: 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20  b, (void *)buf, 
1d50: 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b  nWrite, p->iSeek
1d60: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1d70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65  ITE_OK ){.    *e
1d80: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
1d90: 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  O;.    return -1
1da0: 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65  ;.  }..  p->iSee
1db0: 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72  k += nWrite;.  r
1dc0: 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a  eturn nWrite;.}.
1dd0: 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69  ./*.** Seek an i
1de0: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
1df0: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
1e00: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 53  ic int incrblobS
1e10: 65 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  eek(.  ClientDat
1e20: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
1e30: 0a 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a  .  long offset,.
1e40: 20 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a    int seekMode,.
1e50: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65    int *errorCode
1e60: 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f  Ptr.){.  Incrblo
1e70: 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49  bChannel *p = (I
1e80: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1e90: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a  )instanceData;..
1ea0: 20 20 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f    switch( seekMo
1eb0: 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  de ){.    case S
1ec0: 45 45 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70  EEK_SET:.      p
1ed0: 2d 3e 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74  ->iSeek = offset
1ee0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ef0: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52     case SEEK_CUR
1f00: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
1f10: 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20   += offset;.    
1f20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1f30: 65 20 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20  e SEEK_END:.    
1f40: 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c    p->iSeek = sql
1f50: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
1f60: 70 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73  p->pBlob) + offs
1f70: 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
1f80: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  ..    default: a
1f90: 73 73 65 72 74 28 21 22 42 61 64 20 73 65 65 6b  ssert(!"Bad seek
1fa0: 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72  Mode");.  }..  r
1fb0: 65 74 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a  eturn p->iSeek;.
1fc0: 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }...static void 
1fd0: 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 28 43 6c  incrblobWatch(Cl
1fe0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1ff0: 65 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29  eData, int mode)
2000: 7b 20 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  { .  /* NO-OP */
2010: 20 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69   .}.static int i
2020: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43 6c  ncrblobHandle(Cl
2030: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
2040: 65 44 61 74 61 2c 20 69 6e 74 20 64 69 72 2c 20  eData, int dir, 
2050: 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 50 74 72  ClientData *hPtr
2060: 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ){.  return TCL_
2070: 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63  ERROR;.}..static
2080: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tcl_ChannelType
2090: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
20a0: 54 79 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72  Type = {.  "incr
20b0: 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  blob",          
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20d0: 20 74 79 70 65 4e 61 6d 65 20 20 20 20 20 20 20   typeName       
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43        */.  TCL_C
2100: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32  HANNEL_VERSION_2
2110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2120: 20 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20   version        
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62        */.  incrb
2150: 6c 6f 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  lobClose,       
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2170: 20 63 6c 6f 73 65 50 72 6f 63 20 20 20 20 20 20   closeProc      
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62        */.  incrb
21a0: 6c 6f 62 49 6e 70 75 74 2c 20 20 20 20 20 20 20  lobInput,       
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c0: 20 69 6e 70 75 74 50 72 6f 63 20 20 20 20 20 20   inputProc      
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62        */.  incrb
21f0: 6c 6f 62 4f 75 74 70 75 74 2c 20 20 20 20 20 20  lobOutput,      
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2210: 20 6f 75 74 70 75 74 50 72 6f 63 20 20 20 20 20   outputProc     
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62        */.  incrb
2240: 6c 6f 62 53 65 65 6b 2c 20 20 20 20 20 20 20 20  lobSeek,        
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2260: 20 73 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20   seekProc       
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20        */.  0,   
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b0: 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20   setOptionProc  
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20        */.  0,   
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2300: 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20   getOptionProc  
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62        */.  incrb
2330: 6c 6f 62 57 61 74 63 68 2c 20 20 20 20 20 20 20  lobWatch,       
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2350: 20 77 61 74 63 68 50 72 6f 63 20 28 74 68 69 73   watchProc (this
2360: 20 69 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20   is a no-op)    
2370: 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62        */.  incrb
2380: 6c 6f 62 48 61 6e 64 6c 65 2c 20 20 20 20 20 20  lobHandle,      
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a0: 20 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 28   getHandleProc (
23b0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 65  always returns e
23c0: 72 72 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20  rror) */.  0,   
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f0: 20 63 6c 6f 73 65 32 50 72 6f 63 20 20 20 20 20   close2Proc     
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20        */.  0,   
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2440: 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20   blockModeProc  
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20        */.  0,   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2490: 20 66 6c 75 73 68 50 72 6f 63 20 20 20 20 20 20   flushProc      
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20        */.  0,   
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24e0: 20 68 61 6e 64 6c 65 72 50 72 6f 63 20 20 20 20   handlerProc    
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20        */.  0,   
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2530: 20 77 69 64 65 53 65 65 6b 50 72 6f 63 20 20 20   wideSeekProc   
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a        */.};../*.
2560: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
2570: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
2580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2590: 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68  createIncrblobCh
25a0: 61 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74  annel(.  Tcl_Int
25b0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
25c0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 0a  SqliteDb *pDb, .
25d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
25e0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
25f0: 2a 7a 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e 73  *zTable, .  cons
2600: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
2610: 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
2620: 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73 52   iRow,.  int isR
2630: 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e 63  eadonly.){.  Inc
2640: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b  rblobChannel *p;
2650: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2660: 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c 69   pDb->db;.  sqli
2670: 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b  te3_blob *pBlob;
2680: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2690: 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45 41   flags = TCL_REA
26a0: 44 41 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e 6c  DABLE|(isReadonl
26b0: 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49 54  y ? 0 : TCL_WRIT
26c0: 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ABLE);..  /* Thi
26d0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  s variable is us
26e0: 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65 20 63  ed to name the c
26f0: 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62 6c  hannels: "incrbl
2700: 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d 22  ob_[incr count]"
2710: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74   */.  static int
2720: 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68   count = 0;.  ch
2730: 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d 3b  ar zChannel[64];
2740: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2750: 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 7a  _blob_open(db, z
2760: 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c  Db, zTable, zCol
2770: 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52 65  umn, iRow, !isRe
2780: 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29 3b  adonly, &pBlob);
2790: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
27b0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
27c0: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
27d0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
27e0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
27f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2800: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
2810: 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e   = (IncrblobChan
2820: 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  nel *)Tcl_Alloc(
2830: 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43  sizeof(IncrblobC
2840: 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69  hannel));.  p->i
2850: 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  Seek = 0;.  p->p
2860: 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20  Blob = pBlob;.. 
2870: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2880: 66 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e 65  f(sizeof(zChanne
2890: 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22 69  l), zChannel, "i
28a0: 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b 63  ncrblob_%d", ++c
28b0: 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61 6e  ount);.  p->chan
28c0: 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  nel = Tcl_Create
28d0: 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f  Channel(&Incrblo
28e0: 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43  bChannelType, zC
28f0: 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73  hannel, p, flags
2900: 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65  );.  Tcl_Registe
2910: 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  rChannel(interp,
2920: 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20   p->channel);.. 
2930: 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
2940: 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74 68   channel into th
2950: 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72  e SqliteDb.pIncr
2960: 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20  blob list. */.  
2970: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  p->pNext = pDb->
2980: 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d 3e  pIncrblob;.  p->
2990: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28  pPrev = 0;.  if(
29a0: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
29b0: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
29c0: 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62 2d   = p;.  }.  pDb-
29d0: 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b 0a  >pIncrblob = p;.
29e0: 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a    p->pDb = pDb;.
29f0: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
2a00: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2a10: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  )Tcl_GetChannelN
2a20: 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29 2c  ame(p->channel),
2a30: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
2a40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2a50: 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c 73  .}.#else  /* els
2a60: 65 20 63 6c 61 75 73 65 20 66 6f 72 20 22 23 69  e clause for "#i
2a70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a80: 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a 20  T_INCRBLOB" */. 
2a90: 20 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 49 6e   #define closeIn
2aa0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70  crblobChannels(p
2ab0: 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  Db).#endif../*.*
2ac0: 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63  * Look at the sc
2ad0: 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20 70  ript prefix in p
2ae0: 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65  Cmd.  We will be
2af0: 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20   executing this 
2b00: 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20  script.** after 
2b10: 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20  first appending 
2b20: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75  one or more argu
2b30: 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75  ments.  This rou
2b40: 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a  tine analyzes.**
2b50: 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20 73   the script to s
2b60: 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65  ee if it is safe
2b70: 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c   to use Tcl_Eval
2b80: 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63  Objv() on the sc
2b90: 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74  ript.** rather t
2ba0: 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e  han the more gen
2bb0: 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28  eral Tcl_EvalEx(
2bc0: 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  ).  Tcl_EvalObjv
2bd0: 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61  () is much.** fa
2be0: 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69  ster..**.** Scri
2bf0: 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61 66  pts that are saf
2c00: 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54 63  e to use with Tc
2c10: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e  l_EvalObjv() con
2c20: 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f  sists of a.** co
2c30: 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f  mmand name follo
2c40: 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d  wed by zero or m
2c50: 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69  ore arguments wi
2c60: 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24  th no [...] or $
2c70: 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20  .** or {...} or 
2c80: 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79  ; to be seen any
2c90: 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c  where.  Most cal
2ca0: 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f  lback scripts co
2cb0: 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74  nsist.** of just
2cc0: 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64   a single proced
2cd0: 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ure name and the
2ce0: 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71 75  y meet this requ
2cf0: 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  irement..*/.stat
2d00: 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65  ic int safeToUse
2d10: 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74  EvalObjv(Tcl_Int
2d20: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c  erp *interp, Tcl
2d30: 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f  _Obj *pCmd){.  /
2d40: 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74  * We could try t
2d50: 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  o do something w
2d60: 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e  ith Tcl_Parse().
2d70: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e    But we will in
2d80: 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20  stead.  ** just 
2d90: 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  do a search for 
2da0: 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61 63  forbidden charac
2db0: 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66  ters.  If any of
2dc0: 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20   the forbidden. 
2dd0: 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61   ** characters a
2de0: 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77  ppear in pCmd, w
2df0: 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68  e will report th
2e00: 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61  e string as unsa
2e10: 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  fe..  */.  const
2e20: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
2e30: 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74  n;.  z = Tcl_Get
2e40: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43  StringFromObj(pC
2e50: 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65  md, &n);.  while
2e60: 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
2e70: 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b   int c = *(z++);
2e80: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20  .    if( c=='$' 
2e90: 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d  || c=='[' || c==
2ea0: 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ';' ) return 0;.
2eb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
2ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e  }../*.** Find an
2ed0: 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75   SqlFunc structu
2ee0: 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  re with the give
2ef0: 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61  n name.  Or crea
2f00: 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20  te a new.** one 
2f10: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f  if an existing o
2f20: 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ne cannot be fou
2f30: 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  nd.  Return a po
2f40: 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
2f50: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
2f60: 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69  atic SqlFunc *fi
2f70: 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65  ndSqlFunc(Sqlite
2f80: 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63  Db *pDb, const c
2f90: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53  har *zName){.  S
2fa0: 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77  qlFunc *p, *pNew
2fb0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65  ;.  int i;.  pNe
2fc0: 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63  w = (SqlFunc*)Tc
2fd0: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
2fe0: 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e 28  *pNew) + strlen(
2ff0: 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20  zName) + 1 );.  
3000: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pNew->zName = (c
3010: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
3020: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
3030: 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e  i]; i++){ pNew->
3040: 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77  zName[i] = tolow
3050: 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a  er(zName[i]); }.
3060: 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d    pNew->zName[i]
3070: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44   = 0;.  for(p=pD
3080: 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70  b->pFunc; p; p=p
3090: 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20 69  ->pNext){ .    i
30a0: 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61  f( strcmp(p->zNa
30b0: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29  me, pNew->zName)
30c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
30d0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65  _Free((char*)pNe
30e0: 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  w);.      return
30f0: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   p;.    }.  }.  
3100: 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70  pNew->interp = p
3110: 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e  Db->interp;.  pN
3120: 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b  ew->pScript = 0;
3130: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
3140: 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70   pDb->pFunc;.  p
3150: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77  Db->pFunc = pNew
3160: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
3170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
3180: 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69  ze and free a li
3190: 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  st of prepared s
31a0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  tatements.*/.sta
31b0: 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74  tic void flushSt
31c0: 6d 74 43 61 63 68 65 28 20 53 71 6c 69 74 65 44  mtCache( SqliteD
31d0: 62 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c 50  b *pDb ){.  SqlP
31e0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
31f0: 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28  eStmt;..  while(
3200: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
3210: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
3220: 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74  inalize( pDb->st
3230: 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  mtList->pStmt );
3240: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20  .    pPreStmt = 
3250: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
3260: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
3270: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
3280: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
3290: 5f 46 72 65 65 28 20 28 63 68 61 72 2a 29 70 50  _Free( (char*)pP
32a0: 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20  reStmt );.  }.  
32b0: 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a  pDb->nStmt = 0;.
32c0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
32d0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43  = 0;.}../*.** TC
32e0: 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f  L calls this pro
32f0: 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73  cedure when an s
3300: 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65 20  qlite3 database 
3310: 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65  command is.** de
3320: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
3330: 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d   void DbDeleteCm
3340: 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53  d(void *db){.  S
3350: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3360: 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20  SqliteDb*)db;.  
3370: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 70  flushStmtCache(p
3380: 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72  Db);.  closeIncr
3390: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62  blobChannels(pDb
33a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  );.  sqlite3_clo
33b0: 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77  se(pDb->db);.  w
33c0: 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63  hile( pDb->pFunc
33d0: 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20   ){.    SqlFunc 
33e0: 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46  *pFunc = pDb->pF
33f0: 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46  unc;.    pDb->pF
3400: 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65  unc = pFunc->pNe
3410: 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  xt;.    Tcl_Decr
3420: 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
3430: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63  pScript);.    Tc
3440: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46  l_Free((char*)pF
3450: 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  unc);.  }.  whil
3460: 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  e( pDb->pCollate
3470: 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61   ){.    SqlColla
3480: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70  te *pCollate = p
3490: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
34a0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
34b0: 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78  = pCollate->pNex
34c0: 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  t;.    Tcl_Free(
34d0: 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29  (char*)pCollate)
34e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
34f0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63  >zBusy ){.    Tc
3500: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
3510: 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  y);.  }.  if( pD
3520: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
3530: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3540: 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66  Trace);.  }.  if
3550: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
3560: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3570: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a  pDb->zProfile);.
3580: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
3590: 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Auth ){.    Tcl_
35a0: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
35b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
35c0: 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63  >zNull ){.    Tc
35d0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
35e0: 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  l);.  }.  if( pD
35f0: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29  b->pUpdateHook )
3600: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3610: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64  fCount(pDb->pUpd
3620: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ateHook);.  }.  
3630: 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  if( pDb->pRollba
3640: 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63  ckHook ){.    Tc
3650: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3660: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
3670: 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  k);.  }.  if( pD
3680: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
3690: 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  d ){.    Tcl_Dec
36a0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
36b0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
36c0: 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28    }.  Tcl_Free((
36d0: 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f  char*)pDb);.}../
36e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
36f0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
3700: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
3710: 20 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65   is locked while
3720: 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78   trying.** to ex
3730: 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74  ecute SQL..*/.st
3740: 61 74 69 63 20 69 6e 74 20 44 62 42 75 73 79 48  atic int DbBusyH
3750: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c  andler(void *cd,
3760: 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20   int nTries){.  
3770: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3780: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3790: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
37a0: 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c  zVal[30];..  sql
37b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
37c0: 7a 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c  zeof(zVal), zVal
37d0: 2c 20 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b  , "%d", nTries);
37e0: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45  .  rc = Tcl_VarE
37f0: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
3800: 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22   pDb->zBusy, " "
3810: 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30  , zVal, (char*)0
3820: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
3830: 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f  _OK || atoi(Tcl_
3840: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
3850: 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b  pDb->interp)) ){
3860: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3870: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
3880: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3890: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
38a0: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
38b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
38c0: 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70 72  voked as the 'pr
38d0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27  ogress callback'
38e0: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
38f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3900: 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
3910: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
3920: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3930: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3940: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
3950: 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rt( pDb->zProgre
3960: 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c  ss );.  rc = Tcl
3970: 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72  _Eval(pDb->inter
3980: 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  p, pDb->zProgres
3990: 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  s);.  if( rc!=TC
39a0: 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c  L_OK || atoi(Tcl
39b0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
39c0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29  (pDb->interp)) )
39d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
39e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
39f0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
3a00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
3a10: 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACE./*.** This r
3a20: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3a30: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 74   by the SQLite t
3a40: 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65  race handler whe
3a50: 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62  never a new.** b
3a60: 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65  lock of SQL is e
3a70: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43  xecuted.  The TC
3a80: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
3a90: 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63 75  >zTrace is execu
3aa0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3ab0: 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c  oid DbTraceHandl
3ac0: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e  er(void *cd, con
3ad0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
3ae0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3af0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
3b00: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
3b10: 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr;..  Tcl_DStri
3b20: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
3b30: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
3b40: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72  d(&str, pDb->zTr
3b50: 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ace, -1);.  Tcl_
3b60: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
3b70: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29  ment(&str, zSql)
3b80: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  ;.  Tcl_Eval(pDb
3b90: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
3ba0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
3bb0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3bc0: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63  Free(&str);.  Tc
3bd0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44  l_ResetResult(pD
3be0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65  b->interp);.}.#e
3bf0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
3c00: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
3c10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3c20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
3c30: 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69  the SQLite profi
3c40: 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72  le handler after
3c50: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
3c60: 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64  SQL has executed
3c70: 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70  .  The TCL scrip
3c80: 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69  t in pDb->zProfi
3c90: 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  le is evaluated.
3ca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3cb0: 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
3cc0: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
3cd0: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c   char *zSql, sql
3ce0: 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a  ite_uint64 tm){.
3cf0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3d00: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
3d10: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
3d20: 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31  tr;.  char zTm[1
3d30: 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  00];..  sqlite3_
3d40: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
3d50: 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c  zTm)-1, zTm, "%l
3d60: 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f  ld", tm);.  Tcl_
3d70: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
3d80: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3d90: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
3da0: 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b  ->zProfile, -1);
3db0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
3dc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
3dd0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44  , zSql);.  Tcl_D
3de0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
3df0: 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a  ent(&str, zTm);.
3e00: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
3e10: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
3e20: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
3e30: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
3e40: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
3e50: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
3e60: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  >interp);.}.#end
3e70: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
3e80: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3e90: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
3ea0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
3eb0: 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63  .  The.** TCL sc
3ec0: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f  ript in pDb->zCo
3ed0: 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64  mmit is executed
3ee0: 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  .  If it returns
3ef0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20   non-zero or.** 
3f00: 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20  if it throws an 
3f10: 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74  exception, the t
3f20: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
3f30: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61  lled back instea
3f40: 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f  d.** of being co
3f50: 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmitted..*/.stat
3f60: 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48  ic int DbCommitH
3f70: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
3f80: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3f90: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
3fa0: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
3fb0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
3fc0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
3fd0: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  zCommit);.  if( 
3fe0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
3ff0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
4000: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
4010: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
4020: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
4030: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
4040: 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48  void DbRollbackH
4050: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69  andler(void *cli
4060: 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69  entData){.  Sqli
4070: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
4080: 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74  iteDb*)clientDat
4090: 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d  a;.  assert(pDb-
40a0: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
40b0: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
40c0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
40d0: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
40e0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29  RollbackHook, 0)
40f0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
4100: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d  groundError(pDb-
4110: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a  >interp);.  }.}.
4120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 55  .static void DbU
4130: 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20  pdateHandler(.  
4140: 76 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20  void *p, .  int 
4150: 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  op,.  const char
4160: 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20   *zDb, .  const 
4170: 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73  char *zTbl, .  s
4180: 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69  qlite_int64 rowi
4190: 64 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  d.){.  SqliteDb 
41a0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
41b0: 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   *)p;.  Tcl_Obj 
41c0: 2a 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74  *pCmd;..  assert
41d0: 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  ( pDb->pUpdateHo
41e0: 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ok );.  assert( 
41f0: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  op==SQLITE_INSER
4200: 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  T || op==SQLITE_
4210: 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51  UPDATE || op==SQ
4220: 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a  LITE_DELETE );..
4230: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70    pCmd = Tcl_Dup
4240: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
4250: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54  UpdateHook);.  T
4260: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4270: 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  pCmd);.  Tcl_Lis
4280: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4290: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
42a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20  ewStringObj(.   
42b0: 20 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49   ( (op==SQLITE_I
42c0: 4e 53 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a  NSERT)?"INSERT":
42d0: 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41  (op==SQLITE_UPDA
42e0: 54 45 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45  TE)?"UPDATE":"DE
42f0: 4c 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20  LETE"), -1));.  
4300: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4310: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
4320: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4330: 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20  bj(zDb, -1));.  
4340: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4350: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
4360: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4370: 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20  bj(zTbl, -1));. 
4380: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4390: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
43a0: 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  d, Tcl_NewWideIn
43b0: 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20  tObj(rowid));.  
43c0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
43d0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
43e0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
43f0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
4400: 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64  d tclCollateNeed
4410: 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  ed(.  void *pCtx
4420: 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ,.  sqlite3 *db,
4430: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f  .  int enc,.  co
4440: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
4450: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4460: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
4470: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
4480: 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f   *pScript = Tcl_
4490: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62  DuplicateObj(pDb
44a0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
44b0: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
44c0: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
44d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
44e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
44f0: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
4500: 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d  ringObj(zName, -
4510: 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
4520: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
4530: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
4540: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4550: 74 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f  t(pScript);.}../
4560: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4570: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  e is called to e
4580: 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63  valuate an SQL c
4590: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
45a0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
45b0: 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70   using TCL scrip
45c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
45d0: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a   tclSqlCollate(.
45e0: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20    void *pCtx,.  
45f0: 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20  int nA,.  const 
4600: 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20  void *zA,.  int 
4610: 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  nB,.  const void
4620: 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c   *zB.){.  SqlCol
4630: 6c 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f  late *p = (SqlCo
4640: 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20  llate *)pCtx;.  
4650: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a  Tcl_Obj *pCmd;..
4660: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77    pCmd = Tcl_New
4670: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63  StringObj(p->zSc
4680: 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ript, -1);.  Tcl
4690: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
46a0: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
46b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
46c0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
46d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
46e0: 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63  j(zA, nA));.  Tc
46f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4700: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
4710: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
4720: 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29  tringObj(zB, nB)
4730: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
4740: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
4750: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
4760: 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
4770: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
4780: 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54    return (atoi(T
4790: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
47a0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b  lt(p->interp)));
47b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
47c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
47d0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
47e0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  SQL function imp
47f0: 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e  lemented.** usin
4800: 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f  g TCL script..*/
4810: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c  .static void tcl
4820: 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  SqlFunc(sqlite3_
4830: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
4840: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
4850: 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29  te3_value**argv)
4860: 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d  {.  SqlFunc *p =
4870: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
4880: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54  ta(context);.  T
4890: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20  cl_Obj *pCmd;.  
48a0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
48b0: 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20  ..  if( argc==0 
48c0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
48d0: 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65  re are no argume
48e0: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
48f0: 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76  ion, call Tcl_Ev
4900: 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20  alObjEx on the. 
4910: 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a     ** script obj
4920: 65 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54  ect directly.  T
4930: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54  his allows the T
4940: 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67  CL compiler to g
4950: 65 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62  enerate.    ** b
4960: 79 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ytecode for the 
4970: 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66  command on the f
4980: 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
4990: 61 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20  and thus make.  
49a0: 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20    ** subsequent 
49b0: 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68  invocations much
49c0: 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20   faster. */.    
49d0: 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70  pCmd = p->pScrip
49e0: 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  t;.    Tcl_IncrR
49f0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4a00: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
4a10: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
4a20: 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54   pCmd, 0);.    T
4a30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4a40: 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCmd);.  }else{.
4a50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
4a60: 61 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  are arguments to
4a70: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d   the function, m
4a80: 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  ake a shallow co
4a90: 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  py of the.    **
4aa0: 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20   script object, 
4ab0: 6c 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75  lappend the argu
4ac0: 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c  ments, then eval
4ad0: 75 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20  uate the copy.. 
4ae0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20     **.    ** By 
4af0: 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20  "shallow" copy, 
4b00: 77 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74  we mean a only t
4b10: 68 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63  he outer list Tc
4b20: 6c 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61  l_Obj is duplica
4b30: 74 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ted..    ** The 
4b40: 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74  new Tcl_Obj cont
4b50: 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
4b60: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69   the original li
4b70: 73 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20  st elements. .  
4b80: 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77    ** That way, w
4b90: 68 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  hen Tcl_EvalObjv
4ba0: 28 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68  () is run and sh
4bb0: 69 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74  immers the first
4bc0: 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20   element.    ** 
4bd0: 6f 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74  of the list to t
4be0: 63 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74  clCmdNameType, t
4bf0: 68 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65  hat alternate re
4c00: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c  presentation wil
4c10: 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73  l.    ** be pres
4c20: 65 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64  erved and reused
4c30: 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76   on the next inv
4c40: 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ocation..    */.
4c50: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41      Tcl_Obj **aA
4c60: 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  rg;.    int nArg
4c70: 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69  ;.    if( Tcl_Li
4c80: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
4c90: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70  (p->interp, p->p
4ca0: 53 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26  Script, &nArg, &
4cb0: 61 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73  aArg) ){.      s
4cc0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
4cd0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c  ror(context, Tcl
4ce0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
4cf0: 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29  (p->interp), -1)
4d00: 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ; .      return;
4d10: 0a 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20  .    }     .    
4d20: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  pCmd = Tcl_NewLi
4d30: 73 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67  stObj(nArg, aArg
4d40: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
4d50: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4d60: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72     for(i=0; i<ar
4d70: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
4d80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
4d90: 49 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  In = argv[i];.  
4da0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
4db0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a  l;.            .
4dc0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61        /* Set pVa
4dd0: 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  l to contain the
4de0: 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i'th column of 
4df0: 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20  this row. */.   
4e00: 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
4e10: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49  e3_value_type(pI
4e20: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  n) ){.        ca
4e30: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
4e40: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
4e50: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
4e60: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29  value_bytes(pIn)
4e70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
4e80: 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
4e90: 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76  rayObj(sqlite3_v
4ea0: 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20  alue_blob(pIn), 
4eb0: 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20  bytes);.        
4ec0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4ed0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
4ee0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
4ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
4f00: 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c  te_int64 v = sql
4f10: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
4f20: 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  (pIn);.         
4f30: 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33   if( v>=-2147483
4f40: 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38  647 && v<=214748
4f50: 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20  3647 ){.        
4f60: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
4f70: 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  ewIntObj(v);.   
4f80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4f90: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
4fa0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
4fb0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
4fc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
4fd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4fe0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
4ff0: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
5000: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
5010: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
5020: 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20  uble(pIn);.     
5030: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
5040: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b  NewDoubleObj(r);
5050: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5060: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5070: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5080: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
5090: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
50a0: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29  StringObj("", 0)
50b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
50c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
50d0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
50e0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
50f0: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
5100: 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a  lue_bytes(pIn);.
5110: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
5120: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5130: 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  j((char *)sqlite
5140: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e  3_value_text(pIn
5150: 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20  ), bytes);.     
5160: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5170: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5180: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73      rc = Tcl_Lis
5190: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
51a0: 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  t(p->interp, pCm
51b0: 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  d, pVal);.      
51c0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
51d0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
51e0: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20  nt(pCmd);.      
51f0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5200: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
5210: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
5220: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
5230: 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65  -1); .        re
5240: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
5250: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e    }.    if( !p->
5260: 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20  useEvalObjv ){. 
5270: 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c       /* Tcl_Eval
5280: 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74  ObjEx() will aut
5290: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20  omatically call 
52a0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69  Tcl_EvalObjv() i
52b0: 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20  f pCmd.      ** 
52c0: 69 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75  is a list withou
52d0: 74 20 61 20 73 74 72 69 6e 67 20 72 65 70 72 65  t a string repre
52e0: 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70  sentation.  To p
52f0: 72 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d  revent this from
5300: 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e  .      ** happen
5310: 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70  ing, make sure p
5320: 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64 20  Cmd has a valid 
5330: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
5340: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54  ation */.      T
5350: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d  cl_GetString(pCm
5360: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  d);.    }.    rc
5370: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
5380: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
5390: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
53a0: 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  T);.    Tcl_Decr
53b0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
53c0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26    }..  if( rc &&
53d0: 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20   rc!=TCL_RETURN 
53e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
53f0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5400: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
5410: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
5420: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c  rp), -1); .  }el
5430: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  se{.    Tcl_Obj 
5440: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f  *pVar = Tcl_GetO
5450: 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  bjResult(p->inte
5460: 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  rp);.    int n;.
5470: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
5480: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
5490: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20  pVar->typePtr ? 
54a0: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
54b0: 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68  ame : "";.    ch
54c0: 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b  ar c = zType[0];
54d0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20  .    if( c=='b' 
54e0: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
54f0: 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20  "bytearray")==0 
5500: 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d  && pVar->bytes==
5510: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  0 ){.      /* On
5520: 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42  ly return a BLOB
5530: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
5540: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
5550: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
5560: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72     ** has no str
5570: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
5580: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74  on. */.      dat
5590: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
55a0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72  rrayFromObj(pVar
55b0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
55c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
55d0: 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20  (context, data, 
55e0: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
55f0: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
5600: 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74  if( c=='b' && st
5610: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
5620: 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ean")==0 ){.    
5630: 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
5640: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29  Obj(0, pVar, &n)
5650: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5660: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
5670: 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, n);.    }els
5680: 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20  e if( c=='d' && 
5690: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f  strcmp(zType,"do
56a0: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
56b0: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
56c0: 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
56d0: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
56e0: 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &r);.      sqli
56f0: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
5700: 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20  e(context, r);. 
5710: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
5720: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
5730: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
5740: 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  =0) ||.         
5750: 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63   (c=='i' && strc
5760: 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d  mp(zType,"int")=
5770: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  =0) ){.      Tcl
5780: 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20  _WideInt v;.    
5790: 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74    Tcl_GetWideInt
57a0: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
57b0: 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &v);.      sqli
57c0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
57d0: 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20  (context, v);.  
57e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
57f0: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
5800: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
5810: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72  ringFromObj(pVar
5820: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
5830: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5840: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20  (context, (char 
5850: 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  *)data, n, SQLIT
5860: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
5870: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
5880: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5890: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  UTHORIZATION./*.
58a0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61  ** This is the a
58b0: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75  uthentication fu
58c0: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65  nction.  It appe
58d0: 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69  nds the authenti
58e0: 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63  cation.** type c
58f0: 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20  ode and the two 
5900: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d  arguments to zCm
5910: 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73  d[] then invokes
5920: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f   the result.** o
5930: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
5940: 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73  r.  The reply is
5950: 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74   examined to det
5960: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a  ermine if the.**
5970: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
5980: 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64  fails or succeed
5990: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
59a0: 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a   auth_callback(.
59b0: 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20    void *pArg,.  
59c0: 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73  int code,.  cons
59d0: 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20  t char *zArg1,. 
59e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
59f0: 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g2,.  const char
5a00: 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74   *zArg3,.  const
5a10: 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a   char *zArg4.){.
5a20: 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20    char *zCode;. 
5a30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
5a40: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
5a50: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79  nst char *zReply
5a60: 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
5a70: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70  b = (SqliteDb*)p
5a80: 41 72 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e  Arg;.  if( pDb->
5a90: 64 69 73 61 62 6c 65 41 75 74 68 20 29 20 72 65  disableAuth ) re
5aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5ab0: 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20  .  switch( code 
5ac0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
5ad0: 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20  TE_COPY         
5ae0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5af0: 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61  LITE_COPY"; brea
5b00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5b10: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20  TE_CREATE_INDEX 
5b20: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5b30: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
5b40: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
5b50: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5b60: 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a  E_TABLE      : z
5b70: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
5b80: 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  ATE_TABLE"; brea
5b90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5ba0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
5bb0: 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51  NDEX : zCode="SQ
5bc0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
5bd0: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
5be0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5bf0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
5c00: 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  E : zCode="SQLIT
5c10: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
5c20: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
5c30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
5c40: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
5c50: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5c60: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47  CREATE_TEMP_TRIG
5c70: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
5c80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
5c90: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a  ATE_TEMP_VIEW  :
5ca0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5cb0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22  REATE_TEMP_VIEW"
5cc0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5cd0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
5ce0: 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f  TRIGGER    : zCo
5cf0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
5d00: 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  E_TRIGGER"; brea
5d10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5d20: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20  TE_CREATE_VIEW  
5d30: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5d40: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
5d50: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5d60: 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  se SQLITE_DELETE
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
5d80: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45  ode="SQLITE_DELE
5d90: 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TE"; break;.    
5da0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5db0: 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20  _INDEX        : 
5dc0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5dd0: 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  OP_INDEX"; break
5de0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5df0: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20  E_DROP_TABLE    
5e00: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5e10: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b  ITE_DROP_TABLE";
5e20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5e30: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
5e40: 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64  P_INDEX   : zCod
5e50: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
5e60: 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  EMP_INDEX"; brea
5e70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5e80: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
5e90: 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  LE   : zCode="SQ
5ea0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
5eb0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
5ec0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
5ed0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20  OP_TEMP_TRIGGER 
5ee0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5ef0: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
5f00: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
5f10: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
5f20: 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a  TEMP_VIEW    : z
5f30: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
5f40: 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  P_TEMP_VIEW"; br
5f50: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5f60: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
5f70: 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  R      : zCode="
5f80: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
5f90: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
5fa0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
5fb0: 50 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a  P_VIEW         :
5fc0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
5fd0: 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  ROP_VIEW"; break
5fe0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5ff0: 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20  E_INSERT        
6000: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6010: 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65  ITE_INSERT"; bre
6020: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6030: 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20  ITE_PRAGMA      
6040: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6050: 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62  QLITE_PRAGMA"; b
6060: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6070: 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20  QLITE_READ      
6080: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6090: 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62  "SQLITE_READ"; b
60a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
60b0: 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20  QLITE_SELECT    
60c0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
60d0: 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b  "SQLITE_SELECT";
60e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
60f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
6100: 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  ION       : zCod
6110: 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e="SQLITE_TRANSA
6120: 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20  CTION"; break;. 
6130: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
6140: 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20  PDATE           
6150: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6160: 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b  _UPDATE"; break;
6170: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6180: 5f 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20  _ATTACH         
6190: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
61a0: 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61  TE_ATTACH"; brea
61b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
61c0: 54 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20  TE_DETACH       
61d0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
61e0: 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72  LITE_DETACH"; br
61f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6200: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
6210: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6220: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
6230: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
6240: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e  case SQLITE_REIN
6250: 44 45 58 20 20 20 20 20 20 20 20 20 20 20 3a 20  DEX           : 
6260: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
6270: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6280: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
6290: 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20  NALYZE          
62a0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
62b0: 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b  _ANALYZE"; break
62c0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
62d0: 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20  E_CREATE_VTABLE 
62e0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
62f0: 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c  ITE_CREATE_VTABL
6300: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
6310: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
6320: 56 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a  VTABLE       : z
6330: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
6340: 50 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  P_VTABLE"; break
6350: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6360: 45 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20  E_FUNCTION      
6370: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6380: 49 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62  ITE_FUNCTION"; b
6390: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
63a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
63b0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
63c0: 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20  "????"; break;. 
63d0: 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67   }.  Tcl_DString
63e0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
63f0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
6400: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68  &str, pDb->zAuth
6410: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
6420: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
6430: 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a  t(&str, zCode);.
6440: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
6450: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
6460: 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a   zArg1 ? zArg1 :
6470: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
6480: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
6490: 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a  (&str, zArg2 ? z
64a0: 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg2 : "");.  Tc
64b0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
64c0: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
64d0: 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29  g3 ? zArg3 : "")
64e0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
64f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
6500: 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34  r, zArg4 ? zArg4
6510: 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54   : "");.  rc = T
6520: 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44  cl_GlobalEval(pD
6530: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
6540: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
6550: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
6560: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a  gFree(&str);.  z
6570: 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53  Reply = Tcl_GetS
6580: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
6590: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  >interp);.  if( 
65a0: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
65b0: 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b  QLITE_OK")==0 ){
65c0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
65d0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
65e0: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
65f0: 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30  SQLITE_DENY")==0
6600: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
6610: 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73  ITE_DENY;.  }els
6620: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
6630: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f  ply,"SQLITE_IGNO
6640: 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  RE")==0 ){.    r
6650: 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  c = SQLITE_IGNOR
6660: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
6670: 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20  rc = 999;.  }.  
6680: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
6690: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
66a0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
66b0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74   */../*.** zText
66c0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
66d0: 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76   text obtained v
66e0: 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65  ia an sqlite3_re
66f0: 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f  sult_text().** o
6700: 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66  r similar interf
6710: 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ace. This routin
6720: 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20  e returns a Tcl 
6730: 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a  string object, .
6740: 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ** reference cou
6750: 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e  nt set to 0, con
6760: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74  taining the text
6770: 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69  . If a translati
6780: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73  on.** between is
6790: 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20  o8859 and UTF-8 
67a0: 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20  is required, it 
67b0: 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f  is preformed..*/
67c0: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
67d0: 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61  *dbTextToObj(cha
67e0: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b  r const *zText){
67f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c  .  Tcl_Obj *pVal
6800: 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41  ;.#ifdef UTF_TRA
6810: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a  NSLATION_NEEDED.
6820: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43    Tcl_DString dC
6830: 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ol;.  Tcl_DStrin
6840: 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20  gInit(&dCol);.  
6850: 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74  Tcl_ExternalToUt
6860: 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a  fDString(NULL, z
6870: 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29  Text, -1, &dCol)
6880: 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e  ;.  pVal = Tcl_N
6890: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
68a0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43  DStringValue(&dC
68b0: 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ol), -1);.  Tcl_
68c0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f  DStringFree(&dCo
68d0: 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c  l);.#else.  pVal
68e0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
68f0: 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a  Obj(zText, -1);.
6900: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
6910: 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pVal;.}../*.** T
6920: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
6930: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
6940: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
6950: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
6960: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
6970: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
6980: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
6990: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
69a0: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
69b0: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
69c0: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
69d0: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
69e0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ls..**.** The in
69f0: 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20  terface is like 
6a00: 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e  "readline" but n
6a10: 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65  o command-line e
6a20: 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e  diting.** is don
6a30: 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20  e..**.** copied 
6a40: 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f  from shell.c fro
6a50: 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d  m '.import' comm
6a60: 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  and.*/.static ch
6a70: 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  ar *local_getlin
6a80: 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c  e(char *zPrompt,
6a90: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68   FILE *in){.  ch
6aa0: 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74  ar *zLine;.  int
6ab0: 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b   nLine;.  int n;
6ac0: 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e  .  int eol;..  n
6ad0: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
6ae0: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
6af0: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
6b00: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
6b10: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c  ;.  n = 0;.  eol
6b20: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21   = 0;.  while( !
6b30: 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  eol ){.    if( n
6b40: 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20  +100>nLine ){.  
6b50: 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e      nLine = nLin
6b60: 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20  e*2 + 100;.     
6b70: 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63   zLine = realloc
6b80: 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a  (zLine, nLine);.
6b90: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d        if( zLine=
6ba0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
6bb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65     }.    if( fge
6bc0: 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c  ts(&zLine[n], nL
6bd0: 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20  ine - n, in)==0 
6be0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  ){.      if( n==
6bf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65  0 ){.        fre
6c00: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
6c10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6c20: 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b    }.      zLine[
6c30: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
6c40: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  l = 1;.      bre
6c50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  ak;.    }.    wh
6c60: 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b  ile( zLine[n] ){
6c70: 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   n++; }.    if( 
6c80: 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31  n>0 && zLine[n-1
6c90: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
6ca0: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   n--;.      zLin
6cb0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
6cc0: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  eol = 1;.    }. 
6cd0: 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61   }.  zLine = rea
6ce0: 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31  lloc( zLine, n+1
6cf0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69   );.  return zLi
6d00: 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69  ne;.}.../*.** Fi
6d10: 67 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c  gure out the col
6d20: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  umn names for th
6d30: 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
6d40: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
6d50: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
6d60: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6d70: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  t..**.** If para
6d80: 6d 65 74 65 72 20 70 61 70 43 6f 6c 4e 61 6d 65  meter papColName
6d90: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
6da0: 65 6e 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 69  en *papColName i
6db0: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 0a 2a  s set to point.*
6dc0: 2a 20 61 74 20 61 6e 20 61 72 72 61 79 20 61 6c  * at an array al
6dd0: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 54 63  located using Tc
6de0: 6c 5f 41 6c 6c 6f 63 28 29 2e 20 49 74 20 69 73  l_Alloc(). It is
6df0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
6e00: 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74  ponsibility.** t
6e10: 6f 20 66 72 65 65 20 74 68 69 73 20 61 72 72 61  o free this arra
6e20: 79 20 75 73 69 6e 67 20 54 63 6c 5f 46 72 65 65  y using Tcl_Free
6e30: 28 29 2c 20 61 6e 64 20 74 6f 20 64 65 63 72 65  (), and to decre
6e40: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
6e50: 63 65 0a 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 65  ce.** count of e
6e60: 61 63 68 20 54 63 6c 5f 4f 62 6a 2a 20 6d 65 6d  ach Tcl_Obj* mem
6e70: 62 65 72 20 6f 66 20 74 68 65 20 61 72 72 61 79  ber of the array
6e80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
6e90: 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
6ea0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
6eb0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
6ec0: 6e 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20 72 65  ns of data.** re
6ed0: 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20  turned by pStmt 
6ee0: 28 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 73  (and hence the s
6ef0: 69 7a 65 20 6f 66 20 74 68 65 20 2a 70 61 70 43  ize of the *papC
6f00: 6f 6c 4e 61 6d 65 20 61 72 72 61 79 29 2e 0a 2a  olName array)..*
6f10: 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69  *.** If pArray i
6f20: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
6f30: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   it contains the
6f40: 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61   name of a Tcl a
6f50: 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65  rray.** variable
6f60: 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72  . The "*" member
6f70: 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 20 69   of this array i
6f80: 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20  s set to a list 
6f90: 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68  containing.** th
6fa0: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
6fb0: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
6fc0: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
6fd0: 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 0a  , in order from.
6fe0: 2a 2a 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  ** left to right
6ff0: 2e 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61  . e.g. if the na
7000: 6d 65 73 20 6f 66 20 74 68 65 20 72 65 74 75 72  mes of the retur
7010: 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ned columns are 
7020: 61 2c 20 62 20 61 6e 64 0a 2a 2a 20 63 2c 20 69  a, b and.** c, i
7030: 74 20 64 6f 65 73 20 74 68 65 20 65 71 75 69 76  t does the equiv
7040: 61 6c 65 6e 74 20 6f 66 20 74 68 65 20 74 63 6c  alent of the tcl
7050: 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20   command:.**.** 
7060: 20 20 20 20 73 65 74 20 24 7b 70 41 72 72 61 79      set ${pArray
7070: 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a  }(*) {a b c}.*/.
7080: 73 74 61 74 69 63 20 69 6e 74 0a 63 6f 6d 70 75  static int.compu
7090: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
70a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
70b0: 65 72 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  erp, .  sqlite3_
70c0: 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20 20  stmt *pStmt,    
70d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
70e0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
70f0: 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f  Tcl_Obj ***papCo
7100: 6c 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  lName,          
7110: 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20    /* OUT: Array 
7120: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
7130: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41  */.  Tcl_Obj *pA
7140: 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20  rray            
7150: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7160: 66 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  f array variable
7170: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
7180: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  /.){.  int nCol;
7190: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
71a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
71b0: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
71c0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
71d0: 6d 74 29 3b 0a 20 20 69 66 28 20 70 61 70 43 6f  mt);.  if( papCo
71e0: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74  lName ){.    int
71f0: 20 69 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   i;.    Tcl_Obj 
7200: 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54  **apColName = (T
7210: 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c  cl_Obj**)Tcl_All
7220: 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f  oc( sizeof(Tcl_O
7230: 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20  bj*)*nCol );.   
7240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
7250: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70  ; i++){.      ap
7260: 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54  ColName[i] = dbT
7270: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
7280: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
7290: 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 54 63  mt,i));.      Tc
72a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61  l_IncrRefCount(a
72b0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
72c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 72    }..    /* If r
72d0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
72e0: 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72   stored in an ar
72f0: 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68  ray variable, th
7300: 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 2a 2a  en create.    **
7310: 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e   the array(*) en
7320: 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72 72  try for that arr
7330: 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ay.    */.    if
7340: 28 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20  ( pArray ){.    
7350: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c    Tcl_Obj *pColL
7360: 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ist = Tcl_NewObj
7370: 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  ();.      Tcl_Ob
7380: 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e  j *pStar = Tcl_N
7390: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c  ewStringObj("*",
73a0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f   -1);.      Tcl_
73b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f  IncrRefCount(pCo
73c0: 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f  lList);.      fo
73d0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
73e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  ++){.        Tcl
73f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
7400: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43  ement(interp, pC
7410: 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d  olList, apColNam
7420: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e[i]);.      }. 
7430: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
7440: 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20  Count(pStar);.  
7450: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
7460: 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61  r2(interp, pArra
7470: 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69  y, pStar, pColLi
7480: 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 54 63 6c  st,0);.      Tcl
7490: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
74a0: 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 54  olList);.      T
74b0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
74c0: 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pStar);.    }.  
74d0: 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20    *papColName = 
74e0: 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 0a  apColName;.  }..
74f0: 20 20 72 65 74 75 72 6e 20 6e 43 6f 6c 3b 0a 7d    return nCol;.}
7500: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c  ../*.** The "sql
7510: 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c  ite" command bel
7520: 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  ow creates a new
7530: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72   Tcl command for
7540: 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74   each.** connect
7550: 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20  ion it opens to 
7560: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
7570: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7580: 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20  e is invoked.** 
7590: 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20  whenever one of 
75a0: 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  those connection
75b0: 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e  -specific comman
75c0: 64 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a  ds is executed.*
75d0: 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65  * in Tcl.  For e
75e0: 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72  xample, if you r
75f0: 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65  un Tcl code like
7600: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
7610: 20 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20     sqlite3 db1  
7620: 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a  "my_database".**
7630: 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65         db1 close
7640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
7650: 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61   command opens a
7660: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
7670: 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22  he "my_database"
7680: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64   database.** and
7690: 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e   calls that conn
76a0: 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54  ection "db1".  T
76b0: 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e  he second comman
76c0: 64 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a  d causes this.**
76d0: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62   subroutine to b
76e0: 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74  e invoked..*/.st
76f0: 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d  atic int DbObjCm
7700: 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  d(void *cd, Tcl_
7710: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7720: 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
7730: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
7740: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
7750: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
7760: 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20    int choice;.  
7770: 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b  int rc = TCL_OK;
7780: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
7790: 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20  char *DB_strs[] 
77a0: 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69  = {.    "authori
77b0: 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62  zer",         "b
77c0: 75 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  usy",           
77d0: 20 20 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20     "cache",.    
77e0: 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  "changes",      
77f0: 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20        "close",  
7800: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c             "coll
7810: 61 74 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61  ate",.    "colla
7820: 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20  tion_needed",   
7830: 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20  "commit_hook",  
7840: 20 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c       "complete",
7850: 0a 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20  .    "copy",    
7860: 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 61 62             "enab
7870: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
7880: 6e 22 2c 22 65 72 72 6f 72 63 6f 64 65 22 2c 0a  n","errorcode",.
7890: 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20      "eval",     
78a0: 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73 74            "exist
78b0: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  s",            "
78c0: 66 75 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22  function",.    "
78d0: 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20  incrblob",      
78e0: 20 20 20 20 20 22 69 6e 74 65 72 72 75 70 74 22       "interrupt"
78f0: 2c 20 20 20 20 20 20 20 20 20 22 6c 61 73 74 5f  ,         "last_
7900: 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 0a 20  insert_rowid",. 
7910: 20 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20     "nullvalue", 
7920: 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c           "onecol
7930: 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 22 70  umn",         "p
7940: 72 6f 66 69 6c 65 22 2c 0a 20 20 20 20 22 70 72  rofile",.    "pr
7950: 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20 20 20  ogress",        
7960: 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20     "rekey",     
7970: 20 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63          "rollbac
7980: 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 74 69  k_hook",.    "ti
7990: 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20  meout",         
79a0: 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65     "total_change
79b0: 73 22 2c 20 20 20 20 20 22 74 72 61 63 65 22 2c  s",     "trace",
79c0: 0a 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f  .    "transactio
79d0: 6e 22 2c 20 20 20 20 20 20 20 20 22 75 70 64 61  n",        "upda
79e0: 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20  te_hook",       
79f0: 22 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 30  "version",.    0
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d      .  };.  enum
7a20: 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44   DB_enum {.    D
7a30: 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20  B_AUTHORIZER,   
7a40: 20 20 20 20 20 44 42 5f 42 55 53 59 2c 20 20 20       DB_BUSY,   
7a50: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 41 43            DB_CAC
7a60: 48 45 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e 47  HE,.    DB_CHANG
7a70: 45 53 2c 20 20 20 20 20 20 20 20 20 20 20 44 42  ES,           DB
7a80: 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20  _CLOSE,         
7a90: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20     DB_COLLATE,. 
7aa0: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f     DB_COLLATION_
7ab0: 4e 45 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d  NEEDED,  DB_COMM
7ac0: 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42  IT_HOOK,      DB
7ad0: 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44  _COMPLETE,.    D
7ae0: 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20  B_COPY,         
7af0: 20 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c       DB_ENABLE_L
7b00: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42  OAD_EXTENSION,DB
7b10: 5f 45 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20  _ERRORCODE,.    
7b20: 44 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20  DB_EVAL,        
7b30: 20 20 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c        DB_EXISTS,
7b40: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 46 55             DB_FU
7b50: 4e 43 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 49  NCTION,.    DB_I
7b60: 4e 43 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20  NCRBLOB,        
7b70: 20 20 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 20    DB_INTERRUPT, 
7b80: 20 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49         DB_LAST_I
7b90: 4e 53 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20  NSERT_ROWID,.   
7ba0: 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20   DB_NULLVALUE,  
7bb0: 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c         DB_ONECOL
7bc0: 55 4d 4e 2c 20 20 20 20 20 20 20 20 44 42 5f 50  UMN,        DB_P
7bd0: 52 4f 46 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50  ROFILE,.    DB_P
7be0: 52 4f 47 52 45 53 53 2c 20 20 20 20 20 20 20 20  ROGRESS,        
7bf0: 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20    DB_REKEY,     
7c00: 20 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41         DB_ROLLBA
7c10: 43 4b 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f  CK_HOOK,.    DB_
7c20: 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20  TIMEOUT,        
7c30: 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e     DB_TOTAL_CHAN
7c40: 47 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45  GES,    DB_TRACE
7c50: 2c 0a 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43  ,.    DB_TRANSAC
7c60: 54 49 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55  TION,       DB_U
7c70: 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20  PDATE_HOOK,     
7c80: 20 44 42 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b   DB_VERSION.  };
7c90: 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76  .  /* don't leav
7ca0: 65 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61  e trailing comma
7cb0: 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74  s on DB_enum, it
7cc0: 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49   confuses the AI
7cd0: 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a  X xlc compiler *
7ce0: 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20  /..  if( objc<2 
7cf0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
7d00: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
7d10: 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d  1, objv, "SUBCOM
7d20: 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  MAND ...");.    
7d30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7d40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
7d50: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
7d60: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
7d70: 20 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f   DB_strs, "optio
7d80: 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20  n", 0, &choice) 
7d90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
7da0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
7db0: 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42  switch( (enum DB
7dc0: 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a  _enum)choice ){.
7dd0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74  .  /*    $db aut
7de0: 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43  horizer ?CALLBAC
7df0: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
7e00: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
7e10: 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72  llback to author
7e20: 69 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65  ize each SQL ope
7e30: 72 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a  ration as it is.
7e40: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20    ** compiled.  
7e50: 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  5 arguments are 
7e60: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
7e70: 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20  callback before 
7e80: 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b  it is.  ** invok
7e90: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
7ea0: 28 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a  (1) The authoriz
7eb0: 61 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20  ation type (ex: 
7ec0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
7ed0: 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  BLE, SQLITE_INSE
7ee0: 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20  RT, ...).  **   
7ef0: 28 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69  (2) First descri
7f00: 70 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65  ptive name (depe
7f10: 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61  nds on authoriza
7f20: 74 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20  tion type).  ** 
7f30: 20 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73    (3) Second des
7f40: 63 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20  criptive name.  
7f50: 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66  **   (4) Name of
7f60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65   the database (e
7f70: 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  x: "main", "temp
7f80: 22 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61  ").  **   (5) Na
7f90: 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68  me of trigger th
7fa0: 61 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20  at is doing the 
7fb0: 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a  access.  **.  **
7fc0: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68   The callback sh
7fd0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f  ould return on o
7fe0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
7ff0: 73 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f  strings: SQLITE_
8000: 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  OK,.  ** SQLITE_
8010: 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54  IGNORE, or SQLIT
8020: 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68  E_DENY.  Any oth
8030: 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
8040: 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a  is an error..  *
8050: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d  *.  ** If this m
8060: 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64  ethod is invoked
8070: 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
8080: 74 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20  ts, the current 
8090: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20  authorization.  
80a0: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69  ** callback stri
80b0: 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ng is returned..
80c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41    */.  case DB_A
80d0: 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66  UTHORIZER: {.#if
80e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
80f0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
8100: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8110: 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68  lt(interp, "auth
8120: 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76  orization not av
8130: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20  ailable in this 
8140: 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20  build", 0);.    
8150: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8160: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
8170: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
8180: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
8190: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
81a0: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
81b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
81c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
81d0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
81e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
81f0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
8200: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8210: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
8220: 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20  zAuth, 0);.     
8230: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8240: 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b      char *zAuth;
8250: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
8260: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
8270: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
8280: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41  Tcl_Free(pDb->zA
8290: 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uth);.      }.  
82a0: 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f      zAuth = Tcl_
82b0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
82c0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
82d0: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68  .      if( zAuth
82e0: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
82f0: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
8300: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
8310: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
8320: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74  memcpy(pDb->zAut
8330: 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29  h, zAuth, len+1)
8340: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8350: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74         pDb->zAut
8360: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  h = 0;.      }. 
8370: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
8380: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  uth ){.        p
8390: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
83a0: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
83b0: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
83c0: 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74  zer(pDb->db, aut
83d0: 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29  h_callback, pDb)
83e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
83f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8400: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44  et_authorizer(pD
8410: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
8420: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
8430: 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
8440: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62  }..  /*    $db b
8450: 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  usy ?CALLBACK?. 
8460: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
8470: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
8480: 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61  ck if an SQL sta
8490: 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20  tement attempts 
84a0: 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c  to open.  ** a l
84b0: 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66  ocked database f
84c0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ile..  */.  case
84d0: 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20   DB_BUSY: {.    
84e0: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
84f0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
8500: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
8510: 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22  objv, "CALLBACK"
8520: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8530: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8540: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
8550: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
8560: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
8570: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8580: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
8590: 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20  ->zBusy, 0);.   
85a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
85b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73        char *zBus
85c0: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  y;.      int len
85d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
85e0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
85f0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
8600: 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a  zBusy);.      }.
8610: 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63        zBusy = Tc
8620: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
8630: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
8640: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75  );.      if( zBu
8650: 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  sy && len>0 ){. 
8660: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
8670: 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  y = Tcl_Alloc( l
8680: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
8690: 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42    memcpy(pDb->zB
86a0: 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b  usy, zBusy, len+
86b0: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
86c0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
86d0: 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  usy = 0;.      }
86e0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
86f0: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
8700: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
8710: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
8720: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
8730: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42  ler(pDb->db, DbB
8740: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  usyHandler, pDb)
8750: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8760: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
8770: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
8780: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
8790: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
87a0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
87b0: 20 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75     $db cache flu
87c0: 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  sh.  **     $db 
87d0: 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a  cache size n.  *
87e0: 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65  *.  ** Flush the
87f0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
8800: 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65  ent cache, or se
8810: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  t the maximum nu
8820: 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63  mber of.  ** cac
8830: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  hed statements..
8840: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
8850: 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72  ACHE: {.    char
8860: 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e   *subCmd;.    in
8870: 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  t n;..    if( ob
8880: 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc<=2 ){.      T
8890: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
88a0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
88b0: 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f   "cache option ?
88c0: 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  arg?");.      re
88d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
88e0: 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64      }.    subCmd
88f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
8900: 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d  FromObj( objv[2]
8910: 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a  , 0 );.    if( *
8920: 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73  subCmd=='f' && s
8930: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c  trcmp(subCmd,"fl
8940: 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ush")==0 ){.    
8950: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
8960: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
8970: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8980: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73  , 2, objv, "flus
8990: 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  h");.        ret
89a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
89b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
89c0: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
89d0: 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20  he( pDb );.     
89e0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
89f0: 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26   *subCmd=='s' &&
8a00: 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22   strcmp(subCmd,"
8a10: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
8a20: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
8a30: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
8a40: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
8a50: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a  p, 2, objv, "siz
8a60: 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  e n");.        r
8a70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8a80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8a90: 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52        if( TCL_ER
8aa0: 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46  ROR==Tcl_GetIntF
8ab0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
8ac0: 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20  bjv[3], &n) ){. 
8ad0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
8ae0: 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72  endResult( inter
8af0: 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65  p, "cannot conve
8b00: 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  rt \"", .       
8b10: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
8b20: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8b30: 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20  v[3],0), "\" to 
8b40: 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20  integer", 0);.  
8b50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
8b60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
8b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8b80: 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20     if( n<0 ){.  
8b90: 20 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53            flushS
8ba0: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
8bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
8bc0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
8bd0: 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52  lse if( n>MAX_PR
8be0: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a  EPARED_STMTS ){.
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
8c00: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
8c10: 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  TS;.          }.
8c20: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d            pDb->m
8c30: 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20  axStmt = n;.    
8c40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8c50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
8c60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8c70: 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70   interp, "bad op
8c80: 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20  tion \"", .     
8c90: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
8ca0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
8cb0: 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20  ],0), "\": must 
8cc0: 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65  be flush or size
8cd0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
8ce0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8cf0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
8d00: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
8d10: 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  b changes.  **. 
8d20: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
8d30: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
8d40: 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
8d50: 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
8d60: 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74  eleted by.  ** t
8d70: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49  he most recent I
8d80: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
8d90: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
8da0: 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  t, not including
8db0: 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67   .  ** any chang
8dc0: 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67  es made by trigg
8dd0: 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a  er programs..  *
8de0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e  /.  case DB_CHAN
8df0: 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
8e00: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
8e10: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
8e20: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
8e30: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
8e40: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
8e50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8e60: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
8e70: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
8e80: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
8e90: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
8ea0: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
8eb0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44  lite3_changes(pD
8ec0: 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
8ed0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
8ee0: 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a   $db close.  **.
8ef0: 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68    ** Shutdown th
8f00: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a  e database.  */.
8f10: 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a    case DB_CLOSE:
8f20: 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74   {.    Tcl_Delet
8f30: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
8f40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8f50: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
8f60: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
8f70: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
8f80: 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41    $db collate NA
8f90: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
8fa0: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
8fb0: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
8fc0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
8fd0: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
8fe0: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
8ff0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
9000: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
9010: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
9020: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
9030: 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   DB_COLLATE: {. 
9040: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
9050: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61  Collate;.    cha
9060: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
9070: 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20  ar *zScript;.   
9080: 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20   int nScript;.  
9090: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
90a0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
90b0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
90c0: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
90d0: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
90e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
90f0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
9100: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
9110: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
9120: 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74   0);.    zScript
9130: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
9140: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
9150: 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20   &nScript);.    
9160: 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43  pCollate = (SqlC
9170: 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f  ollate*)Tcl_Allo
9180: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c  c( sizeof(*pColl
9190: 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b  ate) + nScript +
91a0: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
91b0: 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75  ollate==0 ) retu
91c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
91d0: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65    pCollate->inte
91e0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
91f0: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
9200: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
9210: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
9220: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a  zScript = (char*
9230: 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20  )&pCollate[1];. 
9240: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
9250: 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   = pCollate;.   
9260: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65   memcpy(pCollate
9270: 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69  ->zScript, zScri
9280: 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a  pt, nScript+1);.
9290: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
92a0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
92b0: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
92c0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
92d0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
92e0: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
92f0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
9300: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
9310: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
9320: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
9330: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
9340: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9350: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9360: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
9370: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
9380: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
9390: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
93a0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
93b0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
93c0: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
93d0: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
93e0: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
93f0: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
9400: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
9410: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
9420: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
9430: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
9440: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
9450: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
9460: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
9470: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
9480: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
9490: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
94a0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
94b0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
94c0: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
94d0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
94e0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
94f0: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
9500: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
9510: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
9520: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
9530: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
9540: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
9550: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
9560: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
9570: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
9580: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
9590: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
95a0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
95b0: 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
95c0: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
95d0: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
95e0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
95f0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
9600: 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
9610: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
9620: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
9630: 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
9640: 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
9650: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
9660: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
9670: 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
9680: 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
9690: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
96a0: 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
96b0: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
96c0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
96d0: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
96e0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
96f0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
9700: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9710: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
9720: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
9730: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9740: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
9750: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
9760: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
9770: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
9780: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9790: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
97a0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
97b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
97c0: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20  char *zCommit;. 
97d0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
97e0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
97f0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
9800: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43  Tcl_Free(pDb->zC
9810: 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ommit);.      }.
9820: 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
9830: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
9840: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
9850: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
9860: 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20  Commit && len>0 
9870: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
9880: 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c  zCommit = Tcl_Al
9890: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
98a0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
98b0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f  Db->zCommit, zCo
98c0: 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  mmit, len+1);.  
98d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
98e0: 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
98f0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9900: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
9910: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mit ){.        p
9920: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
9930: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
9940: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
9950: 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d  (pDb->db, DbComm
9960: 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  itHandler, pDb);
9970: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
9990: 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  mmit_hook(pDb->d
99a0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
99b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
99c0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
99d0: 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  $db complete SQL
99e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
99f0: 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20 69 73  n TRUE if SQL is
9a00: 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20   a complete SQL 
9a10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
9a20: 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a  rn FALSE if.  **
9a30: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65   additional line
9a40: 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e  s of input are n
9a50: 65 65 64 65 64 2e 20 20 54 68 69 73 20 69 73 20  eeded.  This is 
9a60: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
9a70: 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e   ** built-in "in
9a80: 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d  fo complete" com
9a90: 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a  mand of Tcl..  *
9aa0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50  /.  case DB_COMP
9ab0: 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20  LETE: {.#ifndef 
9ac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
9ad0: 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  LETE.    Tcl_Obj
9ae0: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
9af0: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20  nt isComplete;. 
9b00: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
9b10: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
9b20: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9b30: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29   2, objv, "SQL")
9b40: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
9b50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9b60: 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d      isComplete =
9b70: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
9b80: 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  e( Tcl_GetString
9b90: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
9ba0: 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75   0) );.    pResu
9bb0: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
9bc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
9bd0: 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61     Tcl_SetBoolea
9be0: 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73  nObj(pResult, is
9bf0: 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69  Complete);.#endi
9c00: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
9c10: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
9c20: 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  py conflict-algo
9c30: 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65  rithm table file
9c40: 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f  name ?SEPARATOR?
9c50: 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
9c60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20  .  **.  ** Copy 
9c70: 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20  data into table 
9c80: 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f  from filename, o
9c90: 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20  ptionally using 
9ca0: 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61  SEPARATOR.  ** a
9cb0: 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  s column separat
9cc0: 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d  ors.  If a colum
9cd0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c  n contains a nul
9ce0: 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65  l string, or the
9cf0: 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e  .  ** value of N
9d00: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20  ULLINDICATOR, a 
9d10: 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64  NULL is inserted
9d20: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e   for the column.
9d30: 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61  .  ** conflict-a
9d40: 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20  lgorithm is one 
9d50: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f  of the sqlite co
9d60: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
9d70: 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62  s:.  **    rollb
9d80: 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c  ack, abort, fail
9d90: 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63  , ignore, replac
9da0: 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73  e.  ** On succes
9db0: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  s, return the nu
9dc0: 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
9dd0: 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63  ocessed, not nec
9de0: 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20  essarily same.  
9df0: 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65  ** as 'db change
9e00: 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69  s' due to confli
9e10: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c  ct-algorithm sel
9e20: 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ected..  **.  **
9e30: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61   This code is ba
9e40: 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65  sically an imple
9e50: 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63  mentation/enhanc
9e60: 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68  ement of.  ** th
9e70: 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e  e sqlite3 shell.
9e80: 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d  c ".import" comm
9e90: 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  and..  **.  ** T
9ea0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67  his command usag
9eb0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9ec0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78  to the sqlite2.x
9ed0: 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c   COPY statement,
9ee0: 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f  .  ** which impo
9ef0: 72 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e  rts file data in
9f00: 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67  to a table using
9f10: 20 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20   the PostgreSQL 
9f20: 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74  COPY file format
9f30: 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70  :.  **   $db cop
9f40: 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20  y $conflit_algo 
9f50: 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c  $table_name $fil
9f60: 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a  ename \t \\N.  *
9f70: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59  /.  case DB_COPY
9f80: 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  : {.    char *zT
9f90: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
9fa0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
9fb0: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
9fc0: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
9fd0: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
9fe0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
9ff0: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
a000: 65 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a  extract data */.
a010: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c      char *zConfl
a020: 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ict;            
a030: 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20  /* The conflict 
a040: 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65  algorithm to use
a050: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
a060: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
a070: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65      /* A stateme
a080: 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  nt */.    int nC
a090: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
a0a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a0b0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
a0c0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
a0d0: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
a0e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a0f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
a100: 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a   an SQL string *
a110: 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20  /.    int i, j; 
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a140: 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  rs */.    int nS
a150: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
a160: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a170: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70  of bytes in zSep
a180: 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  [] */.    int nN
a190: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
a1a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a1b0: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c  of bytes in zNul
a1c0: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  l[] */.    char 
a1d0: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
a1e0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c         /* An SQL
a1f0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a200: 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20    char *zLine;  
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a220: 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   A single line o
a230: 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65  f input from the
a240: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61   file */.    cha
a250: 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20  r **azCol;      
a260: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e           /* zLin
a270: 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e  e[] broken up in
a280: 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  to columns */.  
a290: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a2b0: 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63   How to commit c
a2c0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49  hanges */.    FI
a2d0: 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
a2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a2f0: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
a300: 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20     int lineno = 
a310: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
a320: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66  * Line number of
a330: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
a340: 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d     char zLineNum
a350: 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [80];          /
a360: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72  * Line number pr
a370: 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  int buffer */.  
a380: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
a390: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  lt;           /*
a3a0: 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a   interp result *
a3b0: 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65  /..    char *zSe
a3c0: 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  p;.    char *zNu
a3d0: 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ll;.    if( objc
a3e0: 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a  <5 || objc>7 ){.
a3f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
a400: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
a410: 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20  , objv, .       
a420: 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f    "CONFLICT-ALGO
a430: 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45  RITHM TABLE FILE
a440: 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f  NAME ?SEPARATOR?
a450: 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
a460: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
a470: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a480: 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d  }.    if( objc>=
a490: 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  6 ){.      zSep 
a4a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
a4b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20  romObj(objv[5], 
a4c0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
a4d0: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22       zSep = "\t"
a4e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a4f0: 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20  objc>=7 ){.     
a500: 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74   zNull = Tcl_Get
a510: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
a520: 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[6], 0);.    }
a530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  else{.      zNul
a540: 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20  l = "";.    }.  
a550: 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63    zConflict = Tc
a560: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a570: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
a580: 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c      zTable = Tcl
a590: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a5a0: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
a5b0: 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47     zFile = Tcl_G
a5c0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a5d0: 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  objv[4], 0);.   
a5e0: 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a   nSep = strlen(z
a5f0: 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20  Sep);.    nNull 
a600: 3d 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b  = strlen(zNull);
a610: 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30  .    if( nSep==0
a620: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
a630: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a640: 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75  p,"Error: non-nu
a650: 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  ll separator req
a660: 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c  uired for copy",
a670: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
a680: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a690: 7d 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65 33  }.    if(sqlite3
a6a0: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
a6b0: 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21  t, "rollback") !
a6c0: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
a6d0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
a6e0: 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20  nflict, "abort" 
a6f0: 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
a700: 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d     sqlite3StrICm
a710: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61  p(zConflict, "fa
a720: 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26  il"    ) != 0 &&
a730: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  .       sqlite3S
a740: 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  trICmp(zConflict
a750: 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d  , "ignore"  ) !=
a760: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c   0 &&.       sql
a770: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e  ite3StrICmp(zCon
a780: 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22  flict, "replace"
a790: 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20   ) != 0 ) {.    
a7a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a7b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
a7c0: 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63  r: \"", zConflic
a7d0: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
a7e0: 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  "\", conflict-al
a7f0: 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20  gorithm must be 
a800: 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b  one of: rollback
a810: 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
a820: 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67  "abort, fail, ig
a830: 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65  nore, or replace
a840: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
a850: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a860: 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
a870: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a880: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
a890: 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
a8a0: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
a8b0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
a8c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a8d0: 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
a8e0: 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
a8f0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  e, 0);.      ret
a900: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a910: 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
a920: 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20   strlen(zSql);. 
a930: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
a940: 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
a950: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
a960: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
a970: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
a980: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
a990: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a9a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
a9b0: 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
a9c0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
a9d0: 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
a9e0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
a9f0: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
aa00: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
aa10: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
aa20: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
aa30: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
aa40: 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
aa50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
aa60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
aa70: 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
aa80: 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
aa90: 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
aaa0: 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
aab0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
aac0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
aad0: 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
aae0: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  )", 0);.      re
aaf0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ab00: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ab10: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
ab20: 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +50, zSql, "INSE
ab30: 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25  RT OR %q INTO '%
ab40: 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20  q' VALUES(?",.  
ab50: 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74         zConflict
ab60: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
ab70: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
ab80: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
ab90: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
aba0: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
abb0: 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
abc0: 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
abd0: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
abe0: 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
abf0: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
ac00: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
ac10: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
ac20: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
ac30: 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20    free(zSql);.  
ac40: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ac50: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ac60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
ac70: 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
ac80: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
ac90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
aca0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
acb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
acc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
acd0: 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
ace0: 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
acf0: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
ad00: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ad10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
ad20: 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
ad30: 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
ad40: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
ad50: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
ad60: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
ad70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ad80: 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
ad90: 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
ada0: 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
adb0: 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
adc0: 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
add0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ade0: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
adf0: 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
ae00: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c  ", 0);.      fcl
ae10: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72  ose(in);.      r
ae20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ae30: 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64  .    }.    (void
ae40: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
ae50: 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  b->db, "BEGIN", 
ae60: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43  0, 0, 0);.    zC
ae70: 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22  ommit = "COMMIT"
ae80: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c  ;.    while( (zL
ae90: 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ine = local_getl
aea0: 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29  ine(0, in))!=0 )
aeb0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
aec0: 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  .      i = 0;.  
aed0: 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
aee0: 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a      azCol[0] = z
aef0: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
af00: 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a  i=0, z=zLine; *z
af10: 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; z++){.        
af20: 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20  if( *z==zSep[0] 
af30: 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53  && strncmp(z, zS
af40: 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a  ep, nSep)==0 ){.
af50: 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30            *z = 0
af60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
af70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
af80: 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  <nCol ){.       
af90: 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20       azCol[i] = 
afa0: 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20  &z[nSep];.      
afb0: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d        z += nSep-
afc0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
afd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
afe0: 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d  .      if( i+1!=
aff0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
b000: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
b010: 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73      int nErr = s
b020: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 20 2b 20 32  trlen(zFile) + 2
b030: 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72  00;.        zErr
b040: 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b   = malloc(nErr);
b050: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72  .        if( zEr
b060: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
b070: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b080: 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20  nErr, zErr,.    
b090: 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
b0a0: 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70   %s line %d: exp
b0b0: 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
b0c0: 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75   of data but fou
b0d0: 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  nd %d",.        
b0e0: 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65       zFile, line
b0f0: 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  no, nCol, i+1);.
b100: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
b110: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b120: 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20  p, zErr, 0);.   
b130: 20 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72         free(zErr
b140: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b150: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
b160: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
b170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b180: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
b190: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
b1a0: 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20         /* check 
b1b0: 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69  for null data, i
b1c0: 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75  f so, bind as nu
b1d0: 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ll */.        if
b1e0: 20 28 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74   ((nNull>0 && st
b1f0: 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a  rcmp(azCol[i], z
b200: 4e 75 6c 6c 29 3d 3d 30 29 20 7c 7c 20 73 74 72  Null)==0) || str
b210: 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30  len(azCol[i])==0
b220: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) {.          sq
b230: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
b240: 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20  pStmt, i+1);.   
b250: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
b270: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
b280: 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31  +1, azCol[i], -1
b290: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
b2a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b2b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b2c0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
b2d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b2e0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
b2f0: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
b300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
b310: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b320: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
b330: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
b340: 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
b350: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
b360: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  , 0);.        zC
b370: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
b380: 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
b390: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
b3a0: 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29  .    free(azCol)
b3b0: 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  ;.    fclose(in)
b3c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
b3d0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
b3e0: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
b3f0: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
b400: 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29  Commit, 0, 0, 0)
b410: 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  ;..    if( zComm
b420: 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a  it[0] == 'C' ){.
b430: 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73        /* success
b440: 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20  , set result as 
b450: 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
b460: 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
b470: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
b480: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
b490: 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c  terp);.      Tcl
b4a0: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
b4b0: 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  lt, lineno);.   
b4c0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
b4d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4e0: 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70   /* failure, app
b4f0: 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65  end lineno where
b500: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
b510: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
b520: 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75  f(sizeof(zLineNu
b530: 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64  m), zLineNum,"%d
b540: 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ",lineno);.     
b550: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b560: 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c  t(interp,", fail
b570: 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ed while process
b580: 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e  ing line: ",zLin
b590: 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72  eNum,0);.      r
b5a0: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
b5b0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
b5c0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
b5d0: 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61    $db enable_loa
b5e0: 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c  d_extension BOOL
b5f0: 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75  EAN.  **.  ** Tu
b600: 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  rn the extension
b610: 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65   loading feature
b620: 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20   on or off.  It 
b630: 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64  if off by.  ** d
b640: 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63  efault..  */.  c
b650: 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f  ase DB_ENABLE_LO
b660: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a  AD_EXTENSION: {.
b670: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b680: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
b690: 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66  ON.    int onoff
b6a0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
b6b0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
b6c0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b6d0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f  rp, 2, objv, "BO
b6e0: 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72  OLEAN");.      r
b6f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b700: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
b710: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
b720: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
b730: 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b  v[2], &onoff) ){
b740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
b750: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
b760: 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
b770: 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
b780: 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29  (pDb->db, onoff)
b790: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c  ;.    break;.#el
b7a0: 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  se.    Tcl_Appen
b7b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b7c0: 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69  "extension loadi
b7d0: 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  ng is turned off
b7e0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
b7f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
b800: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
b810: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b820: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
b830: 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
b840: 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20  rrorcode.  **.  
b850: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
b860: 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65  meric error code
b870: 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e   that was return
b880: 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ed by the most r
b890: 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  ecent.  ** call 
b8a0: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
b8b0: 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
b8c0: 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20  B_ERRORCODE: {. 
b8d0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
b8e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
b8f0: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
b900: 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
b910: 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  b)));.    break;
b920: 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20  .  }.   .  /*.  
b930: 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20 24  **    $db eval $
b940: 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20  sql ?array? ?{  
b950: 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20  ...code... }?.  
b960: 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c  **    $db onecol
b970: 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20  umn $sql.  **.  
b980: 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65  ** The SQL state
b990: 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20  ment in $sql is 
b9a0: 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20  evaluated.  For 
b9b0: 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61  each row, the va
b9c0: 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c  lues are.  ** pl
b9d0: 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73  aced in elements
b9e0: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61   of the array na
b9f0: 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20  med "array" and 
ba00: 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78  ...code... is ex
ba10: 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20  ecuted..  ** If 
ba20: 22 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64  "array" and "cod
ba30: 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20  e" are omitted, 
ba40: 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b  then no callback
ba50: 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65   is every invoke
ba60: 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
ba70: 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  y" is an empty s
ba80: 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  tring, then the 
ba90: 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65  values are place
baa0: 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20  d in variables. 
bab0: 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68   ** that have th
bac0: 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
bad0: 68 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63  he fields extrac
bae0: 74 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ted by the query
baf0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
bb00: 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  onecolumn method
bb10: 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65   is the equivale
bb20: 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20  nt of:.  **     
bb30: 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c  lindex [$db eval
bb40: 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20   $sql] 0.  */.  
bb50: 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d  case DB_ONECOLUM
bb60: 4e 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41  N:.  case DB_EVA
bb70: 4c 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49  L:.  case DB_EXI
bb80: 53 54 53 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  STS: {.    char 
bb90: 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20  const *zSql;    
bba0: 20 20 2f 2a 20 4e 65 78 74 20 53 51 4c 20 73 74    /* Next SQL st
bbb0: 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
bbc0: 74 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  te */.    char c
bbd0: 6f 6e 73 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20  onst *zLeft;    
bbe0: 20 2f 2a 20 57 68 61 74 20 69 73 20 6c 65 66 74   /* What is left
bbf0: 20 61 66 74 65 72 20 66 69 72 73 74 20 73 74 6d   after first stm
bc00: 74 20 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20  t in zSql */.   
bc10: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
bc20: 53 74 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69  Stmt;   /* Compi
bc30: 6c 65 64 20 53 51 4c 20 73 74 61 74 6d 65 6e 74  led SQL statment
bc40: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
bc50: 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 2f  *pArray;       /
bc60: 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20  * Name of array 
bc70: 69 6e 74 6f 20 77 68 69 63 68 20 72 65 73 75 6c  into which resul
bc80: 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 2a  ts are written *
bc90: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
bca0: 53 63 72 69 70 74 3b 20 20 20 20 20 20 2f 2a 20  Script;      /* 
bcb0: 53 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f  Script to run fo
bcc0: 72 20 65 61 63 68 20 72 65 73 75 6c 74 20 73 65  r each result se
bcd0: 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  t */.    Tcl_Obj
bce0: 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20 20 20   **apParm;      
bcf0: 2f 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 68  /* Parameters th
bd00: 61 74 20 6e 65 65 64 20 61 20 54 63 6c 5f 44 65  at need a Tcl_De
bd10: 63 72 52 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a  crRefCount() */.
bd20: 20 20 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20      int nParm;  
bd30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bd40: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
bd50: 75 73 65 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d  used in apParm[]
bd60: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
bd70: 2a 61 50 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f  *aParm[10];    /
bd80: 2a 20 53 74 61 74 69 63 20 73 70 61 63 65 20 66  * Static space f
bd90: 6f 72 20 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74  or apParm[] in t
bda0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
bdb0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
bdc0: 52 65 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ret;         /* 
bdd0: 56 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  Value to be retu
bde0: 72 6e 65 64 20 2a 2f 0a 20 20 20 20 53 71 6c 50  rned */.    SqlP
bdf0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
be00: 65 53 74 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e 74  eStmt;  /* Point
be10: 65 72 20 74 6f 20 61 20 70 72 65 70 61 72 65 64  er to a prepared
be20: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
be30: 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
be40: 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45  if( choice==DB_E
be50: 56 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  VAL ){.      if(
be60: 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e   objc<3 || objc>
be70: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  5 ){.        Tcl
be80: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
be90: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
bea0: 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f  SQL ?ARRAY-NAME?
beb0: 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20   ?SCRIPT?");.   
bec0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
bed0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
bee0: 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f       pRet = Tcl_
bef0: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
bf00: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
bf10: 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73  (pRet);.    }els
bf20: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  e{.      if( obj
bf30: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
bf40: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
bf50: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
bf60: 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
bf70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
bf80: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
bf90: 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
bfa0: 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20  _EXISTS ){.     
bfb0: 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
bfc0: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 30 29 3b 0a  wBooleanObj(0);.
bfd0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
bfe0: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
bff0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c000: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
c010: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c020: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
c030: 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 70        pArray = p
c040: 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20  Script = 0;.    
c050: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
c060: 34 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61  4 ){.      pArra
c070: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63  y = 0;.      pSc
c080: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  ript = objv[3];.
c090: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c0a0: 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33   pArray = objv[3
c0b0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  ];.      if( Tcl
c0c0: 5f 47 65 74 53 74 72 69 6e 67 28 70 41 72 72 61  _GetString(pArra
c0d0: 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72 61  y)[0]==0 ) pArra
c0e0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63  y = 0;.      pSc
c0f0: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a  ript = objv[4];.
c100: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49      }..    Tcl_I
c110: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ncrRefCount(objv
c120: 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  [2]);.    zSql =
c130: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
c140: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
c150: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  );.    while( rc
c160: 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c  ==TCL_OK && zSql
c170: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
c180: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c190: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
c1a0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
c1b0: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c1d0: 75 6d 62 65 72 20 6f 66 20 62 69 6e 64 20 70 61  umber of bind pa
c1e0: 72 61 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20  rameters in the 
c1f0: 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69  pStmt */.      i
c200: 6e 74 20 6e 43 6f 6c 20 3d 20 2d 31 3b 20 20 20  nt nCol = -1;   
c210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c220: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
c230: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c240: 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62   */.      Tcl_Ob
c250: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
c260: 30 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  0;   /* Array of
c270: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
c280: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20  .      int len; 
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67    /* String leng
c2b0: 74 68 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20  th of zSql */.  
c2c0: 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  .      /* Try to
c2d0: 20 66 69 6e 64 20 61 20 53 51 4c 20 73 74 61 74   find a SQL stat
c2e0: 65 6d 65 6e 74 20 74 68 61 74 20 68 61 73 20 61  ement that has a
c2f0: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70  lready been comp
c300: 69 6c 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a  iled and.      *
c310: 2a 20 77 68 69 63 68 20 6d 61 74 63 68 65 73 20  * which matches 
c320: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 63  the next sequenc
c330: 65 20 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20 20  e of SQL..      
c340: 2a 2f 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d  */.      pStmt =
c350: 20 30 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20   0;.      len = 
c360: 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20  strlen(zSql);.  
c370: 20 20 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74      for(pPreStmt
c380: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
c390: 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65  ; pPreStmt; pPre
c3a0: 53 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70  Stmt=pPreStmt->p
c3b0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
c3c0: 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d  nt n = pPreStmt-
c3d0: 3e 6e 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69  >nSql;.        i
c3e0: 66 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20  f( len>=n .     
c3f0: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
c400: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
c410: 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20   zSql, n)==0.   
c420: 20 20 20 20 20 20 20 20 20 26 26 20 28 7a 53 71           && (zSq
c430: 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b  l[n]==0 || zSql[
c440: 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20  n-1]==';').     
c450: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
c460: 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  pStmt = pPreStmt
c470: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  ->pStmt;.       
c480: 20 20 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c     zLeft = &zSql
c490: 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d  [pPreStmt->nSql]
c4a0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
c4b0: 57 68 65 6e 20 61 20 70 72 65 70 61 72 65 64 20  When a prepared 
c4c0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75  statement is fou
c4d0: 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72  nd, unlink it fr
c4e0: 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  om the.         
c4f0: 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20   ** cache list. 
c500: 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62   It will later b
c510: 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20  e added back to 
c520: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
c530: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
c540: 65 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20  e cache list in 
c550: 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65  order to impleme
c560: 6e 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65  nt LRU replaceme
c570: 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  nt..          */
c580: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
c590: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29  PreStmt->pPrev )
c5a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
c5b0: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70  reStmt->pPrev->p
c5c0: 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Next = pPreStmt-
c5d0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
c5e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c5f0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
c600: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
c610: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
c620: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
c630: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20  pPreStmt->pNext 
c640: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
c650: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e  PreStmt->pNext->
c660: 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74  pPrev = pPreStmt
c670: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20  ->pPrev;.       
c680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c690: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
c6a0: 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ast = pPreStmt->
c6b0: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  pPrev;.         
c6c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62   }.          pDb
c6d0: 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20  ->nStmt--;.     
c6e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c6f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c700: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  .      /* If no 
c710: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
c720: 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 43  nt was found.  C
c730: 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74  ompile the SQL t
c740: 65 78 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ext.      */.   
c750: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
c760: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  ){.        if( S
c770: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
c780: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 44 62  3_prepare_v2(pDb
c790: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
c7a0: 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20  &pStmt, &zLeft) 
c7b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
c7c0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
c7d0: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
c7e0: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
c7f0: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
c800: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
c810: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
c820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c830: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  }.        if( pS
c840: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt==0 ){.      
c850: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
c860: 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
c870: 64 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20  de(pDb->db) ){. 
c880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
c890: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72  compile-time err
c8a0: 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  or in the statem
c8b0: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ent.            
c8c0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
c8d0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
c8e0: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
c8f0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
c900: 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  sg(pDb->db)));. 
c910: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
c920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
c930: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c940: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c960: 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  e statement was 
c970: 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e  a no-op.  Contin
c980: 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ue to the next s
c990: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20  tatement.       
c9a0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53       ** in the S
c9b0: 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20  QL string..     
c9c0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c9d0: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
c9e0: 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
c9f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
ca00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ca10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ca20: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  pPreStmt==0 );. 
ca30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
ca40: 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74 6f 20   Bind values to 
ca50: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
ca60: 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f 72 20  begin with $ or 
ca70: 3a 0a 20 20 20 20 20 20 2a 2f 20 20 0a 20 20 20  :.      */  .   
ca80: 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65     nVar = sqlite
ca90: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
caa0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
cab0: 20 20 20 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a       nParm = 0;.
cac0: 20 20 20 20 20 20 69 66 28 20 6e 56 61 72 3e 73        if( nVar>s
cad0: 69 7a 65 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a  izeof(aParm)/siz
cae0: 65 6f 66 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b  eof(aParm[0]) ){
caf0: 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 20  .        apParm 
cb00: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c  = (Tcl_Obj**)Tcl
cb10: 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65  _Alloc(nVar*size
cb20: 6f 66 28 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a  of(apParm[0]));.
cb30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cb40: 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 61 50       apParm = aP
cb50: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  arm;.      }.   
cb60: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e     for(i=1; i<=n
cb70: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
cb80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cb90: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
cba0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
cbb0: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
cbc0: 20 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30       if( zVar!=0
cbd0: 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24   && (zVar[0]=='$
cbe0: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
cbf0: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40  ' || zVar[0]=='@
cc00: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
cc10: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20  Tcl_Obj *pVar = 
cc20: 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e  Tcl_GetVar2Ex(in
cc30: 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20  terp, &zVar[1], 
cc40: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
cc50: 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20 20   if( pVar ){.   
cc60: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 2a              u8 *
cc80: 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20  data;.          
cc90: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
cca0: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20  pVar->typePtr ? 
ccb0: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
ccc0: 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20  ame : "";.      
ccd0: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a        char c = z
cce0: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Type[0];.       
ccf0: 20 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d       if( zVar[0]
cd00: 3d 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20 20 20  =='@' ||.       
cd10: 20 20 20 20 20 20 20 20 28 63 3d 3d 27 62 27 20          (c=='b' 
cd20: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
cd30: 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20  "bytearray")==0 
cd40: 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d  && pVar->bytes==
cd50: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
cd60: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c      /* Load a BL
cd70: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
cd80: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
cd90: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
cdb0: 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  it has no string
cdc0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
cdd0: 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20  or the host.    
cde0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72            ** par
cdf0: 61 6d 65 74 65 72 20 6e 61 6d 65 20 62 65 67 69  ameter name begi
ce00: 6e 73 20 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a  ns with "@". */.
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
ce20: 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ta = Tcl_GetByte
ce30: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61  ArrayFromObj(pVa
ce40: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
ce50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
ce60: 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  nd_blob(pStmt, i
ce70: 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  , data, n, SQLIT
ce80: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
ce90: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
cea0: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
ceb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
cec0: 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d  pParm[nParm++] =
ced0: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20   pVar;.         
cee0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
cef0: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
cf00: 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d  ype,"boolean")==
cf10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
cf20: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
cf30: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
cf40: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
cf50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
cf60: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c  nd_int(pStmt, i,
cf70: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   n);.           
cf80: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64   }else if( c=='d
cf90: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
cfa0: 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  e,"double")==0 )
cfb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
cfc0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20  double r;.      
cfd0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
cfe0: 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
cff0: 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  erp, pVar, &r);.
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
d010: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
d020: 65 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a  e(pStmt, i, r);.
d030: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
d040: 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26  e if( (c=='w' &&
d050: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77   strcmp(zType,"w
d060: 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a  ideInt")==0) ||.
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72    (c=='i' && str
d090: 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29  cmp(zType,"int")
d0a0: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
d0b0: 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
d0c0: 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t v;.           
d0d0: 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e     Tcl_GetWideIn
d0e0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
d0f0: 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20   pVar, &v);.    
d100: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d110: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
d120: 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20  mt, i, v);.     
d130: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d140: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
d150: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
d160: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
d170: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
d180: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
d190: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
d1a0: 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28 63  ext(pStmt, i, (c
d1b0: 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53  har *)data, n, S
d1c0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
d1e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56  _IncrRefCount(pV
d1f0: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ar);.           
d200: 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b     apParm[nParm+
d210: 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20  +] = pVar;.     
d220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d230: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
d250: 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20  nd_null( pStmt, 
d260: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i );.          }
d270: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d280: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65   }..      /* Exe
d290: 63 75 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20  cute the SQL.   
d2a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c     */.      whil
d2b0: 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26  e( rc==TCL_OK &&
d2c0: 20 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45   pStmt && SQLITE
d2d0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
d2e0: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 0a 09 2f  ep(pStmt) ){.../
d2f0: 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e  * Compute column
d300: 20 6e 61 6d 65 73 2e 20 54 68 69 73 20 6d 75 73   names. This mus
d310: 74 20 62 65 20 64 6f 6e 65 20 61 66 74 65 72 20  t be done after 
d320: 74 68 65 20 66 69 72 73 74 20 73 75 63 63 65 73  the first succes
d330: 73 66 75 6c 0a 09 2a 2a 20 63 61 6c 6c 20 74 6f  sful..** call to
d340: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
d350: 20 69 6e 20 63 61 73 65 20 74 68 65 20 71 75 65   in case the que
d360: 72 79 20 69 73 20 72 65 63 6f 6d 70 69 6c 65 64  ry is recompiled
d370: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 20   and the.       
d380: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 72 20 6e 61   ** number or na
d390: 6d 65 73 20 6f 66 20 74 68 65 20 72 65 74 75 72  mes of the retur
d3a0: 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 63 68 61 6e  ned columns chan
d3b0: 67 65 73 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ges. .        */
d3c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d3d0: 21 70 41 72 72 61 79 7c 7c 70 53 63 72 69 70 74  !pArray||pScript
d3e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e  );.        if (n
d3f0: 43 6f 6c 20 3c 20 30 29 20 7b 0a 20 20 20 20 20  Col < 0) {.     
d400: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a       Tcl_Obj ***
d410: 61 70 20 3d 20 28 70 53 63 72 69 70 74 3f 26 61  ap = (pScript?&a
d420: 70 43 6f 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20 20  pColName:0);.   
d430: 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 63 6f         nCol = co
d440: 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  mputeColumnNames
d450: 28 69 6e 74 65 72 70 2c 20 70 53 74 6d 74 2c 20  (interp, pStmt, 
d460: 61 70 2c 20 70 41 72 72 61 79 29 3b 0a 20 20 20  ap, pArray);.   
d470: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
d480: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
d490: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
d4a0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
d4b0: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
d4c0: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
d4d0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
d4e0: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
d4f0: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
d500: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71        switch( sq
d510: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
d520: 65 28 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20  e(pStmt, i) ){. 
d530: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
d540: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
d560: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
d570: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
d580: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
d590: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
d5a0: 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74  r *zBlob = sqlit
d5b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
d5c0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
d5d0: 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c          if( !zBl
d5e0: 6f 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a  ob ) bytes = 0;.
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
d600: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  al = Tcl_NewByte
d610: 41 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42  ArrayObj((u8*)zB
d620: 6c 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  lob, bytes);.   
d630: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
d640: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
d650: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
d660: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
d670: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
d680: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20   sqlite_int64 v 
d690: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
d6a0: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29  _int64(pStmt, i)
d6b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d6c0: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
d6d0: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
d6e0: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
d6f0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
d700: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a  l_NewIntObj(v);.
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
d720: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
d730: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
d740: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
d750: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d760: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
d770: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
d780: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
d790: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
d7a0: 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  AT: {.          
d7b0: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
d7c0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
d7d0: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  uble(pStmt, i);.
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
d7f0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
d800: 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20  leObj(r);.      
d810: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d820: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d830: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
d840: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
d850: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
d860: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44  = dbTextToObj(pD
d870: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
d880: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
d890: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d8a0: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
d8b0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t: {.           
d8c0: 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74     pVal = dbText
d8d0: 54 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71  ToObj((char *)sq
d8e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
d8f0: 74 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20  t(pStmt, i));.  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
d910: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
d920: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
d930: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
d940: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
d950: 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d       if( pArray=
d960: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
d970: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
d980: 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c  r2(interp, apCol
d990: 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c  Name[i], 0, pVal
d9a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
d9b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d9c0: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
d9d0: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41  tVar2(interp, pA
d9e0: 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  rray, apColName[
d9f0: 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20  i], pVal, 0);.  
da00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
da10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
da20: 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f  choice==DB_ONECO
da30: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
da40: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74      assert( pRet
da50: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
da60: 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29     if( pRet==0 )
da70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
da80: 70 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20  pRet = pVal;.   
da90: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
daa0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
dab0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
dac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
dad0: 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20  = TCL_BREAK;.   
dae0: 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f           i = nCo
daf0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  l;.          }el
db00: 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44  se if( choice==D
db10: 42 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20  B_EXISTS ){.    
db20: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
db30: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
db40: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74              pRet
db50: 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61   = Tcl_NewBoolea
db60: 6e 4f 62 6a 28 31 29 3b 0a 20 20 20 20 20 20 20  nObj(1);.       
db70: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
db80: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
db90: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
dba0: 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20  L_BREAK;.       
dbb0: 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20       i = nCol;. 
dbc0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
dbe0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
dbf0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
dc00: 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, pVal);.      
dc10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
dc20: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
dc30: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
dc40: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
dc50: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
dc60: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
dc70: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
dc80: 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20  L_CONTINUE ){.  
dc90: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
dca0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  CL_OK;.         
dcb0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
dcc0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
dcd0: 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
dce0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
dcf0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  _OK;.      }..  
dd00: 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20      /* Free the 
dd10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65  column name obje
dd20: 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  cts */.      if(
dd30: 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20   pScript ){.    
dd40: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
dd50: 65 72 79 20 72 65 74 75 72 6e 65 64 20 6e 6f 20  ery returned no 
dd60: 72 6f 77 73 2c 20 62 75 74 20 61 6e 20 61 72 72  rows, but an arr
dd70: 61 79 20 76 61 72 69 61 62 6c 65 20 77 61 73 20  ay variable was 
dd80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 70 65 63  .        ** spec
dd90: 69 66 69 65 64 2c 20 63 61 6c 6c 20 63 6f 6d 70  ified, call comp
dda0: 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  uteColumnNames()
ddb0: 20 6e 6f 77 20 74 6f 20 70 6f 70 75 6c 61 74 65   now to populate
ddc0: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
ddd0: 20 61 72 72 61 79 6e 61 6d 65 28 2a 29 20 76 61   arrayname(*) va
dde0: 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20  riable..        
ddf0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 70  */.        if (p
de00: 41 72 72 61 79 20 26 26 20 6e 43 6f 6c 20 3c 20  Array && nCol < 
de10: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 54  0) {.          T
de20: 63 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20 3d 20 28  cl_Obj ***ap = (
de30: 70 53 63 72 69 70 74 3f 26 61 70 43 6f 6c 4e 61  pScript?&apColNa
de40: 6d 65 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 20  me:0);.         
de50: 20 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75 74 65 43   nCol = computeC
de60: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e 74 65 72  olumnNames(inter
de70: 70 2c 20 70 53 74 6d 74 2c 20 61 70 2c 20 70 41  p, pStmt, ap, pA
de80: 72 72 61 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  rray);.        }
de90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
dea0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
deb0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65            Tcl_De
dec0: 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c  crRefCount(apCol
ded0: 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Name[i]);.      
dee0: 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f    }.        Tcl_
def0: 46 72 65 65 28 28 63 68 61 72 2a 29 61 70 43 6f  Free((char*)apCo
df00: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  lName);.      }.
df10: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74  .      /* Free t
df20: 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20  he bound string 
df30: 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74  and blob paramet
df40: 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  ers */.      for
df50: 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b 20 69  (i=0; i<nParm; i
df60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  ++){.        Tcl
df70: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _DecrRefCount(ap
df80: 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Parm[i]);.      
df90: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70 50 61  }.      if( apPa
dfa0: 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20 20 20  rm!=aParm ){.   
dfb0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
dfc0: 68 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a 20 20  har*)apParm);.  
dfd0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
dfe0: 52 65 73 65 74 20 74 68 65 20 73 74 61 74 65 6d  Reset the statem
dff0: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72 65 73  ent.  If the res
e000: 75 6c 74 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ult code is SQLI
e010: 54 45 5f 53 43 48 45 4d 41 2c 20 74 68 65 6e 0a  TE_SCHEMA, then.
e020: 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74        ** flush t
e030: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63  he statement cac
e040: 68 65 20 61 6e 64 20 74 72 79 20 74 68 65 20 73  he and try the s
e050: 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 2e 0a  tatement again..
e060: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
e070: 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  c2 = sqlite3_res
e080: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
e090: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
e0a0: 72 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rc2 ){.        /
e0b0: 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20  * If a run-time 
e0c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
e0d0: 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61  port the error a
e0e0: 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a  nd stop reading.
e0f0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
e100: 51 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  QL.        */.  
e110: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
e120: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
e130: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
e140: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
e150: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  b)));.        sq
e160: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
e170: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Stmt);.        r
e180: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
e190: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
e1a0: 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28  tmt ) Tcl_Free((
e1b0: 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b  char*)pPreStmt);
e1c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e1d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e1e0: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20  pDb->maxStmt<=0 
e1f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
e200: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75   the cache is tu
e210: 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f  rned off, deallo
e220: 63 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d  cated the statem
e230: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ent */.        i
e240: 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63  f( pPreStmt ) Tc
e250: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50  l_Free((char*)pP
e260: 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  reStmt);.       
e270: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
e280: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
e290: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
e2a0: 2a 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72  * Everything wor
e2b0: 6b 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  ked and the cach
e2c0: 65 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c  e is operational
e2d0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65  ..        ** Cre
e2e0: 61 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65  ate a new SqlPre
e2f0: 70 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74  paredStmt struct
e300: 75 72 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f  ure if we need o
e310: 6e 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  ne..        ** (
e320: 49 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  If we already ha
e330: 76 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75  ve one we can ju
e340: 73 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20  st reuse it.).  
e350: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e360: 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30   if( pPreStmt==0
e370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65   ){.          le
e380: 6e 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c  n = zLeft - zSql
e390: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
e3a0: 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61  Stmt = (SqlPrepa
e3b0: 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c  redStmt*)Tcl_All
e3c0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65  oc( sizeof(*pPre
e3d0: 53 74 6d 74 29 20 29 3b 0a 20 20 20 20 20 20 20  Stmt) );.       
e3e0: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d     if( pPreStmt=
e3f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
e400: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
e410: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
e420: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20   = pStmt;.      
e430: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53      pPreStmt->nS
e440: 71 6c 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  ql = len;.      
e450: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53      pPreStmt->zS
e460: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c  ql = sqlite3_sql
e470: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
e480: 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65     assert( strle
e490: 6e 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c  n(pPreStmt->zSql
e4a0: 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20  )==len );.      
e4b0: 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d      assert( 0==m
e4c0: 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e  emcmp(pPreStmt->
e4d0: 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e 29  zSql, zSql, len)
e4e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   );.        }.. 
e4f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
e500: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
e510: 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69  ment to the begi
e520: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63  nning of the cac
e530: 68 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20  he list.        
e540: 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  */.        pPreS
e550: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  tmt->pNext = pDb
e560: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
e570: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50      pPreStmt->pP
e580: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
e590: 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69   if( pDb->stmtLi
e5a0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70  st ){.         p
e5b0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50  Db->stmtList->pP
e5c0: 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  rev = pPreStmt;.
e5d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e5e0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
e5f0: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20  = pPreStmt;.    
e600: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
e610: 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tLast==0 ){.    
e620: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
e630: 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  b->nStmt==0 );. 
e640: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
e650: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
e660: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
e670: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
e680: 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30  rt( pDb->nStmt>0
e690: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
e6a0: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
e6b0: 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20 20 20 20  ++;.   .        
e6c0: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 74 6f  /* If we have to
e6d0: 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74  o many statement
e6e0: 20 69 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76   in cache, remov
e6f0: 65 20 74 68 65 20 73 75 72 70 6c 75 73 20 66 72  e the surplus fr
e700: 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  om the.        *
e710: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  * end of the cac
e720: 68 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  he list..       
e730: 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
e740: 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44  e( pDb->nStmt>pD
e750: 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20  b->maxStmt ){.  
e760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e770: 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73 74  finalize(pDb->st
e780: 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  mtLast->pStmt);.
e790: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
e7a0: 74 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73  tmtLast = pDb->s
e7b0: 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a  tmtLast->pPrev;.
e7c0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72            Tcl_Fr
e7d0: 65 65 28 28 63 68 61 72 2a 29 70 44 62 2d 3e 73  ee((char*)pDb->s
e7e0: 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b  tmtLast->pNext);
e7f0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
e800: 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20  stmtLast->pNext 
e810: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
e820: 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20  Db->nStmt--;.   
e830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
e840: 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 65 64        /* Proceed
e850: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61   to the next sta
e860: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
e870: 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  zSql = zLeft;.  
e880: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
e890: 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d  RefCount(objv[2]
e8a0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65 74  );..    if( pRet
e8b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
e8c0: 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
e8d0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
e8e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
e8f0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
e900: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
e910: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65  nt(pRet);.    }e
e920: 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  lse if( rc==TCL_
e930: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
e940: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
e950: 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  rp);.    }.    b
e960: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
e970: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e    **     $db fun
e980: 63 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50  ction NAME SCRIP
e990: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
e9a0: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e  te a new SQL fun
e9b0: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
e9c0: 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61  E.  Whenever tha
e9d0: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  t function is.  
e9e0: 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  ** called, invok
e9f0: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
ea00: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
ea10: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
ea20: 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  B_FUNCTION: {.  
ea30: 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
ea40: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
ea50: 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72  Script;.    char
ea60: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28   *zName;.    if(
ea70: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
ea80: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
ea90: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
eaa0: 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54  jv, "NAME SCRIPT
eab0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
eac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ead0: 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
eae0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
eaf0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
eb00: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
eb10: 6a 76 5b 33 5d 3b 0a 20 20 20 20 70 46 75 6e 63  jv[3];.    pFunc
eb20: 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70   = findSqlFunc(p
eb30: 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db, zName);.    
eb40: 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72  if( pFunc==0 ) r
eb50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
eb60: 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
eb70: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
eb80: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
eb90: 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  t(pFunc->pScript
eba0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75  );.    }.    pFu
ebb0: 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53  nc->pScript = pS
ebc0: 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
ebd0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
ebe0: 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d  ipt);.    pFunc-
ebf0: 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73  >useEvalObjv = s
ec00: 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76  afeToUseEvalObjv
ec10: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
ec20: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
ec30: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
ec40: 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
ec50: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
ec60: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75  TF8,.        pFu
ec70: 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20  nc, tclSqlFunc, 
ec80: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
ec90: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
eca0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
ecb0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f  RROR;.      Tcl_
ecc0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ecd0: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
ece0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
ecf0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
ed00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
ed10: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
ed20: 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c  *     $db incrbl
ed30: 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  ob ?-readonly? ?
ed40: 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
ed50: 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61   ROWID.  */.  ca
ed60: 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20  se DB_INCRBLOB: 
ed70: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
ed80: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
ed90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
eda0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72  lt(interp, "incr
edb0: 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62  blob not availab
edc0: 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
edd0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
ede0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
edf0: 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61  se.    int isRea
ee00: 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63  donly = 0;.    c
ee10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
ee20: 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e   "main";.    con
ee30: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b  st char *zTable;
ee40: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ee50: 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  *zColumn;.    sq
ee60: 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 3b  lite_int64 iRow;
ee70: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
ee80: 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79  or the -readonly
ee90: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69   option */.    i
eea0: 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72  f( objc>3 && str
eeb0: 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  cmp(Tcl_GetStrin
eec0: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65  g(objv[2]), "-re
eed0: 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20  adonly")==0 ){. 
eee0: 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
eef0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
ef00: 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52  if( objc!=(5+isR
ef10: 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63  eadonly) && objc
ef20: 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  !=(6+isReadonly)
ef30: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
ef40: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ef50: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72  p, 2, objv, "?-r
ef60: 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41  eadonly? ?DB? TA
ef70: 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44  BLE COLUMN ROWID
ef80: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
ef90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
efa0: 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  }..    if( objc=
efb0: 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20  =(6+isReadonly) 
efc0: 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54  ){.      zDb = T
efd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
efe0: 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  v[2]);.    }.   
eff0: 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
f000: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
f010: 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75  c-3]);.    zColu
f020: 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  mn = Tcl_GetStri
f030: 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29  ng(objv[objc-2])
f040: 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47  ;.    rc = Tcl_G
f050: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
f060: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62  (interp, objv[ob
f070: 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a  jc-1], &iRow);..
f080: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
f090: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
f0a0: 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43   createIncrblobC
f0b0: 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20  hannel(.        
f0c0: 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a    interp, pDb, z
f0d0: 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c  Db, zTable, zCol
f0e0: 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65 61  umn, iRow, isRea
f0f0: 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20  donly.      );. 
f100: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
f110: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
f120: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
f130: 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a  terrupt.  **.  *
f140: 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65 20  * Interrupt the 
f150: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
f160: 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20   inner-most SQL 
f170: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
f180: 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74  is.  ** causes t
f190: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
f1a0: 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
f1b0: 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e  ror of SQLITE_IN
f1c0: 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20  TERRUPT..  */.  
f1d0: 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50  case DB_INTERRUP
f1e0: 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T: {.    sqlite3
f1f0: 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e  _interrupt(pDb->
f200: 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  db);.    break;.
f210: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
f220: 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
f230: 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
f240: 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
f250: 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
f260: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
f270: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
f280: 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
f290: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
f2a0: 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
f2b0: 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
f2c0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
f2d0: 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
f2e0: 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
f2f0: 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
f300: 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
f310: 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
f320: 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
f330: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
f340: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
f350: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f360: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
f370: 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
f380: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f390: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
f3a0: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
f3b0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
f3c0: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
f3d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
f3e0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
f3f0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
f400: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
f410: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
f420: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
f430: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
f440: 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
f450: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
f460: 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
f470: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
f480: 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a    strncpy(pDb->z
f490: 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e  Null, zNull, len
f4a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
f4b0: 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30  zNull[len] = '\0
f4c0: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ';.      }else{.
f4d0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
f4e0: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
f4f0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
f500: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
f510: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70  p, dbTextToObj(p
f520: 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20  Db->zNull));.   
f530: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
f540: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c  *.  **     $db l
f550: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
f560: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75   .  **.  ** Retu
f570: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
f580: 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44  ich is the ROWID
f590: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
f5a0: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a  cent insert..  *
f5b0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54  /.  case DB_LAST
f5c0: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b  _INSERT_ROWID: {
f5d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
f5e0: 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57  esult;.    Tcl_W
f5f0: 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20  ideInt rowid;.  
f600: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
f610: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
f620: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f630: 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
f640: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f650: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
f660: 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
f670: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
f680: 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  d(pDb->db);.    
f690: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
f6a0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
f6b0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57  p);.    Tcl_SetW
f6c0: 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  ideIntObj(pResul
f6d0: 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62  t, rowid);.    b
f6e0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
f6f0: 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43    ** The DB_ONEC
f700: 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20  OLUMN method is 
f710: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65  implemented toge
f720: 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 56 41  ther with DB_EVA
f730: 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20  L..  */..  /*   
f740: 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e   $db progress ?N
f750: 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20   CALLBACK?.  ** 
f760: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
f770: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
f780: 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20  every N virtual 
f790: 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20  machine opcodes 
f7a0: 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a  while executing.
f7b0: 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
f7c0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
f7d0: 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28  GRESS: {.    if(
f7e0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
f7f0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
f800: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
f810: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f820: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  (interp, pDb->zP
f830: 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20  rogress, 0);.   
f840: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
f850: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
f860: 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72      char *zProgr
f870: 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ess;.      int l
f880: 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b  en;.      int N;
f890: 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  .      if( TCL_O
f8a0: 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
f8b0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
f8c0: 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20  v[2], &N) ){.   
f8d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f8e0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a  ERROR;.      };.
f8f0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f900: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
f910: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
f920: 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->zProgress);.  
f930: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
f940: 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53  gress = Tcl_GetS
f950: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f960: 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[3], &len);.   
f970: 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73     if( zProgress
f980: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
f990: 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
f9a0: 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ess = Tcl_Alloc(
f9b0: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
f9c0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
f9d0: 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67  zProgress, zProg
f9e0: 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  ress, len+1);.  
f9f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fa00: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
fa10: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  s = 0;.      }.#
fa20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fa30: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
fa40: 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70  BACK.      if( p
fa50: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
fa60: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
fa70: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
fa80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
fa90: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
faa0: 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72  pDb->db, N, DbPr
fab0: 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70  ogressHandler, p
fac0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
fad0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fae0: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
faf0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
fb00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
fb10: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
fb20: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
fb30: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
fb40: 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42  , objv, "N CALLB
fb50: 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
fb60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fb70: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
fb80: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
fb90: 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41   profile ?CALLBA
fba0: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61  CK?.  **.  ** Ma
fbb0: 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20  ke arrangements 
fbc0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41  to invoke the CA
fbd0: 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61  LLBACK routine a
fbe0: 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73 74  fter each SQL st
fbf0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61  atement.  ** tha
fc00: 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20  t has run.  The 
fc10: 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
fc20: 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  and the amount o
fc30: 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72  f elapse time ar
fc40: 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20  e.  ** appended 
fc50: 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f  to CALLBACK befo
fc60: 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69 73  re the script is
fc70: 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   run..  */.  cas
fc80: 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a  e DB_PROFILE: {.
fc90: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
fca0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
fcb0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fcc0: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
fcd0: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
fce0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fcf0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
fd00: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
fd10: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
fd20: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
fd30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fd40: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66  terp, pDb->zProf
fd50: 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ile, 0);.      }
fd60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fd70: 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65    char *zProfile
fd80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
fd90: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
fda0: 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
fdb0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
fdc0: 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20  ->zProfile);.   
fdd0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66     }.      zProf
fde0: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
fdf0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
fe00: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
fe10: 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26   if( zProfile &&
fe20: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
fe30: 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20    pDb->zProfile 
fe40: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
fe50: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
fe60: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  memcpy(pDb->zPro
fe70: 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20  file, zProfile, 
fe80: 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
fe90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
fea0: 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a  ->zProfile = 0;.
feb0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
fec0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
fed0: 45 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  E.      if( pDb-
fee0: 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
fef0: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
ff00: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
ff10: 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
ff20: 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72  le(pDb->db, DbPr
ff30: 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44  ofileHandler, pD
ff40: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
ff50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ff60: 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62  _profile(pDb->db
ff70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
ff80: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
ff90: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
ffa0: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
ffb0: 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20  rekey KEY.  **. 
ffc0: 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65   ** Change the e
ffd0: 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e  ncryption key on
ffe0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   the currently o
fff0: 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20  pen database..  
10000 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b  */.  case DB_REK
10010 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b  EY: {.    int nK
10020 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b  ey;.    void *pK
10030 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ey;.    if( objc
10040 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
10050 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10060 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
10070 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74  KEY");.      ret
10080 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10090 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20     }.    pKey = 
100a0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
100b0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
100c0 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20   &nKey);.#ifdef 
100d0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
100e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
100f0 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c  3_rekey(pDb->db,
10100 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
10110 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10120 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10130 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
10140 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29  e3ErrStr(rc), 0)
10150 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
10160 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65  _ERROR;.    }.#e
10170 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
10180 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
10190 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d     $db timeout M
101a0 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a  ILLESECONDS.  **
101b0 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20  .  ** Delay for 
101c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
101d0 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69  lliseconds speci
101e0 66 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65  fied when a file
101f0 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f   is locked..  */
10200 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f  .  case DB_TIMEO
10210 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73  UT: {.    int ms
10220 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
10230 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
10240 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10250 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49  rp, 2, objv, "MI
10260 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20  LLISECONDS");.  
10270 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10280 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10290 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
102a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
102b0 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65  jv[2], &ms) ) re
102c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
102d0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
102e0 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62  _timeout(pDb->db
102f0 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b  , ms);.    break
10300 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20  ;.  }.  .  /*.  
10310 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c  **     $db total
10320 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20  _changes.  **.  
10330 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
10340 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
10350 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
10360 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
10370 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63  leted .  ** sinc
10380 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  e the database h
10390 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65  andle was create
103a0 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
103b0 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a  B_TOTAL_CHANGES:
103c0 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
103d0 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28  pResult;.    if(
103e0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
103f0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10400 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10410 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
10420 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10430 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75  .    }.    pResu
10440 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
10450 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
10460 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
10470 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65  (pResult, sqlite
10480 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
10490 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62  pDb->db));.    b
104a0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
104b0 20 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41     $db trace ?CA
104c0 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
104d0 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  * Make arrangeme
104e0 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  nts to invoke th
104f0 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69  e CALLBACK routi
10500 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20  ne for each SQL 
10510 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
10520 68 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  hat is executed.
10530 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
10540 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65  e SQL is appende
10550 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65  d to CALLBACK be
10560 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  fore.  ** it is 
10570 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20  executed..  */. 
10580 20 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20   case DB_TRACE: 
10590 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
105a0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
105b0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
105c0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
105d0 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
105e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
105f0 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
10600 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
10610 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
10620 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
10630 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10640 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63  terp, pDb->zTrac
10650 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
10660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10670 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20  char *zTrace;.  
10680 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
10690 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
106a0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
106b0 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
106c0 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
106d0 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f     zTrace = Tcl_
106e0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
106f0 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
10700 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63  .      if( zTrac
10710 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
10720 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
10730 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
10740 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
10750 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54    memcpy(pDb->zT
10760 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65  race, zTrace, le
10770 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
10780 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
10790 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  zTrace = 0;.    
107a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
107b0 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
107c0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
107d0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
107e0 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
107f0 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
10800 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e  ite3_trace(pDb->
10810 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c  db, DbTraceHandl
10820 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
10830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10840 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62  qlite3_trace(pDb
10850 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
10860 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
10870 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
10880 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72  ..  /*    $db tr
10890 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65  ansaction [-defe
108a0 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c  rred|-immediate|
108b0 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49  -exclusive] SCRI
108c0 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61  PT.  **.  ** Sta
108d0 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
108e0 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20  tion (if we are 
108f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74  not already in t
10900 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20  he midst of a.  
10910 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20  ** transaction) 
10920 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20  and execute the 
10930 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49 50  TCL script SCRIP
10940 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50 54  T.  After SCRIPT
10950 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c  .  ** completes,
10960 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74   either commit t
10970 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
10980 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69  r roll it back i
10990 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68  f SCRIPT.  ** th
109a0 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
109b0 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77  n.  Or if no new
109c0 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20   transation was 
109d0 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68  started, do noth
109e0 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74  ing..  ** pass t
109f0 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20  he exception on 
10a00 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  up the stack..  
10a10 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d  **.  ** This com
10a20 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65  mand was inspire
10a30 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73  d by Dave Thomas
10a40 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20  's talk on Ruby 
10a50 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35  at the.  ** 2005
10a60 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53   O'Reilly Open S
10a70 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e  ource Convention
10a80 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20   (OSCON)..  */. 
10a90 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43   case DB_TRANSAC
10aa0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20  TION: {.    int 
10ab0 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c  inTrans;.    Tcl
10ac0 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
10ad0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10ae0 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b  Begin = "BEGIN";
10af0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
10b00 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
10b10 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10b20 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10b30 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53   objv, "[TYPE] S
10b40 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
10b50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10b60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
10b70 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
10b80 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32  pScript = objv[2
10b90 5d 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ];.    } else {.
10ba0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
10bb0 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73  st char *TTYPE_s
10bc0 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  trs[] = {.      
10bd0 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20    "deferred",   
10be0 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69  "exclusive",  "i
10bf0 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20  mmediate", 0.   
10c00 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d     };.      enum
10c10 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20   TTYPE_enum {.  
10c20 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45        TTYPE_DEFE
10c30 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c  RRED, TTYPE_EXCL
10c40 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d  USIVE, TTYPE_IMM
10c50 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a  EDIATE.      };.
10c60 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b        int ttype;
10c70 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
10c80 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
10c90 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
10ca0 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61  TTYPE_strs, "tra
10cb0 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a  nsaction type",.
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
10ce0 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20   &ttype) ){.    
10cf0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10d00 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
10d10 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75      switch( (enu
10d20 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79  m TTYPE_enum)tty
10d30 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  pe ){.        ca
10d40 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45  se TTYPE_DEFERRE
10d50 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  D:    /* no-op *
10d60 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /;              
10d70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10d80 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43    case TTYPE_EXC
10d90 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e  LUSIVE:   zBegin
10da0 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53   = "BEGIN EXCLUS
10db0 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  IVE";  break;.  
10dc0 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
10dd0 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42  _IMMEDIATE:   zB
10de0 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d  egin = "BEGIN IM
10df0 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b  MEDIATE";  break
10e00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10e10 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
10e20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 54  ];.    }.    inT
10e30 72 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33 5f  rans = !sqlite3_
10e40 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70  get_autocommit(p
10e50 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28  Db->db);.    if(
10e60 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20   !inTrans ){.   
10e70 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41     pDb->disableA
10e80 75 74 68 2b 2b 3b 0a 20 20 20 20 20 20 28 76 6f  uth++;.      (vo
10e90 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
10ea0 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c  pDb->db, zBegin,
10eb0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
10ec0 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
10ed0 68 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  h--;.    }.    r
10ee0 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
10ef0 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  x(interp, pScrip
10f00 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  t, 0);.    if( !
10f10 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  inTrans ){.     
10f20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
10f30 64 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  d;.      if( rc=
10f40 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20  =TCL_ERROR ){.  
10f50 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 52 4f        zEnd = "RO
10f60 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 7d  LLBACK";.      }
10f70 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
10f80 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b  zEnd = "COMMIT";
10f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
10fa0 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b  Db->disableAuth+
10fb0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  +;.      if( sql
10fc0 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
10fd0 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30  b, zEnd, 0, 0, 0
10fe0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
10ff0 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
11000 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  b, "ROLLBACK", 0
11010 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
11020 0a 20 20 20 20 20 20 70 44 62 2d 3e 64 69 73 61  .      pDb->disa
11030 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20 7d  bleAuth--;.    }
11040 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11050 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
11060 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73  b update_hook ?s
11070 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24  cript?.  **    $
11080 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  db rollback_hook
11090 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20   ?script?.  */. 
110a0 20 63 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f   case DB_UPDATE_
110b0 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42  HOOK: .  case DB
110c0 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20  _ROLLBACK_HOOK: 
110d0 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70  {..    /* set pp
110e0 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74  Hook to point at
110f0 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20   pUpdateHook or 
11100 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64  pRollbackHook, d
11110 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20  epending on .   
11120 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62   ** whether [$db
11130 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72   update_hook] or
11140 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68   [$db rollback_h
11150 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64  ook] was invoked
11160 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  ..    */.    Tcl
11170 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a  _Obj **ppHook; .
11180 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
11190 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29  DB_UPDATE_HOOK )
111a0 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d  {.      ppHook =
111b0 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f   &pDb->pUpdateHo
111c0 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ok;.    }else{. 
111d0 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70       ppHook = &p
111e0 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
111f0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  k;.    }..    if
11200 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
11210 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 54  c!=3 ){.       T
11220 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11230 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
11240 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
11250 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11260 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11270 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a   if( *ppHook ){.
11280 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
11290 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a  Result(interp, *
112a0 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69  ppHook);.      i
112b0 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
112c0 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
112d0 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b  fCount(*ppHook);
112e0 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b  .        *ppHook
112f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
11300 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
11310 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==3 ){.      ass
11320 65 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20  ert( !(*ppHook) 
11330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  );.      if( Tcl
11340 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28 6f  _GetCharLength(o
11350 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20  bjv[2])>0 ){.   
11360 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f       *ppHook = o
11370 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  bjv[2];.        
11380 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
11390 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20  (*ppHook);.     
113a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71   }.    }..    sq
113b0 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
113c0 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d  k(pDb->db, (pDb-
113d0 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55  >pUpdateHook?DbU
113e0 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c  pdateHandler:0),
113f0 20 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   pDb);.    sqlit
11400 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
11410 28 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70  (pDb->db,(pDb->p
11420 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52  RollbackHook?DbR
11430 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30  ollbackHandler:0
11440 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65  ),pDb);..    bre
11450 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
11460 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a   $db version.  *
11470 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
11480 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  e version string
11490 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
114a0 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
114b0 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20  DB_VERSION: {.  
114c0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
114d0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
114e0 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
114f0 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  on(), TCL_STATIC
11500 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
11510 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f  }...  } /* End o
11520 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74 61  f the SWITCH sta
11530 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75  tement */.  retu
11540 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11550 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45    sqlite3 DBNAME
11560 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20   FILENAME ?-vfs 
11570 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b  VFSNAME? ?-key K
11580 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42  EY? ?-readonly B
11590 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20  OOLEAN?.**      
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 3f 2d 63 72 65 61 74 65 20 42 4f       ?-create BO
115c0 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78  OLEAN? ?-nomutex
115d0 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20   BOOLEAN?.**.** 
115e0 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  This is the main
115f0 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57   Tcl command.  W
11600 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22  hen the "sqlite"
11610 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a   Tcl command is.
11620 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73  ** invoked, this
11630 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f   routine runs to
11640 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f   process that co
11650 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mmand..**.** The
11660 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
11670 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61   DBNAME, is an a
11680 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f  rbitrary name fo
11690 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62  r a new.** datab
116a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
116b0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72   This command cr
116c0 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d  eates a new comm
116d0 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e  and named.** DBN
116e0 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64  AME that is used
116f0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74   to control that
11700 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
11710 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
11720 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65  nnection is dele
11730 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e  ted when the DBN
11740 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  AME command is d
11750 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
11760 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11770 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
11780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11790 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  le..**.*/.static
117a0 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64   int DbMain(void
117b0 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70   *cd, Tcl_Interp
117c0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
117d0 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  jc,Tcl_Obj *cons
117e0 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74  t*objv){.  Sqlit
117f0 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a  eDb *p;.  void *
11800 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pKey = 0;.  int 
11810 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  nKey = 0;.  cons
11820 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
11830 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
11840 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
11850 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
11860 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
11870 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  = 0;.  int flags
11880 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
11890 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
118a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
118b0 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61   Tcl_DString tra
118c0 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b  nslatedFilename;
118d0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
118e0 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
118f0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11900 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
11910 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
11920 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  rg,"-version")==
11930 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
11940 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11950 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rp,sqlite3_versi
11960 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74  on,0);.      ret
11970 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
11980 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
11990 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65  (zArg,"-has-code
119a0 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  c")==0 ){.#ifdef
119b0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
119c0 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  C.      Tcl_Appe
119d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
119e0 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20  "1",0);.#else.  
119f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11a00 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c  sult(interp,"0",
11a10 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
11a20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11a30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
11a40 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69  i=3; i+1<objc; i
11a50 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  +=2){.    zArg =
11a60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11a70 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  bjv[i]);.    if(
11a80 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b   strcmp(zArg,"-k
11a90 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
11aa0 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
11ab0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
11ac0 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79  objv[i+1], &nKey
11ad0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
11ae0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
11af0 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  vfs")==0 ){.    
11b00 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 56 66    i++;.      zVf
11b10 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
11b20 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20  g(objv[i]);.    
11b30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11b40 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c  (zArg, "-readonl
11b50 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
11b60 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
11b70 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
11b80 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
11b90 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
11ba0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
11bc0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
11bd0 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
11be0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
11bf0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
11c00 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
11c10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11c20 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
11c30 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
11c40 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
11c50 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
11c60 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
11c70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11c80 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
11c90 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11ca0 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29  zArg, "-create")
11cb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
11cc0 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
11cd0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
11ce0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
11cf0 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
11d00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11d10 20 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66       if( b && (f
11d20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
11d30 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20  EN_READONLY)==0 
11d40 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
11d50 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
11d60 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65  CREATE;.      }e
11d70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
11d80 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
11d90 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
11da0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
11db0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
11dc0 6e 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a  nomutex")==0 ){.
11dd0 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
11de0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
11df0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
11e00 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
11e10 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
11e20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
11e30 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
11e40 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
11e50 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20  PEN_NOMUTEX;.   
11e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11e70 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
11e80 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
11e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
11ea0 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
11eb0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11ec0 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  p, "unknown opti
11ed0 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68  on: ", zArg, (ch
11ee0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
11ef0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11f00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11f10 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26  objc<3 || (objc&
11f20 31 29 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  1)!=1 ){.    Tcl
11f30 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
11f40 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a  terp, 1, objv, .
11f50 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49        "HANDLE FI
11f60 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53  LENAME ?-vfs VFS
11f70 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79  NAME? ?-readonly
11f80 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61   BOOLEAN? ?-crea
11f90 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20  te BOOLEAN?".   
11fa0 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42     " ?-nomutex B
11fb0 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66 20  OOLEAN?".#ifdef 
11fc0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
11fd0 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43  .      " ?-key C
11fe0 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66  ODECKEY?".#endif
11ff0 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
12000 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12010 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b  }.  zErrMsg = 0;
12020 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62  .  p = (SqliteDb
12030 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
12040 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
12050 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c   p==0 ){.    Tcl
12060 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
12070 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  p, "malloc faile
12080 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  d", TCL_STATIC);
12090 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
120a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d  ERROR;.  }.  mem
120b0 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
120c0 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  (*p));.  zFile =
120d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
120e0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
120f0 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  );.  zFile = Tcl
12100 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61  _TranslateFileNa
12110 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65  me(interp, zFile
12120 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  , &translatedFil
12130 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  ename);.  sqlite
12140 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c  3_open_v2(zFile,
12150 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20   &p->db, flags, 
12160 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zVfs);.  Tcl_DSt
12170 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c  ringFree(&transl
12180 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  atedFilename);. 
12190 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
121a0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
121b0 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45  p->db) ){.    zE
121c0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
121d0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
121e0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
121f0 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  db));.    sqlite
12200 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a  3_close(p->db);.
12210 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20      p->db = 0;. 
12220 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
12230 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
12240 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71   p->db ){.    sq
12250 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c  lite3_key(p->db,
12260 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
12270 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
12280 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ->db==0 ){.    T
12290 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
122a0 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43  erp, zErrMsg, TC
122b0 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
122c0 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
122d0 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )p);.    sqlite3
122e0 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
122f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12300 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  RROR;.  }.  p->m
12310 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45  axStmt = NUM_PRE
12320 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70  PARED_STMTS;.  p
12330 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
12340 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  p;.  zArg = Tcl_
12350 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
12360 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
12370 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
12380 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72  mand(interp, zAr
12390 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68  g, DbObjCmd, (ch
123a0 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43  ar*)p, DbDeleteC
123b0 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  md);.  return TC
123c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  L_OK;.}../*.** P
123d0 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54  rovide a dummy T
123e0 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20  cl_InitStubs if 
123f0 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  we are using thi
12400 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a  s as a static.**
12410 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
12420 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  ndef USE_TCL_STU
12430 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f  BS.# undef  Tcl_
12440 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69  InitStubs.# defi
12450 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  ne Tcl_InitStubs
12460 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
12470 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
12480 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47  we have a PACKAG
12490 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20  E_VERSION macro 
124a0 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77  defined.  This w
124b0 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65  ill be.** define
124c0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
124d0 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66  by the TEA makef
124e0 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20  ile.  But other 
124f0 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20  makefiles.** do 
12500 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a  not define it..*
12510 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47  /.#ifndef PACKAG
12520 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69  E_VERSION.# defi
12530 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ne PACKAGE_VERSI
12540 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  ON SQLITE_VERSIO
12550 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
12560 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
12570 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  module..**.** Th
12580 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f  is Tcl module co
12590 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69  ntains only a si
125a0 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d  ngle new Tcl com
125b0 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69  mand named "sqli
125c0 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74  te"..** (Hence t
125d0 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73  here is no names
125e0 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20  pace.  There is 
125f0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e  no point in usin
12600 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  g a namespace.**
12610 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f   if the extensio
12620 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20  n only supplies 
12630 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20  one new name!)  
12640 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
12650 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20  mand is.** used 
12660 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51  to open a new SQ
12670 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
12680 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29  See the DbMain()
12690 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a   routine above.*
126a0 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
126b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
126c0 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
126d0 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
126e0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
126f0 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
12700 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b  terp, "8.4", 0);
12710 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
12720 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
12730 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f  "sqlite3", (Tcl_
12740 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
12750 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
12760 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
12770 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50  rp, "sqlite3", P
12780 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
12790 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
127a0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
127b0 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f  "sqlite", (Tcl_O
127c0 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
127d0 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  n, 0, 0);.  Tcl_
127e0 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
127f0 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43  p, "sqlite", PAC
12800 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
12810 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
12820 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
12830 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c  sqlite3_Init(Tcl
12840 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
12850 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
12860 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
12870 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
12880 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  te3_SafeInit(Tcl
12890 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
128a0 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
128b0 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
128c0 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69  lsqlite3_SafeIni
128d0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
128e0 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
128f0 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66  L_OK; }..#ifndef
12900 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58   SQLITE_3_SUFFIX
12910 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e 74  _ONLY.EXTERN int
12920 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c   Sqlite_Init(Tcl
12930 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
12940 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
12950 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
12960 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
12970 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
12980 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12990 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
129a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
129b0 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
129c0 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
129d0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
129e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
129f0 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
12a00 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63  lite_SafeInit(Tc
12a10 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12a20 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
12a30 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ; }.#endif..#ifd
12a40 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a  ef TCLSH./******
12a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a90 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63  *******.** The c
12aa0 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ode that follows
12ab0 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
12ac0 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c  d standalone TCL
12ad0 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2a   interpreters.**
12ae0 20 74 68 61 74 20 61 72 65 20 73 74 61 74 69 63   that are static
12af0 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74 68  ally linked with
12b00 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2f 0a 0a 2f   SQLite.  .*/../
12b10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
12b20 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20  o TCLSH is one, 
12b30 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65  then put in code
12b40 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a   this for the.**
12b50 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20   "main" routine 
12b60 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61  that will initia
12b70 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b  lize Tcl and tak
12b80 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20  e input from.** 
12b90 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20  standard input, 
12ba0 6f 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20  or if a file is 
12bb0 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d  named on the com
12bc0 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65  mand line.** the
12bd0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
12be0 20 72 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75   reads and evalu
12bf0 61 74 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a  ates that file..
12c00 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a  */.#if TCLSH==1.
12c10 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69  static char zMai
12c20 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74  nloop[] =.  "set
12c30 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77   line {}\n".  "w
12c40 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69  hile {![eof stdi
12c50 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66  n]} {\n".    "if
12c60 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b   {$line!=\"\"} {
12c70 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20  \n".      "puts 
12c80 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c  -nonewline \"> \
12c90 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65  "\n".    "} else
12ca0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74   {\n".      "put
12cb0 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25  s -nonewline \"%
12cc0 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22   \"\n".    "}\n"
12cd0 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f  .    "flush stdo
12ce0 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e  ut\n".    "appen
12cf0 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64  d line [gets std
12d00 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b  in]\n".    "if {
12d10 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24  [info complete $
12d20 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  line]} {\n".    
12d30 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75    "if {[catch {u
12d40 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d  plevel #0 $line}
12d50 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20   result]} {\n". 
12d60 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64         "puts std
12d70 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65  err \"Error: $re
12d80 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20  sult\"\n".      
12d90 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75  "} elseif {$resu
12da0 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  lt!=\"\"} {\n". 
12db0 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65         "puts $re
12dc0 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d  sult\n".      "}
12dd0 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c  \n".      "set l
12de0 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d  ine {}\n".    "}
12df0 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
12e00 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c   "append line \\
12e10 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  n\n".    "}\n". 
12e20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a   "}\n".;.#endif.
12e30 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
12e40 63 72 6f 20 54 43 4c 53 48 20 69 73 20 74 77 6f  cro TCLSH is two
12e50 2c 20 74 68 65 6e 20 67 65 74 20 74 68 65 20 6d  , then get the m
12e60 61 69 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75  ain loop code ou
12e70 74 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70 61  t of.** the sepa
12e80 72 61 74 65 20 66 69 6c 65 20 22 73 70 61 63 65  rate file "space
12e90 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a  anal_tcl.h"..*/.
12ea0 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61  #if TCLSH==2.sta
12eb0 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  tic char zMainlo
12ec0 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65  op[] = .#include
12ed0 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e   "spaceanal_tcl.
12ee0 68 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65  h".;.#endif..#de
12ef0 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20  fine TCLSH_MAIN 
12f00 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64  main   /* Needed
12f10 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74   to fake out mkt
12f20 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c  clapp */.int TCL
12f30 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63  SH_MAIN(int argc
12f40 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
12f50 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
12f60 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64  terp;.  Tcl_Find
12f70 45 78 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b  Executable(argv[
12f80 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  0]);.  interp = 
12f90 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70  Tcl_CreateInterp
12fa0 28 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e  ();.  Sqlite3_In
12fb0 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64  it(interp);.#ifd
12fc0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
12fd0 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e   {.    extern in
12fe0 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49  t Md5_Init(Tcl_I
12ff0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
13000 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f  ern int Sqliteco
13010 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  nfig_Init(Tcl_In
13020 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13030 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13040 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t1_Init(Tcl_Inte
13050 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13060 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32   int Sqlitetest2
13070 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
13080 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
13090 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49  nt Sqlitetest3_I
130a0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
130b0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
130c0 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
130d0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
130e0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
130f0 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
13100 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
13110 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
13120 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63  itetest6_Init(Tc
13130 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13140 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13150 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f  etest7_Init(Tcl_
13160 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
13170 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
13180 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est8_Init(Tcl_In
13190 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
131a0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
131b0 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t9_Init(Tcl_Inte
131c0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
131d0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61   int Sqlitetesta
131e0 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  sync_Init(Tcl_In
131f0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13200 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13210 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54  t_autoext_Init(T
13220 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
13230 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
13240 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74  tetest_func_Init
13250 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
13260 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
13270 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49  litetest_hexio_I
13280 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
13290 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
132a0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
132b0 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  oc_Init(Tcl_Inte
132c0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
132d0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
132e0 6d 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49  mutex_Init(Tcl_I
132f0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
13300 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
13310 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63  stschema_Init(Tc
13320 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13330 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13340 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63  etestsse_Init(Tc
13350 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13360 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13370 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
13380 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
13390 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
133a0 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49  litetestThread_I
133b0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
133c0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
133d0 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69   SqlitetestOnefi
133e0 6c 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65  le_Init();.    e
133f0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
13400 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28  testOsinst_Init(
13410 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20  Tcl_Interp*);.. 
13420 20 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65     Md5_Init(inte
13430 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 63  rp);.    Sqlitec
13440 6f 6e 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72  onfig_Init(inter
13450 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
13460 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st1_Init(interp)
13470 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
13480 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  2_Init(interp);.
13490 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f      Sqlitetest3_
134a0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
134b0 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e    Sqlitetest4_In
134c0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
134d0 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
134e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
134f0 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69  litetest6_Init(i
13500 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13510 74 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74  tetest7_Init(int
13520 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
13530 74 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72  test8_Init(inter
13540 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
13550 73 74 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st9_Init(interp)
13560 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
13570 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72  async_Init(inter
13580 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
13590 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28  st_autoext_Init(
135a0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
135b0 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69  itetest_func_Ini
135c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
135d0 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f  qlitetest_hexio_
135e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
135f0 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c    Sqlitetest_mal
13600 6c 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  loc_Init(interp)
13610 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
13620 5f 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65  _mutex_Init(inte
13630 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
13640 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69  estschema_Init(i
13650 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13660 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69  tetesttclvar_Ini
13670 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
13680 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f  qlitetestThread_
13690 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
136a0 20 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66    SqlitetestOnef
136b0 69 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ile_Init(interp)
136c0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
136d0 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65  Osinst_Init(inte
136e0 72 70 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  rp);..#ifdef SQL
136f0 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69  ITE_SSE.    Sqli
13700 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69  tetestsse_Init(i
13710 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20  nterp);.#endif. 
13720 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
13730 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48  argc>=2 || TCLSH
13740 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==2 ){.    int i
13750 3b 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67 63  ;.    char zArgc
13760 5b 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [32];.    sqlite
13770 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
13780 66 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c  f(zArgc), zArgc,
13790 20 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54   "%d", argc-(3-T
137a0 43 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f  CLSH));.    Tcl_
137b0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
137c0 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c  rgc", zArgc, TCL
137d0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
137e0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
137f0 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67  terp,"argv0",arg
13800 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f  v[1],TCL_GLOBAL_
13810 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
13820 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
13830 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f  gv", "", TCL_GLO
13840 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66  BAL_ONLY);.    f
13850 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c  or(i=3-TCLSH; i<
13860 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
13870 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
13880 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67  erp, "argv", arg
13890 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[i],.          
138a0 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20  TCL_GLOBAL_ONLY 
138b0 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  | TCL_LIST_ELEME
138c0 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f  NT | TCL_APPEND_
138d0 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20  VALUE);.    }.  
138e0 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26    if( TCLSH==1 &
138f0 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69  & Tcl_EvalFile(i
13900 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21  nterp, argv[1])!
13910 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
13920 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
13930 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28  fo = Tcl_GetVar(
13940 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e  interp, "errorIn
13950 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  fo", TCL_GLOBAL_
13960 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28  ONLY);.      if(
13970 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66   zInfo==0 ) zInf
13980 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75  o = interp->resu
13990 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  lt;.      fprint
139a0 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73  f(stderr,"%s: %s
139b0 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66  \n", *argv, zInf
139c0 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
139d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
139e0 69 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54  if( argc<=1 || T
139f0 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54  CLSH==2 ){.    T
13a00 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e  cl_GlobalEval(in
13a10 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29  terp, zMainloop)
13a20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
13a30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43  ;.}.#endif /* TC
13a40 4c 53 48 20 2a 2f 0a                             LSH */.