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

Artifact e1e9d89ce93e0372c519cc88d4a3f4df9ce5ff03:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 74  ite.**.** $Id: t
01a0: 63 6c 73 71 6c 69 74 65 2e 63 2c 76 20 31 2e 38  clsqlite.c,v 1.8
01b0: 37 20 32 30 30 34 2f 30 36 2f 31 38 20 31 37 3a  7 2004/06/18 17:
01c0: 31 30 3a 31 37 20 64 72 68 20 45 78 70 20 24 0a  10:17 drh Exp $.
01d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54 43  */.#ifndef NO_TC
01e0: 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74 68  L     /* Omit th
01f0: 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69 66  is whole file if
0200: 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c 61   TCL is unavaila
0210: 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  ble */..#include
0220: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0230: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
0240: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
0250: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0260: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0270: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a   <assert.h>../*.
0280: 2a 2a 20 49 66 20 54 43 4c 20 75 73 65 73 20 55  ** If TCL uses U
0290: 54 46 2d 38 20 61 6e 64 20 53 51 4c 69 74 65 20  TF-8 and SQLite 
02a0: 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
02b0: 20 75 73 65 20 69 73 6f 38 38 35 39 2c 20 74 68   use iso8859, th
02c0: 65 6e 20 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f  en we.** have to
02d0: 20 64 6f 20 61 20 74 72 61 6e 73 6c 61 74 69 6f   do a translatio
02e0: 6e 20 77 68 65 6e 20 67 6f 69 6e 67 20 62 65 74  n when going bet
02f0: 77 65 65 6e 20 74 68 65 20 74 77 6f 2e 20 20 53  ween the two.  S
0300: 65 74 20 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54  et the .** UTF_T
0310: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
0320: 44 20 6d 61 63 72 6f 20 74 6f 20 69 6e 64 69 63  D macro to indic
0330: 61 74 65 20 74 68 61 74 20 77 65 20 6e 65 65 64  ate that we need
0340: 20 74 6f 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74   to do.** this t
0350: 72 61 6e 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f  ranslation.  .*/
0360: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c  .#if defined(TCL
0370: 5f 55 54 46 5f 4d 41 58 29 20 26 26 20 21 64 65  _UTF_MAX) && !de
0380: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46  fined(SQLITE_UTF
0390: 38 29 0a 23 20 64 65 66 69 6e 65 20 55 54 46 5f  8).# define UTF_
03a0: 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44  TRANSLATION_NEED
03b0: 45 44 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ED 1.#endif../*.
03c0: 2a 2a 20 4e 65 77 20 53 51 4c 20 66 75 6e 63 74  ** New SQL funct
03d0: 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 72 65 61  ions can be crea
03e0: 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70  ted as TCL scrip
03f0: 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 66  ts.  Each such f
0400: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65  unction.** is de
0410: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0420: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0430: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0440: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0450: 72 75 63 74 20 53 71 6c 46 75 6e 63 20 53 71 6c  ruct SqlFunc Sql
0460: 46 75 6e 63 3b 0a 73 74 72 75 63 74 20 53 71 6c  Func;.struct Sql
0470: 46 75 6e 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74  Func {.  Tcl_Int
0480: 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f  erp *interp;   /
0490: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
04a0: 72 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74  ret to execute t
04b0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
04c0: 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20   char *zScript; 
04d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63         /* The sc
04e0: 72 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a  ript to be run *
04f0: 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e 65  /.  SqlFunc *pNe
0500: 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  xt;       /* Nex
0510: 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  t function on th
0520: 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  e list of them a
0530: 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ll */.};../*.** 
0540: 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  New collation se
0550: 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f 6e  quences function
0560: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
0570: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
0580: 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66 75   Each such.** fu
0590: 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72 69  nction is descri
05a0: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
05b0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
05c0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
05d0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
05e0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c 43   SqlCollate SqlC
05f0: 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20 53  ollate;.struct S
0600: 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54 63  qlCollate {.  Tc
0610: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69  ;   /* The TCL i
0630: 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65 63  nterpret to exec
0640: 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ute the function
0650: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63 72   */.  char *zScr
0660: 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ipt;        /* T
0670: 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65 20  he script to be 
0680: 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  run */.  SqlColl
0690: 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ate *pNext;     
06a0: 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69    /* Next functi
06b0: 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  on on the list o
06c0: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b  f them all */.};
06d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ../*.** There is
06e0: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
06f0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0700: 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20  for each SQLite 
0710: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74  database.** that
0720: 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
0730: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54   by the SQLite T
0740: 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  CL interface..*/
0750: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0760: 53 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44  SqliteDb SqliteD
0770: 62 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65  b;.struct Sqlite
0780: 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  Db {.  sqlite *d
0790: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
07a0: 54 68 65 20 22 72 65 61 6c 22 20 64 61 74 61 62  The "real" datab
07b0: 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ase structure */
07c0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
07d0: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
07e0: 69 6e 74 65 72 70 72 65 74 65 72 20 75 73 65 64  interpreter used
07f0: 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
0800: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  se */.  char *zB
0810: 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  usy;          /*
0820: 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   The busy callba
0830: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0840: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
0850: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
0860: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
0870: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0880: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0890: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63       /* The trac
08a0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
08b0: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ne */.  char *zP
08c0: 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 2f 2a  rogress;      /*
08d0: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
08e0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
08f0: 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b  /.  char *zAuth;
0900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0910: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
0920: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0930: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  */.  SqlFunc *pF
0940: 75 6e 63 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  unc;       /* Li
0950: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
0960: 6f 6e 73 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ons */.  SqlColl
0970: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 2f  ate *pCollate; /
0980: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
0990: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
09a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
09c0: 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d  Return code of m
09d0: 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
09e0: 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20 69  e3_exec() */.  i
09f0: 6e 74 20 6e 43 68 61 6e 67 65 3b 20 20 20 20 20  nt nChange;     
0a00: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
0a10: 20 63 68 61 6e 67 65 73 20 66 6f 72 20 74 68 65   changes for the
0a20: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 76 61   most recent eva
0a30: 6c 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  l */.  Tcl_Obj *
0a40: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20  pCollateNeeded; 
0a50: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65   /* Collation ne
0a60: 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 7d  eded script */.}
0a70: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
0a80: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
0a90: 75 63 74 75 72 65 20 70 61 73 73 65 73 20 69 6e  ucture passes in
0aa0: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 72 75 20 74  formation thru t
0ab0: 68 65 20 73 71 6c 69 74 65 0a 2a 2a 20 6c 6f 67  he sqlite.** log
0ac0: 69 63 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ic from the orig
0ad0: 69 6e 61 6c 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  inal TCL command
0ae0: 20 69 6e 74 6f 20 74 68 65 20 63 61 6c 6c 62 61   into the callba
0af0: 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74  ck routine..*/.t
0b00: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 61  ypedef struct Ca
0b10: 6c 6c 62 61 63 6b 44 61 74 61 20 43 61 6c 6c 62  llbackData Callb
0b20: 61 63 6b 44 61 74 61 3b 0a 73 74 72 75 63 74 20  ackData;.struct 
0b30: 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 7b 0a 20  CallbackData {. 
0b40: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0b50: 65 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  erp;       /* Th
0b60: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
0b70: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 72  r */.  char *zAr
0b80: 72 61 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ray;            
0b90: 20 2f 2a 20 54 68 65 20 61 72 72 61 79 20 69 6e   /* The array in
0ba0: 74 6f 20 77 68 69 63 68 20 64 61 74 61 20 69 73  to which data is
0bb0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 63   written */.  Tc
0bc0: 6c 5f 4f 62 6a 20 2a 70 43 6f 64 65 3b 20 20 20  l_Obj *pCode;   
0bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
0be0: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 66  ode to execute f
0bf0: 6f 72 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 20  or each row */. 
0c00: 20 69 6e 74 20 6f 6e 63 65 3b 20 20 20 20 20 20   int once;      
0c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
0c20: 74 20 66 6f 72 20 66 69 72 73 74 20 63 61 6c 6c  t for first call
0c30: 62 61 63 6b 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  back only */.  i
0c40: 6e 74 20 74 63 6c 5f 72 63 3b 20 20 20 20 20 20  nt tcl_rc;      
0c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
0c60: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 54 43 4c  rn code from TCL
0c70: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74   script */.  int
0c80: 20 6e 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20   nColName;      
0c90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0ca0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
0cb0: 68 65 20 61 7a 43 6f 6c 4e 61 6d 65 5b 5d 20 61  he azColName[] a
0cc0: 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rray */.  char *
0cd0: 2a 61 7a 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20  *azColName;     
0ce0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
0cf0: 6d 65 73 20 74 72 61 6e 73 6c 61 74 65 64 20 74  mes translated t
0d00: 6f 20 55 54 46 2d 38 20 2a 2f 0a 7d 3b 0a 0a 2f  o UTF-8 */.};../
0d10: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73  *.** This is a s
0d20: 65 63 6f 6e 64 20 61 6c 74 65 72 6e 61 74 69 76  econd alternativ
0d30: 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 64  e callback for d
0d40: 61 74 61 62 61 73 65 20 71 75 65 72 69 65 73 2e  atabase queries.
0d50: 20 20 41 20 74 68 65 0a 2a 2a 20 66 69 72 73 74    A the.** first
0d60: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
0d70: 69 72 73 74 20 72 6f 77 20 6f 66 20 74 68 65 20  irst row of the 
0d80: 72 65 73 75 6c 74 20 69 73 20 6d 61 64 65 20 74  result is made t
0d90: 68 65 20 54 43 4c 20 72 65 73 75 6c 74 2e 0a 2a  he TCL result..*
0da0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 45  /.static int DbE
0db0: 76 61 6c 43 61 6c 6c 62 61 63 6b 33 28 0a 20 20  valCallback3(.  
0dc0: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
0dd0: 2c 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 73  ,      /* An ins
0de0: 74 61 6e 63 65 20 6f 66 20 43 61 6c 6c 62 61 63  tance of Callbac
0df0: 6b 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  kData */.  int n
0e00: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
0e10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
0e20: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
0e30: 73 75 6c 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sult */.  char *
0e40: 2a 20 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  * azCol,        
0e50: 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 65 61 63   /* Data for eac
0e60: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  h column */.  ch
0e70: 61 72 20 2a 2a 20 61 7a 4e 20 20 20 20 20 20 20  ar ** azN       
0e80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 66 6f 72       /* Name for
0e90: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   each column */.
0ea0: 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
0eb0: 2a 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49  *interp = (Tcl_I
0ec0: 6e 74 65 72 70 2a 29 63 6c 69 65 6e 74 44 61 74  nterp*)clientDat
0ed0: 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45  a;.  Tcl_Obj *pE
0ee0: 6c 65 6d 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  lem;.  if( azCol
0ef0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
0f00: 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
0f10: 72 65 74 75 72 6e 20 31 3b 0a 23 69 66 64 65 66  return 1;.#ifdef
0f20: 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e   UTF_TRANSLATION
0f30: 5f 4e 45 45 44 45 44 0a 20 20 7b 0a 20 20 20 20  _NEEDED.  {.    
0f40: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c  Tcl_DString dCol
0f50: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
0f60: 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20  gInit(&dCol);.  
0f70: 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f    Tcl_ExternalTo
0f80: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c  UtfDString(NULL,
0f90: 20 61 7a 43 6f 6c 5b 30 5d 2c 20 2d 31 2c 20 26   azCol[0], -1, &
0fa0: 64 43 6f 6c 29 3b 0a 20 20 20 20 70 45 6c 65 6d  dCol);.    pElem
0fb0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
0fc0: 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56  Obj(Tcl_DStringV
0fd0: 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29  alue(&dCol), -1)
0fe0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
0ff0: 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 20 20  gFree(&dCol);.  
1000: 7d 0a 23 65 6c 73 65 0a 20 20 70 45 6c 65 6d 20  }.#else.  pElem 
1010: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
1020: 62 6a 28 61 7a 43 6f 6c 5b 30 5d 2c 20 2d 31 29  bj(azCol[0], -1)
1030: 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 53  ;.#endif.  Tcl_S
1040: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1050: 72 70 2c 20 70 45 6c 65 6d 29 3b 0a 20 20 72 65  rp, pElem);.  re
1060: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
1070: 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
1080: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65   command is dele
1090: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
10a0: 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28  oid DbDeleteCmd(
10b0: 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c  void *db){.  Sql
10c0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
10d0: 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 73 71  liteDb*)db;.  sq
10e0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d  lite3_close(pDb-
10f0: 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  >db);.  while( p
1100: 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20  Db->pFunc ){.   
1110: 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20   SqlFunc *pFunc 
1120: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
1130: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
1140: 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Func->pNext;.   
1150: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1160: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
1170: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
1180: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
1190: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
11a0: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
11b0: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
11c0: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
11d0: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
11e0: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
11f0: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
1200: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
1210: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1220: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
1230: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
1240: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
1250: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
1260: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
1270: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
1280: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d  pDb->zAuth);.  }
1290: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
12a0: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
12b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12c0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
12d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
12e0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
12f0: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
1300: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
1310: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
1320: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e  ler(void *cd, in
1330: 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c  t nTries){.  Sql
1340: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
1350: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
1360: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61  t rc;.  char zVa
1370: 6c 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a  l[30];.  char *z
1380: 43 6d 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  Cmd;.  Tcl_DStri
1390: 6e 67 20 63 6d 64 3b 0a 0a 20 20 54 63 6c 5f 44  ng cmd;..  Tcl_D
13a0: 53 74 72 69 6e 67 49 6e 69 74 28 26 63 6d 64 29  StringInit(&cmd)
13b0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
13c0: 70 70 65 6e 64 28 26 63 6d 64 2c 20 70 44 62 2d  ppend(&cmd, pDb-
13d0: 3e 7a 42 75 73 79 2c 20 2d 31 29 3b 0a 20 20 73  >zBusy, -1);.  s
13e0: 70 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64  printf(zVal, "%d
13f0: 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 54 63  ", nTries);.  Tc
1400: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
1410: 6c 65 6d 65 6e 74 28 26 63 6d 64 2c 20 7a 56 61  lement(&cmd, zVa
1420: 6c 29 3b 0a 20 20 7a 43 6d 64 20 3d 20 54 63 6c  l);.  zCmd = Tcl
1430: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 63  _DStringValue(&c
1440: 6d 64 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f  md);.  rc = Tcl_
1450: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
1460: 2c 20 7a 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 44  , zCmd);.  Tcl_D
1470: 53 74 72 69 6e 67 46 72 65 65 28 26 63 6d 64 29  StringFree(&cmd)
1480: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
1490: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
14a0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
14b0: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
14c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14d0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
14e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14f0: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
1500: 73 20 74 68 65 20 27 70 72 6f 67 72 65 73 73 20  s the 'progress 
1510: 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68  callback' for th
1520: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
1530: 74 61 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67  tatic int DbProg
1540: 72 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64  ressHandler(void
1550: 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44   *cd){.  SqliteD
1560: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
1570: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
1580: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ;..  assert( pDb
1590: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20  ->zProgress );. 
15a0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
15b0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
15c0: 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69  >zProgress);.  i
15d0: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
15e0: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
15f0: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
1600: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
1610: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
1620: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1630: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1640: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1650: 53 51 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e  SQLite trace han
1660: 64 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20  dler whenever a 
1670: 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20  new.** block of 
1680: 53 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e  SQL is executed.
1690: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
16a0: 20 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20   in pDb->zTrace 
16b0: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a  is executed..*/.
16c0: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 54 72  static void DbTr
16d0: 61 63 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  aceHandler(void 
16e0: 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *cd, const char 
16f0: 2a 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65  *zSql){.  Sqlite
1700: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
1710: 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44  eDb*)cd;.  Tcl_D
1720: 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54  String str;..  T
1730: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
1740: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
1750: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
1760: 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29  pDb->zTrace, -1)
1770: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
1780: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
1790: 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f  r, zSql);.  Tcl_
17a0: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
17b0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
17c0: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
17d0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
17e0: 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  r);.  Tcl_ResetR
17f0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
1800: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  p);.}../*.** Thi
1810: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1820: 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
1830: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
1840: 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c  ted.  The.** TCL
1850: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
1860: 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75  zCommit is execu
1870: 74 65 64 2e 20 20 49 66 20 69 74 20 72 65 74 75  ted.  If it retu
1880: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a  rns non-zero or.
1890: 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73 20  ** if it throws 
18a0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68  an exception, th
18b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
18c0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73   rolled back ins
18d0: 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67  tead.** of being
18e0: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73   committed..*/.s
18f0: 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d  tatic int DbComm
1900: 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  itHandler(void *
1910: 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  cd){.  SqliteDb 
1920: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
1930: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
1940: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  .  rc = Tcl_Eval
1950: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
1960: 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  b->zCommit);.  i
1970: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
1980: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
1990: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
19a0: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
19b0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
19c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
19d0: 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61  ic void tclColla
19e0: 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  teNeeded(.  void
19f0: 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65   *pCtx,.  sqlite
1a00: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c   *db,.  int enc,
1a10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a20: 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65  Name.){.  Sqlite
1a30: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
1a40: 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  eDb *)pCtx;.  Tc
1a50: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d  l_Obj *pScript =
1a60: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1a70: 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  j(pDb->pCollateN
1a80: 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e  eeded);.  Tcl_In
1a90: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
1aa0: 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pt);.  Tcl_ListO
1ab0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1ac0: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
1ad0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61  NewStringObj(zNa
1ae0: 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  me, -1));.  Tcl_
1af0: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
1b00: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
1b10: 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
1b20: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
1b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1b40: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1b50: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
1b60: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
1b70: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
1b80: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20  ed.** using TCL 
1b90: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
1ba0: 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c  c int tclSqlColl
1bb0: 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  ate(.  void *pCt
1bc0: 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63  x,.  int nA,.  c
1bd0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
1be0: 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74   int nB,.  const
1bf0: 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53   void *zB.){.  S
1c00: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28  qlCollate *p = (
1c10: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74  SqlCollate *)pCt
1c20: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  x;.  Tcl_Obj *pC
1c30: 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63  md;..  pCmd = Tc
1c40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
1c50: 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a  ->zScript, -1);.
1c60: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1c70: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f  nt(pCmd);.  Tcl_
1c80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1c90: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
1ca0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
1cb0: 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b  ingObj(zA, nA));
1cc0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
1cd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
1ce0: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c  nterp, pCmd, Tcl
1cf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42  _NewStringObj(zB
1d00: 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , nB));.  Tcl_Ev
1d10: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
1d20: 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 54  p, pCmd, 0);.  T
1d30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1d40: 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCmd);.  return 
1d50: 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72  (atoi(Tcl_GetStr
1d60: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
1d70: 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erp)));.}../*.**
1d80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1d90: 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75   called to evalu
1da0: 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  ate an SQL funct
1db0: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  ion implemented.
1dc0: 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72  ** using TCL scr
1dd0: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ipt..*/.static v
1de0: 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73  oid tclSqlFunc(s
1df0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1e00: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
1e10: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
1e20: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46   **argv){.  SqlF
1e30: 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  unc *p = sqlite3
1e40: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
1e50: 78 74 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  xt);.  Tcl_DStri
1e60: 6e 67 20 63 6d 64 3b 0a 20 20 69 6e 74 20 69 3b  ng cmd;.  int i;
1e70: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 63  .  int rc;..  Tc
1e80: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 63  l_DStringInit(&c
1e90: 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  md);.  Tcl_DStri
1ea0: 6e 67 41 70 70 65 6e 64 28 26 63 6d 64 2c 20 70  ngAppend(&cmd, p
1eb0: 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a  ->zScript, -1);.
1ec0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
1ed0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
1ee0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71   SQLITE_NULL==sq
1ef0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1f00: 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20  (argv[i]) ){.   
1f10: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
1f20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64  pendElement(&cmd
1f30: 2c 20 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , "");.    }else
1f40: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72  {.      Tcl_DStr
1f50: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
1f60: 28 26 63 6d 64 2c 20 73 71 6c 69 74 65 33 5f 76  (&cmd, sqlite3_v
1f70: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
1f80: 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ]));.    }.  }. 
1f90: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
1fa0: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
1fb0: 74 72 69 6e 67 56 61 6c 75 65 28 26 63 6d 64 29  tringValue(&cmd)
1fc0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1fd0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1fe0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
1ff0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
2000: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
2010: 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a   -1); .  }else{.
2020: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2030: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
2040: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
2050: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
2060: 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 53 51   -1, .        SQ
2070: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
2080: 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64 65 66 20 53  .  }.}.#ifndef S
2090: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
20a0: 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54  RIZATION./*.** T
20b0: 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68 65  his is the authe
20c0: 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  ntication functi
20d0: 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20  on.  It appends 
20e0: 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  the authenticati
20f0: 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20  on.** type code 
2100: 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67 75  and the two argu
2110: 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20  ments to zCmd[] 
2120: 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  then invokes the
2130: 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68   result.** on th
2140: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20  e interpreter.  
2150: 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78 61  The reply is exa
2160: 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69  mined to determi
2170: 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74  ne if the.** aut
2180: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c  hentication fail
2190: 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a  s or succeeds..*
21a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
21b0: 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f  h_callback(.  vo
21c0: 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20  id *pArg,.  int 
21d0: 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  code,.  const ch
21e0: 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e  ar *zArg1,.  con
21f0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a  st char *zArg2,.
2200: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
2210: 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg3,.  const cha
2220: 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68  r *zArg4.){.  ch
2230: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
2240: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
2250: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
2260: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
2270: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
2280: 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b  (SqliteDb*)pArg;
2290: 0a 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64 65  ..  switch( code
22a0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
22b0: 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20  ITE_COPY        
22c0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
22d0: 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65  QLITE_COPY"; bre
22e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
22f0: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
2300: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
2310: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
2320: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
2330: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
2340: 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20  TE_TABLE      : 
2350: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
2360: 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65  EATE_TABLE"; bre
2370: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2380: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
2390: 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53  INDEX : zCode="S
23a0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
23b0: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
23c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
23d0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
23e0: 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  LE : zCode="SQLI
23f0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
2400: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
2410: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
2420: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
2430: 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45  R: zCode="SQLITE
2440: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
2450: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
2460: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
2470: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20  EATE_TEMP_VIEW  
2480: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
2490: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
24a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
24b0: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
24c0: 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43  _TRIGGER    : zC
24d0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
24e0: 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  TE_TRIGGER"; bre
24f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2500: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20  ITE_CREATE_VIEW 
2510: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
2520: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
2530: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
2540: 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  ase SQLITE_DELET
2550: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
2560: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c  Code="SQLITE_DEL
2570: 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ETE"; break;.   
2580: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
2590: 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a  P_INDEX        :
25a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
25b0: 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  ROP_INDEX"; brea
25c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
25d0: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20  TE_DROP_TABLE   
25e0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
25f0: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22  LITE_DROP_TABLE"
2600: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
2610: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
2620: 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f  MP_INDEX   : zCo
2630: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
2640: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
2650: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2660: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
2670: 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  BLE   : zCode="S
2680: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
2690: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
26a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
26b0: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
26c0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
26d0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  _DROP_TEMP_TRIGG
26e0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
26f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
2700: 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20  _TEMP_VIEW    : 
2710: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
2720: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  OP_TEMP_VIEW"; b
2730: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2740: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
2750: 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  ER      : zCode=
2760: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49  "SQLITE_DROP_TRI
2770: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
2780: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
2790: 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20 20 20  OP_VIEW         
27a0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
27b0: 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61  DROP_VIEW"; brea
27c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
27d0: 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20  TE_INSERT       
27e0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
27f0: 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72  LITE_INSERT"; br
2800: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2810: 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20  LITE_PRAGMA     
2820: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
2830: 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20  SQLITE_PRAGMA"; 
2840: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2850: 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20  SQLITE_READ     
2860: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
2870: 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20  ="SQLITE_READ"; 
2880: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2890: 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20  SQLITE_SELECT   
28a0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
28b0: 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22  ="SQLITE_SELECT"
28c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
28d0: 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  e SQLITE_TRANSAC
28e0: 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f  TION       : zCo
28f0: 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53  de="SQLITE_TRANS
2900: 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a  ACTION"; break;.
2910: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2920: 55 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20  UPDATE          
2930: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
2940: 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b  E_UPDATE"; break
2950: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2960: 45 5f 41 54 54 41 43 48 20 20 20 20 20 20 20 20  E_ATTACH        
2970: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
2980: 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65  ITE_ATTACH"; bre
2990: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
29a0: 49 54 45 5f 44 45 54 41 43 48 20 20 20 20 20 20  ITE_DETACH      
29b0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
29c0: 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62  QLITE_DETACH"; b
29d0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
29e0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
29f0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
2a00: 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20  "????"; break;. 
2a10: 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67   }.  Tcl_DString
2a20: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
2a30: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
2a40: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68  &str, pDb->zAuth
2a50: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
2a60: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
2a70: 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a  t(&str, zCode);.
2a80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
2a90: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
2aa0: 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a   zArg1 ? zArg1 :
2ab0: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
2ac0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
2ad0: 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a  (&str, zArg2 ? z
2ae0: 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg2 : "");.  Tc
2af0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
2b00: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
2b10: 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29  g3 ? zArg3 : "")
2b20: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
2b30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
2b40: 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34  r, zArg4 ? zArg4
2b50: 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54   : "");.  rc = T
2b60: 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44  cl_GlobalEval(pD
2b70: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
2b80: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
2b90: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
2ba0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a  gFree(&str);.  z
2bb0: 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53  Reply = Tcl_GetS
2bc0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
2bd0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  >interp);.  if( 
2be0: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
2bf0: 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b  QLITE_OK")==0 ){
2c00: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c10: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2c20: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
2c30: 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30  SQLITE_DENY")==0
2c40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2c50: 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73  ITE_DENY;.  }els
2c60: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
2c70: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f  ply,"SQLITE_IGNO
2c80: 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  RE")==0 ){.    r
2c90: 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  c = SQLITE_IGNOR
2ca0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
2cb0: 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20  rc = 999;.  }.  
2cc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
2cd0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2ce0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
2cf0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74   */../*.** zText
2d00: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2d10: 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76   text obtained v
2d20: 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65  ia an sqlite3_re
2d30: 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f  sult_text().** o
2d40: 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66  r similar interf
2d50: 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ace. This routin
2d60: 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20  e returns a Tcl 
2d70: 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a  string object, .
2d80: 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ** reference cou
2d90: 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e  nt set to 0, con
2da0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74  taining the text
2db0: 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69  . If a translati
2dc0: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73  on.** between is
2dd0: 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20  o8859 and UTF-8 
2de0: 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20  is required, it 
2df0: 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f  is preformed..*/
2e00: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
2e10: 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61  *dbTextToObj(cha
2e20: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b  r const *zText){
2e30: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c  .  Tcl_Obj *pVal
2e40: 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41  ;.#ifdef UTF_TRA
2e50: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a  NSLATION_NEEDED.
2e60: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43    Tcl_DString dC
2e70: 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ol;.  Tcl_DStrin
2e80: 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20  gInit(&dCol);.  
2e90: 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74  Tcl_ExternalToUt
2ea0: 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a  fDString(NULL, z
2eb0: 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29  Text, -1, &dCol)
2ec0: 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e  ;.  pVal = Tcl_N
2ed0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
2ee0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43  DStringValue(&dC
2ef0: 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ol), -1);.  Tcl_
2f00: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f  DStringFree(&dCo
2f10: 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c  l);.#else.  pVal
2f20: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
2f30: 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a  Obj(zText, -1);.
2f40: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2f50: 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pVal;.}../*.** T
2f60: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
2f70: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
2f80: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
2f90: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
2fa0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
2fb0: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
2fc0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
2fd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
2fe0: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
2ff0: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
3000: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
3010: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
3020: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
3030: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
3040: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
3050: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
3060: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
3070: 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61   db1  "my_databa
3080: 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31  se".**       db1
3090: 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65   close.**.** The
30a0: 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f   first command o
30b0: 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f  pens a connectio
30c0: 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74  n to the "my_dat
30d0: 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65 0a  abase" database.
30e0: 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61  ** and calls tha
30f0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62  t connection "db
3100: 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  1".  The second 
3110: 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74  command causes t
3120: 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  his.** subroutin
3130: 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e  e to be invoked.
3140: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
3150: 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64  bObjCmd(void *cd
3160: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
3170: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54  terp, int objc,T
3180: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
3190: 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  jv){.  SqliteDb 
31a0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
31b0: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69  *)cd;.  int choi
31c0: 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54  ce;.  int rc = T
31d0: 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20  CL_OK;.  static 
31e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73  const char *DB_s
31f0: 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61  trs[] = {.    "a
3200: 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20  uthorizer",     
3210: 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 20 20      "busy",     
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
3230: 68 61 6e 67 65 73 22 2c 0a 20 20 20 20 22 63 6c  hanges",.    "cl
3240: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
3250: 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22     "commit_hook"
3260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ,            "co
3270: 6d 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 65 72  mplete",.    "er
3280: 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20  rorcode",       
3290: 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20     "eval",      
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 75               "fu
32b0: 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 6c 61  nction",.    "la
32c0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22  st_insert_rowid"
32d0: 2c 20 20 22 6c 61 73 74 5f 73 74 61 74 65 6d 65  ,  "last_stateme
32e0: 6e 74 5f 63 68 61 6e 67 65 73 22 2c 20 22 6f 6e  nt_changes", "on
32f0: 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20 22 70  ecolumn",.    "p
3300: 72 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20 20  rogress",       
3310: 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20 20      "rekey",    
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
3330: 69 6d 65 6f 75 74 22 2c 0a 20 20 20 20 22 74 72  imeout",.    "tr
3340: 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ace",           
3350: 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20 20     "collate",   
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
3370: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c  llation_needed",
3380: 0a 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20  .    0          
3390: 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a            .  };.
33a0: 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b    enum DB_enum {
33b0: 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a  .    DB_AUTHORIZ
33c0: 45 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42 55  ER,        DB_BU
33d0: 53 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SY,             
33e0: 20 20 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53        DB_CHANGES
33f0: 2c 0a 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20  ,.    DB_CLOSE, 
3400: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
3410: 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20  OMMIT_HOOK,     
3420: 20 20 20 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45         DB_COMPLE
3430: 54 45 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52  TE,.    DB_ERROR
3440: 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44 42  CODE,         DB
3450: 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20  _EVAL,          
3460: 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43           DB_FUNC
3470: 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 4c 41 53  TION,.    DB_LAS
3480: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20  T_INSERT_ROWID, 
3490: 44 42 5f 4c 41 53 54 5f 53 54 41 54 45 4d 45 4e  DB_LAST_STATEMEN
34a0: 54 5f 43 48 41 4e 47 45 53 2c 20 44 42 5f 4f 4e  T_CHANGES, DB_ON
34b0: 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20 20  ECOLUMN,        
34c0: 0a 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53  .    DB_PROGRESS
34d0: 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 45  ,          DB_RE
34e0: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  KEY,            
34f0: 20 20 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54        DB_TIMEOUT
3500: 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20  ,.    DB_TRACE, 
3510: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
3520: 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20  OLLATE,         
3530: 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54         DB_COLLAT
3540: 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 7d 3b 0a  ION_NEEDED.  };.
3550: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
3560: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
3570: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
3580: 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41   objv, "SUBCOMMA
3590: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
35a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
35b0: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
35c0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
35d0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44  terp, objv[1], D
35e0: 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22  B_strs, "option"
35f0: 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b  , 0, &choice) ){
3600: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3610: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
3620: 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65  itch( (enum DB_e
3630: 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20  num)choice ){.. 
3640: 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f   /*    $db autho
3650: 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f  rizer ?CALLBACK?
3660: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
3670: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
3680: 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a  back to authoriz
3690: 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61  e each SQL opera
36a0: 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20  tion as it is.  
36b0: 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20  ** compiled.  5 
36c0: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
36d0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61  pended to the ca
36e0: 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74  llback before it
36f0: 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64   is.  ** invoked
3700: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31  :.  **.  **   (1
3710: 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  ) The authorizat
3720: 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51  ion type (ex: SQ
3730: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
3740: 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  E, SQLITE_INSERT
3750: 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32  , ...).  **   (2
3760: 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74  ) First descript
3770: 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64  ive name (depend
3780: 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s on authorizati
3790: 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20  on type).  **   
37a0: 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72  (3) Second descr
37b0: 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a  iptive name.  **
37c0: 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74     (4) Name of t
37d0: 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a  he database (ex:
37e0: 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29   "main", "temp")
37f0: 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65  .  **   (5) Name
3800: 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74   of trigger that
3810: 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63   is doing the ac
3820: 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cess.  **.  ** T
3830: 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75  he callback shou
3840: 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20  ld return on of 
3850: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3860: 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b  rings: SQLITE_OK
3870: 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47  ,.  ** SQLITE_IG
3880: 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f  NORE, or SQLITE_
3890: 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72  DENY.  Any other
38a0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
38b0: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a   an error..  **.
38c0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74    ** If this met
38d0: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  hod is invoked w
38e0: 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
38f0: 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75  , the current au
3900: 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  thorization.  **
3910: 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67   callback string
3920: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
3930: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54  */.  case DB_AUT
3940: 48 4f 52 49 5a 45 52 3a 20 7b 0a 20 20 20 20 69  HORIZER: {.    i
3950: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
3960: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
3970: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
3980: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
3990: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
39a0: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
39b0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
39c0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
39d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
39e0: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68  terp, pDb->zAuth
39f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
3a10: 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20  har *zAuth;.    
3a20: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
3a30: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
3a40: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
3a50: 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b  ree(pDb->zAuth);
3a60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
3a70: 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74  Auth = Tcl_GetSt
3a80: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
3a90: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
3aa0: 20 20 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c    if( zAuth && l
3ab0: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
3ac0: 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c  pDb->zAuth = Tcl
3ad0: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
3ae0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  );.        strcp
3af0: 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41  y(pDb->zAuth, zA
3b00: 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  uth);.      }els
3b10: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
3b20: 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  zAuth = 0;.     
3b30: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
3b40: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
3b50: 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70  TION.      if( p
3b60: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
3b70: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
3b80: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
3b90: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
3ba0: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
3bb0: 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  b, auth_callback
3bc0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
3bd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3be0: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
3bf0: 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  zer(pDb->db, 0, 
3c00: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
3c10: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
3c20: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
3c30: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
3c40: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
3c50: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
3c60: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
3c70: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
3c80: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
3c90: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
3ca0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
3cb0: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
3cc0: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
3cd0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
3ce0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
3cf0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
3d00: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
3d10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3d20: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3d30: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
3d40: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
3d50: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
3d60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3d70: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30  p, pDb->zBusy, 0
3d80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3d90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
3da0: 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69   *zBusy;.      i
3db0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
3dc0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
3dd0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
3de0: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
3df0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73      }.      zBus
3e00: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
3e10: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
3e20: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
3e30: 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e  f( zBusy && len>
3e40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
3e50: 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c  ->zBusy = Tcl_Al
3e60: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
3e70: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
3e80: 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79  Db->zBusy, zBusy
3e90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3ea0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
3eb0: 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sy = 0;.      }.
3ec0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
3ed0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
3ee0: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
3ef0: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
3f00: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
3f10: 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75  er(pDb->db, DbBu
3f20: 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  syHandler, pDb);
3f30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
3f50: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
3f60: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
3f70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
3f80: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
3f90: 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e   $db progress ?N
3fa0: 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20   CALLBACK?.  ** 
3fb0: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
3fc0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
3fd0: 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20  every N virtual 
3fe0: 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20  machine opcodes 
3ff0: 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a  while executing.
4000: 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
4010: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
4020: 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28  GRESS: {.    if(
4030: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
4040: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
4050: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
4060: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4070: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  (interp, pDb->zP
4080: 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20  rogress, 0);.   
4090: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
40a0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
40b0: 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72      char *zProgr
40c0: 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ess;.      int l
40d0: 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b  en;.      int N;
40e0: 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  .      if( TCL_O
40f0: 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
4100: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
4110: 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 09 72 65  v[2], &N) ){..re
4120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4130: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
4140: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
4150: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  s ){.        Tcl
4160: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67  _Free(pDb->zProg
4170: 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ress);.      }. 
4180: 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d       zProgress =
4190: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
41a0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
41b0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
41c0: 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e  zProgress && len
41d0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
41e0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54  b->zProgress = T
41f0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
4200: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
4210: 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65  cpy(pDb->zProgre
4220: 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 29 3b 0a  ss, zProgress);.
4230: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4240: 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
4250: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ess = 0;.      }
4260: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4270: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
4280: 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28  LLBACK.      if(
4290: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
42a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
42b0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
42c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
42d0: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
42e0: 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62  r(pDb->db, N, Db
42f0: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c  ProgressHandler,
4300: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
4310: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4320: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
4330: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  dler(pDb->db, 0,
4340: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
4350: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
4360: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
4370: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
4380: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c   2, objv, "N CAL
4390: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
43a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
43b0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
43c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
43d0: 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73       $db changes
43e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
43f0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
4400: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
4410: 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
4420: 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79  d, or deleted by
4430: 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72  .  ** the most r
4440: 65 63 65 6e 74 20 22 65 76 61 6c 22 2e 0a 20 20  ecent "eval"..  
4450: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41  */.  case DB_CHA
4460: 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  NGES: {.    Tcl_
4470: 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
4480: 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 3b 0a 20    int nChange;. 
4490: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
44a0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
44b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
44c0: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
44d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
44e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
44f0: 20 2f 2a 20 6e 43 68 61 6e 67 65 20 3d 20 73 71   /* nChange = sq
4500: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44  lite3_changes(pD
4510: 62 2d 3e 64 62 29 3b 20 2a 2f 0a 20 20 20 20 6e  b->db); */.    n
4520: 43 68 61 6e 67 65 20 3d 20 70 44 62 2d 3e 6e 43  Change = pDb->nC
4530: 68 61 6e 67 65 3b 0a 20 20 20 20 70 52 65 73 75  hange;.    pResu
4540: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
4550: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
4560: 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
4570: 28 70 52 65 73 75 6c 74 2c 20 6e 43 68 61 6e 67  (pResult, nChang
4580: 65 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  e);.    break;. 
4590: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
45a0: 20 20 24 64 62 20 6c 61 73 74 5f 73 74 61 74 65    $db last_state
45b0: 6d 65 6e 74 5f 63 68 61 6e 67 65 73 0a 20 20 2a  ment_changes.  *
45c0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
45d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
45e0: 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66   that were modif
45f0: 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f  ied, inserted, o
4600: 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a  r deleted by.  *
4610: 2a 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 6d  * the last statm
4620: 65 6e 74 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  ent to complete 
4630: 65 78 65 63 75 74 69 6f 6e 20 28 65 78 63 6c 75  execution (exclu
4640: 64 69 6e 67 20 63 68 61 6e 67 65 73 20 64 75 65  ding changes due
4650: 20 74 6f 0a 20 20 2a 2a 20 74 72 69 67 67 65 72   to.  ** trigger
4660: 73 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s).  */.  case D
4670: 42 5f 4c 41 53 54 5f 53 54 41 54 45 4d 45 4e 54  B_LAST_STATEMENT
4680: 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
4690: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
46a0: 3b 0a 20 20 20 20 69 6e 74 20 6c 73 43 68 61 6e  ;.    int lsChan
46b0: 67 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ge;.    if( objc
46c0: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
46d0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
46e0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
46f0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
4700: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4710: 7d 0a 20 20 20 20 6c 73 43 68 61 6e 67 65 20 3d  }.    lsChange =
4720: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 73 74   sqlite3_last_st
4730: 61 74 65 6d 65 6e 74 5f 63 68 61 6e 67 65 73 28  atement_changes(
4740: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52  pDb->db);.    pR
4750: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
4760: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
4770: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
4780: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 73 43  Obj(pResult, lsC
4790: 68 61 6e 67 65 29 3b 0a 20 20 20 20 62 72 65 61  hange);.    brea
47a0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
47b0: 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20  $db close.  **. 
47c0: 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65   ** Shutdown the
47d0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20   database.  */. 
47e0: 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20   case DB_CLOSE: 
47f0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  {.    Tcl_Delete
4800: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
4810: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
4820: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
4830: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4840: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
4850: 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c  ommit_hook ?CALL
4860: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
4870: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
4880: 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62   callback just b
4890: 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
48a0: 20 65 76 65 72 79 20 53 51 4c 20 74 72 61 6e 73   every SQL trans
48b0: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20  action..  ** If 
48c0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74 68 72  the callback thr
48d0: 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
48e0: 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d   or returns non-
48f0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20  zero, then the. 
4900: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
4910: 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49 66 20  is aborted.  If 
4920: 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20 65  CALLBACK is an e
4930: 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65  mpty string, the
4940: 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69   callback.  ** i
4950: 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f  s disabled..  */
4960: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49  .  case DB_COMMI
4970: 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66  T_HOOK: {.    if
4980: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
4990: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
49a0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
49b0: 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
49c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
49d0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
49e0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
49f0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
4a00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4a10: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
4a20: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  mit, 0);.      }
4a30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4a40: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
4a50: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
4a60: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
4a70: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
4a80: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
4a90: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  zCommit);.      
4aa0: 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20  }.      zCommit 
4ab0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
4ac0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
4ad0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
4ae0: 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e   zCommit && len>
4af0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
4b00: 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f  ->zCommit = Tcl_
4b10: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
4b20: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
4b30: 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a  (pDb->zCommit, z
4b40: 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  Commit);.      }
4b50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
4b60: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a  b->zCommit = 0;.
4b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4b80: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
4b90: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
4ba0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
4bb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4bc0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
4bd0: 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e  >db, DbCommitHan
4be0: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
4bf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4c00: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
4c10: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c  hook(pDb->db, 0,
4c20: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4c30: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
4c40: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
4c50: 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a  omplete SQL.  **
4c60: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  .  ** Return TRU
4c70: 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f  E if SQL is a co
4c80: 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
4c90: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41  ment.  Return FA
4ca0: 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69  LSE if.  ** addi
4cb0: 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20  tional lines of 
4cc0: 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65 64  input are needed
4cd0: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
4ce0: 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62  ar to the.  ** b
4cf0: 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f  uilt-in "info co
4d00: 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20  mplete" command 
4d10: 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63  of Tcl..  */.  c
4d20: 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a  ase DB_COMPLETE:
4d30: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
4d40: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
4d50: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20   isComplete;.   
4d60: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
4d70: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
4d80: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
4d90: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
4da0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
4db0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
4dc0: 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73    isComplete = s
4dd0: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
4de0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
4df0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
4e00: 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  ) );.    pResult
4e10: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
4e20: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
4e30: 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f   Tcl_SetBooleanO
4e40: 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f  bj(pResult, isCo
4e50: 6d 70 6c 65 74 65 29 3b 0a 20 20 20 20 62 72 65  mplete);.    bre
4e60: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
4e70: 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63  **    $db errorc
4e80: 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ode.  **.  ** Re
4e90: 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63  turn the numeric
4ea0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
4eb0: 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79   was returned by
4ec0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
4ed0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
4ee0: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20  lite3_exec()..  
4ef0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52  */.  case DB_ERR
4f00: 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63  ORCODE: {.    Tc
4f10: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
4f20: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
4f30: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  tObj(sqlite3_err
4f40: 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b  code(pDb->db)));
4f50: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4f60: 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20     .  /*.  **   
4f70: 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f   $db eval $sql ?
4f80: 61 72 72 61 79 20 7b 20 20 2e 2e 2e 63 6f 64 65  array {  ...code
4f90: 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  ... }?.  **.  **
4fa0: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
4fb0: 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
4fc0: 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
4fd0: 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
4fe0: 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
4ff0: 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
5000: 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
5010: 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
5020: 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
5030: 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
5040: 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
5050: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
5060: 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
5070: 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
5080: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
5090: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
50a0: 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
50b0: 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
50c0: 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
50d0: 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
50e0: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
50f0: 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
5100: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
5110: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
5120: 56 41 4c 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  VAL: {.    char 
5130: 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b 0a 20 20 20  const *zSql;.   
5140: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4c 65   char const *zLe
5150: 66 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ft;.    sqlite3_
5160: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
5170: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20    Tcl_Obj *pRet 
5180: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
5190: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
51a0: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 0a 20 20 20  ount(pRet);..   
51b0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
51c0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
51d0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
51e0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
51f0: 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e  v, "SQL ?ARRAY-N
5200: 41 4d 45 20 43 4f 44 45 3f 22 29 3b 0a 20 20 20  AME CODE?");.   
5210: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5220: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5230: 70 44 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30  pDb->nChange = 0
5240: 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c  ;.    zSql = Tcl
5250: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
5260: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
5270: 20 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30     while( zSql[0
5280: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ] ){.      int i
5290: 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 53  ;.  .      if( S
52a0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
52b0: 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
52c0: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
52d0: 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a  tmt, &zLeft) ){.
52e0: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
52f0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
5300: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
5310: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
5320: 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >db)));.        
5330: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
5340: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5350: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
5360: 69 66 28 20 70 53 74 6d 74 20 26 26 20 6f 62 6a  if( pStmt && obj
5370: 63 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20  c==5 ){.        
5380: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73  Tcl_Obj *pColLis
5390: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
53a0: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e  ;.        Tcl_In
53b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c  crRefCount(pColL
53c0: 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 66  ist);..        f
53d0: 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c 69 74 65  or(i=0; i<sqlite
53e0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
53f0: 53 74 6d 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Stmt); i++){.   
5400: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
5410: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5420: 69 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74  interp, pColList
5430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5440: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
5450: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
5460: 70 53 74 6d 74 2c 20 69 29 29 0a 20 20 20 20 20  pStmt, i)).     
5470: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
5480: 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  }.        Tcl_Ob
5490: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
54a0: 6f 62 6a 76 5b 33 5d 2c 54 63 6c 5f 4e 65 77 53  objv[3],Tcl_NewS
54b0: 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 2d 31 29  tringObj("*",-1)
54c0: 2c 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20  ,pColList,0);.  
54d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 77 68 69      }..      whi
54e0: 6c 65 28 20 70 53 74 6d 74 20 26 26 20 53 51 4c  le( pStmt && SQL
54f0: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
5500: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
5510: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
5520: 20 69 3c 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   i<sqlite3_colum
5530: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 20  n_count(pStmt); 
5540: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
5550: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20  Tcl_Obj *pVal;. 
5560: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
5570: 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20      /* Set pVal 
5580: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69  to contain the i
5590: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
55a0: 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  is row. */.     
55b0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
55c0: 42 4c 4f 42 21 3d 73 71 6c 69 74 65 33 5f 63 6f  BLOB!=sqlite3_co
55d0: 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
55e0: 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   i) ){.         
55f0: 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74     pVal = dbText
5600: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ToObj(sqlite3_co
5610: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
5620: 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   i));.          
5630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5640: 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73     int bytes = s
5650: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
5660: 74 65 73 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  tes(pStmt, i);. 
5670: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
5680: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
5690: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ayObj(sqlite3_co
56a0: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
56b0: 20 69 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20   i), bytes);.   
56c0: 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
56d0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d        if( objc==
56e0: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  5 ){.           
56f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 61 6d 65 20   Tcl_Obj *pName 
5700: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  = dbTextToObj(sq
5710: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
5720: 65 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20  e(pStmt, i));.  
5730: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
5740: 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 61 6d 65  crRefCount(pName
5750: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
5760: 66 28 20 21 73 74 72 63 6d 70 28 22 22 2c 20 54  f( !strcmp("", T
5770: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
5780: 76 5b 33 5d 29 29 20 29 7b 0a 20 20 20 20 20 20  v[3])) ){.      
5790: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53          Tcl_ObjS
57a0: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
57b0: 4e 61 6d 65 2c 20 30 2c 20 70 56 61 6c 2c 20 30  Name, 0, pVal, 0
57c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
57d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
57e0: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
57f0: 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
5800: 33 5d 2c 20 70 4e 61 6d 65 2c 20 70 56 61 6c 2c  3], pName, pVal,
5810: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
5820: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54   }.            T
5830: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
5840: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  pName);.        
5850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5860: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
5870: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5880: 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c  terp, pRet, pVal
5890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
58a0: 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
58b0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20      if( objc==5 
58c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
58d0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
58e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
58f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
5900: 66 28 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52  f( rc!=TCL_ERROR
5910: 20 29 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a   ) rc = TCL_OK;.
5920: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5930: 7d 0a 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  }.       .      
5940: 69 66 28 20 70 53 74 6d 74 20 26 26 20 53 51 4c  if( pStmt && SQL
5950: 49 54 45 5f 53 43 48 45 4d 41 3d 3d 73 71 6c 69  ITE_SCHEMA==sqli
5960: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
5970: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  mt) ){.        c
5980: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
5990: 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 70 53  .  .      if( pS
59a0: 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  tmt && SQLITE_OK
59b0: 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
59c0: 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20  e(pDb->db) ){.  
59d0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
59e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
59f0: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
5a00: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
5a10: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  b)));.        rc
5a20: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
5a30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5a40: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 44 62 2d     }..      pDb-
5a50: 3e 6e 43 68 61 6e 67 65 20 2b 3d 20 73 71 6c 69  >nChange += sqli
5a60: 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  te3_changes(pDb-
5a70: 3e 64 62 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c  >db);.      zSql
5a80: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a   = zLeft;.    }.
5a90: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c  .    if( rc==TCL
5aa0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
5ab0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
5ac0: 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20  terp, pRet);.   
5ad0: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
5ae0: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 0a  efCount(pRet);..
5af0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
5b00: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
5b10: 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20  b function NAME 
5b20: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
5b30: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
5b40: 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  L function calle
5b50: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
5b60: 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  r that function 
5b70: 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20  is.  ** called, 
5b80: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
5b90: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
5ba0: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
5bb0: 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a  ase DB_FUNCTION:
5bc0: 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a   {.    SqlFunc *
5bd0: 70 46 75 6e 63 3b 0a 20 20 20 20 63 68 61 72 20  pFunc;.    char 
5be0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
5bf0: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
5c00: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
5c10: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
5c20: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
5c30: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
5c40: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
5c50: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
5c60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5c70: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
5c80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
5c90: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
5ca0: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
5cb0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
5cc0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
5cd0: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46  nScript);.    pF
5ce0: 75 6e 63 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29  unc = (SqlFunc*)
5cf0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
5d00: 66 28 2a 70 46 75 6e 63 29 20 2b 20 6e 53 63 72  f(*pFunc) + nScr
5d10: 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  ipt + 1 );.    i
5d20: 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65  f( pFunc==0 ) re
5d30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5d40: 20 20 20 20 70 46 75 6e 63 2d 3e 69 6e 74 65 72      pFunc->inter
5d50: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
5d60: 70 46 75 6e 63 2d 3e 70 4e 65 78 74 20 3d 20 70  pFunc->pNext = p
5d70: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70  Db->pFunc;.    p
5d80: 46 75 6e 63 2d 3e 7a 53 63 72 69 70 74 20 3d 20  Func->zScript = 
5d90: 28 63 68 61 72 2a 29 26 70 46 75 6e 63 5b 31 5d  (char*)&pFunc[1]
5da0: 3b 0a 20 20 20 20 73 74 72 63 70 79 28 70 46 75  ;.    strcpy(pFu
5db0: 6e 63 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63  nc->zScript, zSc
5dc0: 72 69 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  ript);.    sqlit
5dd0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
5de0: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
5df0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
5e00: 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  F8, 0, .        
5e10: 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e  pFunc, tclSqlFun
5e20: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 62 72  c, 0, 0);.    br
5e30: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
5e40: 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74   **     $db last
5e50: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20  _insert_rowid . 
5e60: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
5e70: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
5e80: 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f   is the ROWID fo
5e90: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
5ea0: 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20  t insert..  */. 
5eb0: 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e   case DB_LAST_IN
5ec0: 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20  SERT_ROWID: {.  
5ed0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
5ee0: 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77 69  lt;.    int rowi
5ef0: 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  d;.    if( objc!
5f00: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
5f10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
5f20: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
5f30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5f40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5f50: 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c  .    rowid = sql
5f60: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
5f70: 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b  _rowid(pDb->db);
5f80: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
5f90: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
5fa0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
5fb0: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
5fc0: 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20  lt, rowid);.    
5fd0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
5fe0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6f 6e  .  **     $db on
5ff0: 65 63 6f 6c 75 6d 6e 20 53 51 4c 0a 20 20 2a 2a  ecolumn SQL.  **
6000: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  .  ** Return a s
6010: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 66 72 6f  ingle column fro
6020: 6d 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  m a single row o
6030: 66 20 74 68 65 20 67 69 76 65 6e 20 53 51 4c 20  f the given SQL 
6040: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61  query..  */.  ca
6050: 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a  se DB_ONECOLUMN:
6060: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71   {.    char *zSq
6070: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  l;.    char *zEr
6080: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66  rMsg = 0;.    if
6090: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
60a0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
60b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
60c0: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
60d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
60e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
60f0: 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
6100: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
6110: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  2], 0);.    rc =
6120: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
6130: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 44 62 45  b->db, zSql, DbE
6140: 76 61 6c 43 61 6c 6c 62 61 63 6b 33 2c 20 69 6e  valCallback3, in
6150: 74 65 72 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b  terp, &zErrMsg);
6160: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6170: 49 54 45 5f 41 42 4f 52 54 20 29 7b 0a 20 20 20  ITE_ABORT ){.   
6180: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6190: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
61a0: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
61b0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
61c0: 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c  interp, zErrMsg,
61d0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
61e0: 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 4d        free(zErrM
61f0: 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
6200: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6210: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
6220: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6230: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6240: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
6250: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
6260: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
6270: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6280: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6290: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65  .  **     $db re
62a0: 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a  key KEY.  **.  *
62b0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63  * Change the enc
62c0: 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74  ryption key on t
62d0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
62e0: 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  n database..  */
62f0: 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59  .  case DB_REKEY
6300: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  : {.    int nKey
6310: 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  ;.    void *pKey
6320: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
6330: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
6340: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6350: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
6360: 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
6370: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6380: 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63   }.    pKey = Tc
6390: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
63a0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
63b0: 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  nKey);.#ifdef SQ
63c0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
63d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f 72     rc = sqlite_r
63e0: 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b  ekey(pDb->db, pK
63f0: 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69  ey, nKey);.    i
6400: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
6410: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6420: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
6430: 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
6440: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
6450: 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ROR;.    }.#endi
6460: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
6470: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
6480: 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c  $db timeout MILL
6490: 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20  ESECONDS.  **.  
64a0: 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65  ** Delay for the
64b0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
64c0: 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65  seconds specifie
64d0: 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73  d when a file is
64e0: 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20   locked..  */.  
64f0: 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a  case DB_TIMEOUT:
6500: 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20   {.    int ms;. 
6510: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
6520: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
6530: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6540: 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49   2, objv, "MILLI
6550: 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20  SECONDS");.     
6560: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6570: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
6580: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
6590: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
65a0: 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
65b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
65c0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
65d0: 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d  meout(pDb->db, m
65e0: 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  s);.    break;. 
65f0: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
6600: 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
6610: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
6620: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
6630: 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
6640: 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
6650: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
6660: 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
6670: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
6680: 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
6690: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
66a0: 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
66b0: 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
66c0: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
66d0: 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
66e0: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
66f0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
6700: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
6710: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
6720: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
6730: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
6740: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
6750: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
6760: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6770: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61  nterp, pDb->zTra
6780: 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ce, 0);.      }.
6790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
67a0: 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20   char *zTrace;. 
67b0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
67c0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
67d0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
67e0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
67f0: 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ace);.      }.  
6800: 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c      zTrace = Tcl
6810: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6820: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
6830: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61  ;.      if( zTra
6840: 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ce && len>0 ){. 
6850: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
6860: 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ce = Tcl_Alloc( 
6870: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
6880: 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a     strcpy(pDb->z
6890: 54 72 61 63 65 2c 20 7a 54 72 61 63 65 29 3b 0a  Trace, zTrace);.
68a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
68b0: 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
68c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
68d0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
68e0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
68f0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
6900: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
6910: 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e  ite3_trace(pDb->
6920: 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c  db, DbTraceHandl
6930: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
6940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
6950: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62  qlite3_trace(pDb
6960: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
6970: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
6980: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
6990: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
69a0: 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54  late NAME SCRIPT
69b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
69c0: 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c  e a new SQL coll
69d0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63  ation function c
69e0: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
69f0: 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  never.  ** that 
6a00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6a10: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
6a20: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
6a30: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
6a40: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41  .  case DB_COLLA
6a50: 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c  TE: {.    SqlCol
6a60: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a  late *pCollate;.
6a70: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
6a80: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69  .    char *zScri
6a90: 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72  pt;.    int nScr
6aa0: 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ipt;.    if( obj
6ab0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
6ac0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6ad0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
6ae0: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
6af0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6b00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6b10: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
6b20: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
6b30: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
6b40: 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65  zScript = Tcl_Ge
6b50: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
6b60: 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74  bjv[3], &nScript
6b70: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20  );.    pCollate 
6b80: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54  = (SqlCollate*)T
6b90: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
6ba0: 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53  (*pCollate) + nS
6bb0: 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20  cript + 1 );.   
6bc0: 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30   if( pCollate==0
6bd0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
6be0: 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ROR;.    pCollat
6bf0: 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  e->interp = inte
6c00: 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  rp;.    pCollate
6c10: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
6c20: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f  Collate;.    pCo
6c30: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d  llate->zScript =
6c40: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74   (char*)&pCollat
6c50: 65 5b 31 5d 3b 0a 20 20 20 20 73 74 72 63 70 79  e[1];.    strcpy
6c60: 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69  (pCollate->zScri
6c70: 70 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20  pt, zScript);.  
6c80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72    if( sqlite3_cr
6c90: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70  eate_collation(p
6ca0: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53  Db->db, zName, S
6cb0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
6cc0: 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74       pCollate, t
6cd0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b  clSqlCollate) ){
6ce0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
6cf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6d00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6d10: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
6d20: 20 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20   collate_needed 
6d30: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
6d40: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
6d50: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
6d60: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
6d70: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
6d80: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
6d90: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
6da0: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
6db0: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
6dc0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
6dd0: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
6de0: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
6df0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
6e00: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6e10: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
6e20: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
6e30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6e40: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
6e50: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
6e60: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
6e70: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
6e80: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
6e90: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
6ea0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
6eb0: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
6ec0: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
6ed0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
6ee0: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
6ef0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
6f00: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
6f10: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
6f20: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
6f30: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
6f40: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 7d 20 2f 2a 20  ak;.  }..  } /* 
6f50: 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43  End of the SWITC
6f60: 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  H statement */. 
6f70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6f80: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 20 44 42  *.**   sqlite DB
6f90: 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d  NAME FILENAME ?M
6fa0: 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a  ODE? ?-key KEY?.
6fb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
6fc0: 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61  e main Tcl comma
6fd0: 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73  nd.  When the "s
6fe0: 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61  qlite" Tcl comma
6ff0: 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  nd is.** invoked
7000: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
7010: 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74  uns to process t
7020: 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  hat command..**.
7030: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
7040: 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69  ument, DBNAME, i
7050: 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e  s an arbitrary n
7060: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a  ame for a new.**
7070: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7080: 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d  tion.  This comm
7090: 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65  and creates a ne
70a0: 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a  w command named.
70b0: 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69  ** DBNAME that i
70c0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  s used to contro
70d0: 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  l that connectio
70e0: 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  n.  The database
70f0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
7100: 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  s deleted when t
7110: 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e  he DBNAME comman
7120: 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  d is deleted..**
7130: 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
7140: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
7150: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
7160: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
7170: 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  ns.** the sqlite
7180: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
7190: 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
71a0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74  ..**.** For test
71b0: 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65  ing purposes, we
71c0: 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74 68   also support th
71d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
71e0: 2a 2a 20 20 73 71 6c 69 74 65 20 2d 65 6e 63 6f  **  sqlite -enco
71f0: 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ding.**.**      
7200: 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e 63 6f   Return the enco
7210: 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c 49 4b  ding used by LIK
7220: 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61  E and GLOB opera
7230: 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73 0a 2a  tors.  Choices.*
7240: 2a 20 20 20 20 20 20 20 61 72 65 20 55 54 46 2d  *       are UTF-
7250: 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e 0a 2a  8 and iso8859..*
7260: 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 20 2d 76 65  *.**  sqlite -ve
7270: 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rsion.**.**     
7280: 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72    Return the ver
7290: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74  sion number of t
72a0: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
72b0: 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  y..**.**  sqlite
72c0: 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a   -tcl-uses-utf.*
72d0: 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72  *.**       Retur
72e0: 6e 20 22 31 22 20 69 66 20 63 6f 6d 70 69 6c 65  n "1" if compile
72f0: 64 20 77 69 74 68 20 61 20 54 63 6c 20 75 73 65  d with a Tcl use
7300: 73 20 55 54 46 2d 38 2e 20 20 52 65 74 75 72 6e  s UTF-8.  Return
7310: 20 22 30 22 20 69 66 0a 2a 2a 20 20 20 20 20 20   "0" if.**      
7320: 20 6e 6f 74 2e 20 20 55 73 65 64 20 62 79 20 74   not.  Used by t
7330: 65 73 74 73 20 74 6f 20 6d 61 6b 65 20 73 75 72  ests to make sur
7340: 65 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  e the library wa
7350: 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20  s compiled .**  
7360: 20 20 20 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a       correctly..
7370: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
7380: 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54  Main(void *cd, T
7390: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
73a0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f  p, int objc,Tcl_
73b0: 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29  Obj *const*objv)
73c0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b  {.  SqliteDb *p;
73d0: 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20  .  void *pKey = 
73e0: 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  0;.  int nKey = 
73f0: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
7400: 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a  *zArg;.  char *z
7410: 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e 73 74 20  ErrMsg;.  const 
7420: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
7430: 68 61 72 20 7a 42 75 66 5b 38 30 5d 3b 0a 20 20  har zBuf[80];.  
7440: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
7450: 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
7460: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
7470: 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[1], 0);.    
7480: 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
7490: 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29  "-version")==0 )
74a0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
74b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
74c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c  sqlite3_version,
74d0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
74e0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
74f0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
7500: 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29  rg,"-has-codec")
7510: 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
7520: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
7530: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
7540: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22  esult(interp,"1"
7550: 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ,0);.#else.     
7560: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7570: 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b  t(interp,"0",0);
7580: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
7590: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
75a0: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
75b0: 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d 75 73 65  p(zArg,"-tcl-use
75c0: 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b 0a 23 69  s-utf")==0 ){.#i
75d0: 66 64 65 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58  fdef TCL_UTF_MAX
75e0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
75f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
7600: 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1",0);.#else.   
7610: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7620: 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30  ult(interp,"0",0
7630: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
7640: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
7650: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
7660: 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d  bjc==5 || objc==
7670: 36 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  6 ){.    zArg = 
7680: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7690: 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32  mObj(objv[objc-2
76a0: 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73  ], 0);.    if( s
76b0: 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79  trcmp(zArg,"-key
76c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ")==0 ){.      p
76d0: 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
76e0: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
76f0: 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65  jv[objc-1], &nKe
7700: 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a 63 20 2d  y);.      objc -
7710: 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 2;.    }.  }. 
7720: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
7730: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
7740: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
7750: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
7760: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
7770: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
7780: 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
7790: 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d 4b 45 59   ?-key CODEC-KEY
77a0: 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  ?".#else.      "
77b0: 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20  HANDLE FILENAME 
77c0: 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69 66 0a 20  ?MODE?".#endif. 
77d0: 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
77e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
77f0: 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
7800: 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29   p = (SqliteDb*)
7810: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
7820: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
7830: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
7840: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
7850: 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22   "malloc failed"
7860: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
7870: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7880: 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ROR;.  }.  memse
7890: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
78a0: 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54  p));.  zFile = T
78b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
78c0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
78d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
78e0: 41 53 5f 43 4f 44 45 43 0a 20 20 70 2d 3e 64 62  AS_CODEC.  p->db
78f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
7900: 65 6e 63 72 79 70 74 65 64 28 7a 46 69 6c 65 2c  encrypted(zFile,
7910: 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 30 2c 20   pKey, nKey, 0, 
7920: 26 7a 45 72 72 4d 73 67 29 3b 0a 23 65 6c 73 65  &zErrMsg);.#else
7930: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  .  sqlite3_open(
7940: 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a  zFile, &p->db);.
7950: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
7960: 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  =sqlite3_errcode
7970: 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a  (p->db) ){.    z
7980: 45 72 72 4d 73 67 20 3d 20 73 74 72 64 75 70 28  ErrMsg = strdup(
7990: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
79a0: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  ->db));.    sqli
79b0: 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
79c0: 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b  ;.    p->db = 0;
79d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
79e0: 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
79f0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
7a00: 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c  interp, zErrMsg,
7a10: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
7a20: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
7a30: 61 72 2a 29 70 29 3b 0a 20 20 20 20 66 72 65 65  ar*)p);.    free
7a40: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72  (zErrMsg);.    r
7a50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7a60: 0a 20 20 7d 0a 20 20 7a 41 72 67 20 3d 20 54 63  .  }.  zArg = Tc
7a70: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
7a80: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
7a90: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
7aa0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
7ab0: 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28  Arg, DbObjCmd, (
7ac0: 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
7ad0: 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eCmd);..  /* The
7ae0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
7af0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
7b00: 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65  e sqlite* pointe
7b10: 72 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e 74 66  r.  */.  sprintf
7b20: 28 7a 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e  (zBuf, "%p", p->
7b30: 64 62 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63  db);.  if( strnc
7b40: 6d 70 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20  mp(zBuf,"0x",2) 
7b50: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
7b60: 42 75 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e  Buf, "0x%p", p->
7b70: 64 62 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  db);.  }.  Tcl_A
7b80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7b90: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 0a 20  rp, zBuf, 0);.. 
7ba0: 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20   /* If compiled 
7bb0: 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
7bc0: 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 6e   turned on, then
7bd0: 20 72 65 67 69 73 74 65 72 20 74 68 65 20 22 6d   register the "m
7be0: 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c 20  d5sum".  ** SQL 
7bf0: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  function..  */.#
7c00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
7c10: 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  T.  {.    extern
7c20: 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74   void Md5_Regist
7c30: 65 72 28 73 71 6c 69 74 65 2a 29 3b 0a 20 20 20  er(sqlite*);.   
7c40: 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 70 2d   Md5_Register(p-
7c50: 3e 64 62 29 3b 0a 20 20 20 7d 0a 23 65 6e 64 69  >db);.   }.#endi
7c60: 66 20 20 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  f  .  p->interp 
7c70: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 72 65 74 75  = interp;.  retu
7c80: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
7c90: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75  .** Provide a du
7ca0: 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  mmy Tcl_InitStub
7cb0: 73 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e  s if we are usin
7cc0: 67 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74  g this as a stat
7cd0: 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a  ic.** library..*
7ce0: 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43  /.#ifndef USE_TC
7cf0: 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20  L_STUBS.# undef 
7d00: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23   Tcl_InitStubs.#
7d10: 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74   define Tcl_Init
7d20: 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e  Stubs(a,b,c).#en
7d30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  dif../*.** Initi
7d40: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
7d50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63  e..**.** This Tc
7d60: 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e  l module contain
7d70: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
7d80: 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  new Tcl command 
7d90: 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a  named "sqlite"..
7da0: 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20  ** (Hence there 
7db0: 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e  is no namespace.
7dc0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f    There is no po
7dd0: 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e  int in using a n
7de0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74  amespace.** if t
7df0: 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c  he extension onl
7e00: 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e  y supplies one n
7e10: 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22  ew name!)  The "
7e20: 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20  sqlite" command 
7e30: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70  is.** used to op
7e40: 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20  en a new SQLite 
7e50: 64 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74  database.  See t
7e60: 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74  he DbMain() rout
7e70: 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72  ine above.** for
7e80: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
7e90: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  rmation..*/.int 
7ea0: 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c  Sqlite3_Init(Tcl
7eb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
7ec0: 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  {.  Tcl_InitStub
7ed0: 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 30 22 2c  s(interp, "8.0",
7ee0: 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
7ef0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
7f00: 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54  rp, "sqlite", (T
7f10: 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44  cl_ObjCmdProc*)D
7f20: 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  bMain, 0, 0);.  
7f30: 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
7f40: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
7f50: 20 22 32 2e 30 22 29 3b 0a 20 20 72 65 74 75 72   "2.0");.  retur
7f60: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  n TCL_OK;.}.int 
7f70: 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28  Tclsqlite3_Init(
7f80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7f90: 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53  rp){.  Tcl_InitS
7fa0: 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
7fb0: 30 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  0", 0);.  Tcl_Cr
7fc0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
7fd0: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
7fe0: 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
7ff0: 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
8000: 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
8010: 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
8020: 65 22 2c 20 22 32 2e 30 22 29 3b 0a 20 20 72 65  e", "2.0");.  re
8030: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69  turn TCL_OK;.}.i
8040: 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49  nt Sqlite3_SafeI
8050: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
8060: 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74 75 72  interp){.  retur
8070: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  n TCL_OK;.}.int 
8080: 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49  Tclsqlite3_SafeI
8090: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
80a0: 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74 75 72  interp){.  retur
80b0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
80c0: 20 30 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70   0./*.** If comp
80d0: 69 6c 65 64 20 75 73 69 6e 67 20 6d 6b 74 63 6c  iled using mktcl
80e0: 61 70 70 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  app, this routin
80f0: 65 20 72 75 6e 73 20 74 6f 20 69 6e 69 74 69 61  e runs to initia
8100: 6c 69 7a 65 0a 2a 2a 20 65 76 65 72 79 74 68 69  lize.** everythi
8110: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 45 74 5f 41 70  ng..*/.int Et_Ap
8120: 70 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  pInit(Tcl_Interp
8130: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74   *interp){.  ret
8140: 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  urn Sqlite3_Init
8150: 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  (interp);.}.#end
8160: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
8170: 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
8180: 64 65 66 69 6e 65 64 20 61 6e 64 20 69 73 20 6f  defined and is o
8190: 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20  ne, then put in 
81a0: 63 6f 64 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20  code for the.** 
81b0: 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74  "main" routine t
81c0: 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c  hat will initial
81d0: 69 7a 65 20 54 63 6c 2e 0a 2a 2f 0a 23 69 66 20  ize Tcl..*/.#if 
81e0: 64 65 66 69 6e 65 64 28 54 43 4c 53 48 29 20 26  defined(TCLSH) &
81f0: 26 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69  & TCLSH==1.stati
8200: 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
8210: 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65  [] =.  "set line
8220: 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20   {}\n".  "while 
8230: 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b  {![eof stdin]} {
8240: 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69  \n".    "if {$li
8250: 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  ne!=\"\"} {\n". 
8260: 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
8270: 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a  wline \"> \"\n".
8280: 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
8290: 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
82a0: 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e  newline \"% \"\n
82b0: 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20  ".    "}\n".    
82c0: 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22  "flush stdout\n"
82d0: 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e  .    "append lin
82e0: 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
82f0: 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f  ".    "if {[info
8300: 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d   complete $line]
8310: 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66  } {\n".      "if
8320: 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65   {[catch {upleve
8330: 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75  l #0 $line} resu
8340: 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  lt]} {\n".      
8350: 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c    "puts stderr \
8360: 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c  "Error: $result\
8370: 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c  "\n".      "} el
8380: 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
8390: 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
83a0: 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c    "puts $result\
83b0: 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  n".      "}\n". 
83c0: 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b       "set line {
83d0: 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65  }\n".    "} else
83e0: 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70   {\n".      "app
83f0: 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a  end line \\n\n".
8400: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e      "}\n".  "}\n
8410: 22 0a 3b 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c  ".;..#define TCL
8420: 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f  SH_MAIN main   /
8430: 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65  * Needed to fake
8440: 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f   out mktclapp */
8450: 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28  .int TCLSH_MAIN(
8460: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
8470: 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e  *argv){.  Tcl_In
8480: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
8490: 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62  Tcl_FindExecutab
84a0: 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  le(argv[0]);.  i
84b0: 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61  nterp = Tcl_Crea
84c0: 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71  teInterp();.  Sq
84d0: 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
84e0: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
84f0: 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65  E_TEST.  {.    e
8500: 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
8510: 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49  test1_Init(Tcl_I
8520: 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
8530: 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
8540: 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st2_Init(Tcl_Int
8550: 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
8560: 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
8570: 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
8580: 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
8590: 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f  int Sqlitetest4_
85a0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
85b0: 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
85c0: 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e  t Sqlitetest5_In
85d0: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
85e0: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
85f0: 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Md5_Init(Tcl_Int
8600: 65 72 70 2a 29 3b 0a 20 20 20 20 53 71 6c 69 74  erp*);.    Sqlit
8610: 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65  etest1_Init(inte
8620: 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
8630: 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70  est2_Init(interp
8640: 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
8650: 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t3_Init(interp);
8660: 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 34  .    Sqlitetest4
8670: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
8680: 20 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49     Sqlitetest5_I
8690: 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
86a0: 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70   Md5_Init(interp
86b0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
86c0: 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20  if( argc>=2 ){. 
86d0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63     int i;.    Tc
86e0: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
86f0: 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c  "argv0",argv[1],
8700: 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
8710: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
8720: 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20  (interp,"argv", 
8730: 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  "", TCL_GLOBAL_O
8740: 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  NLY);.    for(i=
8750: 32 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  2; i<argc; i++){
8760: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61  .      Tcl_SetVa
8770: 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22  r(interp, "argv"
8780: 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20  , argv[i],.     
8790: 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f       TCL_GLOBAL_
87a0: 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f  ONLY | TCL_LIST_
87b0: 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50  ELEMENT | TCL_AP
87c0: 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20  PEND_VALUE);.   
87d0: 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 45   }.    if( Tcl_E
87e0: 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20  valFile(interp, 
87f0: 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b  argv[1])!=TCL_OK
8800: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
8810: 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63  char *zInfo = Tc
8820: 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_GetVar(interp,
8830: 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43   "errorInfo", TC
8840: 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
8850: 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d        if( zInfo=
8860: 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74  =0 ) zInfo = int
8870: 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20  erp->result;.   
8880: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
8890: 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61  r,"%s: %s\n", *a
88a0: 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20  rgv, zInfo);.   
88b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
88c0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
88d0: 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69  Tcl_GlobalEval(i
88e0: 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70  nterp, zMainloop
88f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8900: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54  0;.}.#endif /* T
8910: 43 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  CLSH */..#endif 
8920: 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  /* !defined(NO_T
8930: 43 4c 29 20 2a 2f 0a                             CL) */.