/ Hex Artifact Content
Login

Artifact 0b62e8df6da5abdddf49f3d9274a8103ee61fb63:


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 36  clsqlite.c,v 1.6
01b0: 39 20 32 30 30 34 2f 30 35 2f 32 35 20 31 32 3a  9 2004/05/25 12:
01c0: 30 35 3a 35 37 20 64 61 6e 69 65 6c 6b 31 39 37  05:57 danielk197
01d0: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
01e0: 65 66 20 4e 4f 5f 54 43 4c 20 20 20 20 20 2f 2a  ef NO_TCL     /*
01f0: 20 4f 6d 69 74 20 74 68 69 73 20 77 68 6f 6c 65   Omit this whole
0200: 20 66 69 6c 65 20 69 66 20 54 43 4c 20 69 73 20   file if TCL is 
0210: 75 6e 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 0a  unavailable */..
0220: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0230: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0240: 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65  "tcl.h".#include
0250: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0260: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0270: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0280: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43  .h>../*.** If TC
0290: 4c 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e 64  L uses UTF-8 and
02a0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66 69   SQLite is confi
02b0: 67 75 72 65 64 20 74 6f 20 75 73 65 20 69 73 6f  gured to use iso
02c0: 38 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a  8859, then we.**
02d0: 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74 72   have to do a tr
02e0: 61 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67  anslation when g
02f0: 6f 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65  oing between the
0300: 20 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20 0a   two.  Set the .
0310: 2a 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ** UTF_TRANSLATI
0320: 4f 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f 20  ON_NEEDED macro 
0330: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
0340: 20 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a   we need to do.*
0350: 2a 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69  * this translati
0360: 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66  on.  .*/.#if def
0370: 69 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58  ined(TCL_UTF_MAX
0380: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
0390: 4c 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65 66  LITE_UTF8).# def
03a0: 69 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  ine UTF_TRANSLAT
03b0: 49 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e  ION_NEEDED 1.#en
03c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53  dif../*.** New S
03d0: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  QL functions can
03e0: 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54   be created as T
03f0: 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63  CL scripts.  Eac
0400: 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a  h such function.
0410: 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65 64 20  ** is described 
0420: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0430: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0440: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
0450: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0460: 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74  Func SqlFunc;.st
0470: 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20  ruct SqlFunc {. 
0480: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0490: 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43  erp;   /* The TC
04a0: 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65  L interpret to e
04b0: 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74  xecute the funct
04c0: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
04d0: 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f  Script;        /
04e0: 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20  * The script to 
04f0: 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 46  be run */.  SqlF
0500: 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  unc *pNext;     
0510: 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69    /* Next functi
0520: 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  on on the list o
0530: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b  f them all */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ../*.** There is
0550: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
0560: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0570: 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20  for each SQLite 
0580: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74  database.** that
0590: 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
05a0: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54   by the SQLite T
05b0: 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  CL interface..*/
05c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05d0: 53 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44  SqliteDb SqliteD
05e0: 62 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65  b;.struct Sqlite
05f0: 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  Db {.  sqlite *d
0600: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
0610: 54 68 65 20 22 72 65 61 6c 22 20 64 61 74 61 62  The "real" datab
0620: 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ase structure */
0630: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
0640: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
0650: 69 6e 74 65 72 70 72 65 74 65 72 20 75 73 65 64  interpreter used
0660: 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
0670: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  se */.  char *zB
0680: 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  usy;          /*
0690: 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   The busy callba
06a0: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
06b0: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
06c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
06d0: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
06e0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
06f0: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0700: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63       /* The trac
0710: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
0720: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ne */.  char *zP
0730: 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 2f 2a  rogress;      /*
0740: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
0750: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0760: 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b  /.  char *zAuth;
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0780: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
0790: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
07a0: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  */.  SqlFunc *pF
07b0: 75 6e 63 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  unc;       /* Li
07c0: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
07d0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ons */.  int rc;
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
07f0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
0800: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
0810: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 7d  ite3_exec() */.}
0820: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
0830: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
0840: 75 63 74 75 72 65 20 70 61 73 73 65 73 20 69 6e  ucture passes in
0850: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 72 75 20 74  formation thru t
0860: 68 65 20 73 71 6c 69 74 65 0a 2a 2a 20 6c 6f 67  he sqlite.** log
0870: 69 63 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ic from the orig
0880: 69 6e 61 6c 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  inal TCL command
0890: 20 69 6e 74 6f 20 74 68 65 20 63 61 6c 6c 62 61   into the callba
08a0: 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74  ck routine..*/.t
08b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 61  ypedef struct Ca
08c0: 6c 6c 62 61 63 6b 44 61 74 61 20 43 61 6c 6c 62  llbackData Callb
08d0: 61 63 6b 44 61 74 61 3b 0a 73 74 72 75 63 74 20  ackData;.struct 
08e0: 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 7b 0a 20  CallbackData {. 
08f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0900: 65 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  erp;       /* Th
0910: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
0920: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 72  r */.  char *zAr
0930: 72 61 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ray;            
0940: 20 2f 2a 20 54 68 65 20 61 72 72 61 79 20 69 6e   /* The array in
0950: 74 6f 20 77 68 69 63 68 20 64 61 74 61 20 69 73  to which data is
0960: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 63   written */.  Tc
0970: 6c 5f 4f 62 6a 20 2a 70 43 6f 64 65 3b 20 20 20  l_Obj *pCode;   
0980: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
0990: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 66  ode to execute f
09a0: 6f 72 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 20  or each row */. 
09b0: 20 69 6e 74 20 6f 6e 63 65 3b 20 20 20 20 20 20   int once;      
09c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
09d0: 74 20 66 6f 72 20 66 69 72 73 74 20 63 61 6c 6c  t for first call
09e0: 62 61 63 6b 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  back only */.  i
09f0: 6e 74 20 74 63 6c 5f 72 63 3b 20 20 20 20 20 20  nt tcl_rc;      
0a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
0a10: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 54 43 4c  rn code from TCL
0a20: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74   script */.  int
0a30: 20 6e 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20   nColName;      
0a40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0a50: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
0a60: 68 65 20 61 7a 43 6f 6c 4e 61 6d 65 5b 5d 20 61  he azColName[] a
0a70: 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rray */.  char *
0a80: 2a 61 7a 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20  *azColName;     
0a90: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
0aa0: 6d 65 73 20 74 72 61 6e 73 6c 61 74 65 64 20 74  mes translated t
0ab0: 6f 20 55 54 46 2d 38 20 2a 2f 0a 7d 3b 0a 0a 23  o UTF-8 */.};..#
0ac0: 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c  ifdef UTF_TRANSL
0ad0: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 2f 2a 0a  ATION_NEEDED./*.
0ae0: 2a 2a 20 43 61 6c 6c 65 64 20 66 6f 72 20 65 61  ** Called for ea
0af0: 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
0b00: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sult..**.** This
0b10: 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65 64   version is used
0b20: 20 77 68 65 6e 20 54 43 4c 20 65 78 70 65 63 74   when TCL expect
0b30: 73 20 55 54 46 2d 38 20 64 61 74 61 20 62 75 74  s UTF-8 data but
0b40: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
0b50: 20 75 73 65 73 20 74 68 65 20 49 53 4f 38 38 35   uses the ISO885
0b60: 39 20 66 6f 72 6d 61 74 2e 20 20 41 20 74 72 61  9 format.  A tra
0b70: 6e 73 6c 61 74 69 6f 6e 20 6d 75 73 74 20 6f 63  nslation must oc
0b80: 63 75 72 20 66 72 6f 6d 20 49 53 4f 38 38 35 39  cur from ISO8859
0b90: 20 69 6e 74 6f 0a 2a 2a 20 55 54 46 2d 38 2e 0a   into.** UTF-8..
0ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
0bb0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 0a 20 20  EvalCallback(.  
0bc0: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
0bd0: 2c 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 73  ,      /* An ins
0be0: 74 61 6e 63 65 20 6f 66 20 43 61 6c 6c 62 61 63  tance of Callbac
0bf0: 6b 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  kData */.  int n
0c00: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
0c10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
0c20: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
0c30: 73 75 6c 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sult */.  char *
0c40: 2a 20 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  * azCol,        
0c50: 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 65 61 63   /* Data for eac
0c60: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  h column */.  ch
0c70: 61 72 20 2a 2a 20 61 7a 4e 20 20 20 20 20 20 20  ar ** azN       
0c80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 66 6f 72       /* Name for
0c90: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   each column */.
0ca0: 29 7b 0a 20 20 43 61 6c 6c 62 61 63 6b 44 61 74  ){.  CallbackDat
0cb0: 61 20 2a 63 62 44 61 74 61 20 3d 20 28 43 61 6c  a *cbData = (Cal
0cc0: 6c 62 61 63 6b 44 61 74 61 2a 29 63 6c 69 65 6e  lbackData*)clien
0cd0: 74 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 2c 20  tData;.  int i, 
0ce0: 72 63 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  rc;.  Tcl_DStrin
0cf0: 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53  g dCol;.  Tcl_DS
0d00: 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29  tringInit(&dCol)
0d10: 3b 0a 20 20 69 66 28 20 63 62 44 61 74 61 2d 3e  ;.  if( cbData->
0d20: 61 7a 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a  azColName==0 ){.
0d30: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 44 61      assert( cbDa
0d40: 74 61 2d 3e 6f 6e 63 65 20 29 3b 0a 20 20 20 20  ta->once );.    
0d50: 63 62 44 61 74 61 2d 3e 6f 6e 63 65 20 3d 20 30  cbData->once = 0
0d60: 3b 0a 20 20 20 20 69 66 28 20 63 62 44 61 74 61  ;.    if( cbData
0d70: 2d 3e 7a 41 72 72 61 79 5b 30 5d 20 29 7b 0a 20  ->zArray[0] ){. 
0d80: 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 32       Tcl_SetVar2
0d90: 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c  (cbData->interp,
0da0: 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79 2c   cbData->zArray,
0db0: 20 22 2a 22 2c 20 22 22 2c 20 30 29 3b 0a 20 20   "*", "", 0);.  
0dc0: 20 20 7d 0a 20 20 20 20 63 62 44 61 74 61 2d 3e    }.    cbData->
0dd0: 61 7a 43 6f 6c 4e 61 6d 65 20 3d 20 6d 61 6c 6c  azColName = mall
0de0: 6f 63 28 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  oc( nCol*sizeof(
0df0: 63 68 61 72 2a 29 20 29 3b 0a 20 20 20 20 69 66  char*) );.    if
0e00: 28 20 63 62 44 61 74 61 2d 3e 61 7a 43 6f 6c 4e  ( cbData->azColN
0e10: 61 6d 65 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e  ame==0 ){ return
0e20: 20 31 3b 20 7d 0a 20 20 20 20 63 62 44 61 74 61   1; }.    cbData
0e30: 2d 3e 6e 43 6f 6c 4e 61 6d 65 20 3d 20 6e 43 6f  ->nColName = nCo
0e40: 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  l;.    for(i=0; 
0e50: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
0e60: 20 20 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c      Tcl_External
0e70: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c  ToUtfDString(NUL
0e80: 4c 2c 20 61 7a 4e 5b 69 5d 2c 20 2d 31 2c 20 26  L, azN[i], -1, &
0e90: 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63 62 44  dCol);.      cbD
0ea0: 61 74 61 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69  ata->azColName[i
0eb0: 5d 20 3d 20 6d 61 6c 6c 6f 63 28 20 54 63 6c 5f  ] = malloc( Tcl_
0ec0: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64  DStringLength(&d
0ed0: 43 6f 6c 29 20 2b 20 31 20 29 3b 0a 20 20 20 20  Col) + 1 );.    
0ee0: 20 20 69 66 28 20 63 62 44 61 74 61 2d 3e 61 7a    if( cbData->az
0ef0: 43 6f 6c 4e 61 6d 65 5b 69 5d 20 29 7b 0a 20 20  ColName[i] ){.  
0f00: 20 20 20 20 20 20 73 74 72 63 70 79 28 63 62 44        strcpy(cbD
0f10: 61 74 61 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69  ata->azColName[i
0f20: 5d 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ], Tcl_DStringVa
0f30: 6c 75 65 28 26 64 43 6f 6c 29 29 3b 0a 20 20 20  lue(&dCol));.   
0f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0f50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0f60: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 62    }.      if( cb
0f70: 44 61 74 61 2d 3e 7a 41 72 72 61 79 5b 30 5d 20  Data->zArray[0] 
0f80: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  ){.        Tcl_S
0f90: 65 74 56 61 72 32 28 63 62 44 61 74 61 2d 3e 69  etVar2(cbData->i
0fa0: 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e 7a  nterp, cbData->z
0fb0: 41 72 72 61 79 2c 20 22 2a 22 2c 0a 20 20 20 20  Array, "*",.    
0fc0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74           Tcl_DSt
0fd0: 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29  ringValue(&dCol)
0fe0: 2c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  , TCL_LIST_ELEME
0ff0: 4e 54 7c 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41  NT|TCL_APPEND_VA
1000: 4c 55 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LUE);.        if
1010: 28 20 61 7a 4e 5b 6e 43 6f 6c 5d 21 3d 30 20 29  ( azN[nCol]!=0 )
1020: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
1030: 44 53 74 72 69 6e 67 20 64 54 79 70 65 3b 0a 20  DString dType;. 
1040: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74           Tcl_DSt
1050: 72 69 6e 67 49 6e 69 74 28 26 64 54 79 70 65 29  ringInit(&dType)
1060: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
1070: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64  DStringAppend(&d
1080: 54 79 70 65 2c 20 22 74 79 70 65 6f 66 3a 22 2c  Type, "typeof:",
1090: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -1);.          
10a0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
10b0: 64 28 26 64 54 79 70 65 2c 20 54 63 6c 5f 44 53  d(&dType, Tcl_DS
10c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c  tringValue(&dCol
10d0: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
10e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
10f0: 65 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e(&dCol);.      
1100: 20 20 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c      Tcl_External
1110: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c  ToUtfDString(NUL
1120: 4c 2c 20 61 7a 4e 5b 69 2b 6e 43 6f 6c 5d 2c 20  L, azN[i+nCol], 
1130: 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 20 20  -1, &dCol);.    
1140: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
1150: 32 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70  2(cbData->interp
1160: 2c 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79  , cbData->zArray
1170: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1180: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c    Tcl_DStringVal
1190: 75 65 28 26 64 54 79 70 65 29 2c 20 54 63 6c 5f  ue(&dType), Tcl_
11a0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43  DStringValue(&dC
11b0: 6f 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ol),.           
11c0: 20 20 20 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45      TCL_LIST_ELE
11d0: 4d 45 4e 54 7c 54 43 4c 5f 41 50 50 45 4e 44 5f  MENT|TCL_APPEND_
11e0: 56 41 4c 55 45 29 3b 0a 20 20 20 20 20 20 20 20  VALUE);.        
11f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
1200: 65 28 26 64 54 79 70 65 29 3b 0a 20 20 20 20 20  e(&dType);.     
1210: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1220: 20 20 20 0a 20 20 20 20 20 20 54 63 6c 5f 44 53     .      Tcl_DS
1230: 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29  tringFree(&dCol)
1240: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1250: 28 20 61 7a 43 6f 6c 21 3d 30 20 29 7b 0a 20 20  ( azCol!=0 ){.  
1260: 20 20 69 66 28 20 63 62 44 61 74 61 2d 3e 7a 41    if( cbData->zA
1270: 72 72 61 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20  rray[0] ){.     
1280: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
1290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12a0: 63 68 61 72 20 2a 7a 20 3d 20 61 7a 43 6f 6c 5b  char *z = azCol[
12b0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
12c0: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
12d0: 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69         Tcl_DStri
12e0: 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20  ngInit(&dCol);. 
12f0: 20 20 20 20 20 20 20 54 63 6c 5f 45 78 74 65 72         Tcl_Exter
1300: 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28  nalToUtfDString(
1310: 4e 55 4c 4c 2c 20 7a 2c 20 2d 31 2c 20 26 64 43  NULL, z, -1, &dC
1320: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  ol);.        Tcl
1330: 5f 53 65 74 56 61 72 32 28 63 62 44 61 74 61 2d  _SetVar2(cbData-
1340: 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d  >interp, cbData-
1350: 3e 7a 41 72 72 61 79 2c 20 63 62 44 61 74 61 2d  >zArray, cbData-
1360: 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 0a  >azColName[i], .
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
1380: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
1390: 64 43 6f 6c 29 2c 20 30 29 3b 0a 20 20 20 20 20  dCol), 0);.     
13a0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
13b0: 65 65 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20  ee(&dCol);.     
13c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
13e0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
13f0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 43     char *z = azC
1400: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  ol[i];.        i
1410: 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22  f( z==0 ) z = ""
1420: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53  ;.        Tcl_DS
1430: 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29  tringInit(&dCol)
1440: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 45 78  ;.        Tcl_Ex
1450: 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69  ternalToUtfDStri
1460: 6e 67 28 4e 55 4c 4c 2c 20 7a 2c 20 2d 31 2c 20  ng(NULL, z, -1, 
1470: 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  &dCol);.        
1480: 54 63 6c 5f 53 65 74 56 61 72 28 63 62 44 61 74  Tcl_SetVar(cbDat
1490: 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74  a->interp, cbDat
14a0: 61 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  a->azColName[i],
14b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14c0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 56      Tcl_DStringV
14d0: 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 30 29 3b  alue(&dCol), 0);
14e0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74  .        Tcl_DSt
14f0: 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29 3b  ringFree(&dCol);
1500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1510: 20 7d 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76   }.  rc = Tcl_Ev
1520: 61 6c 4f 62 6a 28 63 62 44 61 74 61 2d 3e 69 6e  alObj(cbData->in
1530: 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e 70 43  terp, cbData->pC
1540: 6f 64 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ode);.  if( rc==
1550: 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 20 72  TCL_CONTINUE ) r
1560: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 63 62  c = TCL_OK;.  cb
1570: 44 61 74 61 2d 3e 74 63 6c 5f 72 63 20 3d 20 72  Data->tcl_rc = r
1580: 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 21 3d  c;.  return rc!=
1590: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
15a0: 20 2f 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54   /* UTF_TRANSLAT
15b0: 49 4f 4e 5f 4e 45 45 44 45 44 20 2a 2f 0a 0a 23  ION_NEEDED */..#
15c0: 69 66 6e 64 65 66 20 55 54 46 5f 54 52 41 4e 53  ifndef UTF_TRANS
15d0: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 2f 2a  LATION_NEEDED./*
15e0: 0a 2a 2a 20 43 61 6c 6c 65 64 20 66 6f 72 20 65  .** Called for e
15f0: 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
1600: 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  esult..**.** Thi
1610: 73 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65  s version is use
1620: 64 20 77 68 65 6e 20 65 69 74 68 65 72 20 6f 66  d when either of
1630: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1640: 73 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  s true:.**.**   
1650: 20 28 31 29 20 54 68 69 73 20 76 65 72 73 69 6f   (1) This versio
1660: 6e 20 6f 66 20 54 43 4c 20 75 73 65 73 20 55 54  n of TCL uses UT
1670: 46 2d 38 20 61 6e 64 20 74 68 65 20 64 61 74 61  F-8 and the data
1680: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
1690: 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73    SQLite databas
16a0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
16b0: 74 68 65 20 55 54 46 2d 38 20 66 6f 72 6d 61 74  the UTF-8 format
16c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 54  ..**.**    (2) T
16d0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 54  his version of T
16e0: 43 4c 20 75 73 65 73 20 49 53 4f 38 38 35 39 20  CL uses ISO8859 
16f0: 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 6e 20  and the data in 
1700: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 53 51  the.**        SQ
1710: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 69 73  Lite database is
1720: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1730: 49 53 4f 38 38 35 39 20 66 6f 72 6d 61 74 2e 0a  ISO8859 format..
1740: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
1750: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 0a 20 20  EvalCallback(.  
1760: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
1770: 2c 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 73  ,      /* An ins
1780: 74 61 6e 63 65 20 6f 66 20 43 61 6c 6c 62 61 63  tance of Callbac
1790: 6b 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  kData */.  int n
17a0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
17b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
17c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
17d0: 73 75 6c 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sult */.  char *
17e0: 2a 20 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  * azCol,        
17f0: 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 65 61 63   /* Data for eac
1800: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  h column */.  ch
1810: 61 72 20 2a 2a 20 61 7a 4e 20 20 20 20 20 20 20  ar ** azN       
1820: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 66 6f 72       /* Name for
1830: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   each column */.
1840: 29 7b 0a 20 20 43 61 6c 6c 62 61 63 6b 44 61 74  ){.  CallbackDat
1850: 61 20 2a 63 62 44 61 74 61 20 3d 20 28 43 61 6c  a *cbData = (Cal
1860: 6c 62 61 63 6b 44 61 74 61 2a 29 63 6c 69 65 6e  lbackData*)clien
1870: 74 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 2c 20  tData;.  int i, 
1880: 72 63 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d  rc;.  if( azCol=
1890: 3d 30 20 7c 7c 20 28 63 62 44 61 74 61 2d 3e 6f  =0 || (cbData->o
18a0: 6e 63 65 20 26 26 20 63 62 44 61 74 61 2d 3e 7a  nce && cbData->z
18b0: 41 72 72 61 79 5b 30 5d 29 20 29 7b 0a 20 20 20  Array[0]) ){.   
18c0: 20 54 63 6c 5f 53 65 74 56 61 72 32 28 63 62 44   Tcl_SetVar2(cbD
18d0: 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44  ata->interp, cbD
18e0: 61 74 61 2d 3e 7a 41 72 72 61 79 2c 20 22 2a 22  ata->zArray, "*"
18f0: 2c 20 22 22 2c 20 30 29 3b 0a 20 20 20 20 66 6f  , "", 0);.    fo
1900: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
1910: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ++){.      Tcl_S
1920: 65 74 56 61 72 32 28 63 62 44 61 74 61 2d 3e 69  etVar2(cbData->i
1930: 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e 7a  nterp, cbData->z
1940: 41 72 72 61 79 2c 20 22 2a 22 2c 20 61 7a 4e 5b  Array, "*", azN[
1950: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 54 43 4c  i],.         TCL
1960: 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 7c 54 43  _LIST_ELEMENT|TC
1970: 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b  L_APPEND_VALUE);
1980: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 4e 5b 6e  .      if( azN[n
1990: 43 6f 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  Col] ){.        
19a0: 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
19b0: 33 5f 6d 70 72 69 6e 74 66 28 22 74 79 70 65 6f  3_mprintf("typeo
19c0: 66 3a 25 73 22 2c 20 61 7a 4e 5b 69 5d 29 3b 0a  f:%s", azN[i]);.
19d0: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56          Tcl_SetV
19e0: 61 72 32 28 63 62 44 61 74 61 2d 3e 69 6e 74 65  ar2(cbData->inte
19f0: 72 70 2c 20 63 62 44 61 74 61 2d 3e 7a 41 72 72  rp, cbData->zArr
1a00: 61 79 2c 20 7a 2c 20 61 7a 4e 5b 69 2b 6e 43 6f  ay, z, azN[i+nCo
1a10: 6c 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54  l],.           T
1a20: 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 7c  CL_LIST_ELEMENT|
1a30: 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45  TCL_APPEND_VALUE
1a40: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a50: 65 33 5f 66 72 65 65 6d 65 6d 28 7a 29 3b 0a 20  e3_freemem(z);. 
1a60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a70: 20 63 62 44 61 74 61 2d 3e 6f 6e 63 65 20 3d 20   cbData->once = 
1a80: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 7a 43  0;.  }.  if( azC
1a90: 6f 6c 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ol!=0 ){.    if(
1aa0: 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79 5b   cbData->zArray[
1ab0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  0] ){.      for(
1ac0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
1ad0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1ae0: 2a 7a 20 3d 20 61 7a 43 6f 6c 5b 69 5d 3b 0a 20  *z = azCol[i];. 
1af0: 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20         if( z==0 
1b00: 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  ) z = "";.      
1b10: 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 63 62    Tcl_SetVar2(cb
1b20: 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62  Data->interp, cb
1b30: 44 61 74 61 2d 3e 7a 41 72 72 61 79 2c 20 61 7a  Data->zArray, az
1b40: 4e 5b 69 5d 2c 20 7a 2c 20 30 29 3b 0a 20 20 20  N[i], z, 0);.   
1b50: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1b60: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1b70: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
1b80: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61       char *z = a
1b90: 7a 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zCol[i];.       
1ba0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
1bb0: 22 22 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "";.        Tcl_
1bc0: 53 65 74 56 61 72 28 63 62 44 61 74 61 2d 3e 69  SetVar(cbData->i
1bd0: 6e 74 65 72 70 2c 20 61 7a 4e 5b 69 5d 2c 20 7a  nterp, azN[i], z
1be0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1bf0: 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 54    }.  }.  rc = T
1c00: 63 6c 5f 45 76 61 6c 4f 62 6a 28 63 62 44 61 74  cl_EvalObj(cbDat
1c10: 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74  a->interp, cbDat
1c20: 61 2d 3e 70 43 6f 64 65 29 3b 0a 20 20 69 66 28  a->pCode);.  if(
1c30: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
1c40: 45 20 29 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b  E ) rc = TCL_OK;
1c50: 0a 20 20 63 62 44 61 74 61 2d 3e 74 63 6c 5f 72  .  cbData->tcl_r
1c60: 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  c = rc;.  return
1c70: 20 72 63 21 3d 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23   rc!=TCL_OK;.}.#
1c80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1c90: 73 20 69 73 20 61 6e 20 61 6c 74 65 72 6e 61 74  s is an alternat
1ca0: 69 76 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ive callback for
1cb0: 20 64 61 74 61 62 61 73 65 20 71 75 65 72 69 65   database querie
1cc0: 73 2e 20 20 49 6e 73 74 65 61 64 0a 2a 2a 20 6f  s.  Instead.** o
1cd0: 66 20 69 6e 76 6f 6b 69 6e 67 20 61 20 54 43 4c  f invoking a TCL
1ce0: 20 73 63 72 69 70 74 20 74 6f 20 68 61 6e 64 6c   script to handl
1cf0: 65 20 74 68 65 20 72 65 73 75 6c 74 2c 20 74 68  e the result, th
1d00: 69 73 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74  is callback just
1d10: 0a 2a 2a 20 61 70 70 65 6e 64 73 20 65 61 63 68  .** appends each
1d20: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
1d30: 65 73 75 6c 74 20 74 6f 20 61 20 6c 69 73 74 2e  esult to a list.
1d40: 20 20 41 66 74 65 72 20 74 68 65 20 71 75 65 72    After the quer
1d50: 79 0a 2a 2a 20 69 73 20 63 6f 6d 70 6c 65 74 65  y.** is complete
1d60: 2c 20 74 68 65 20 6c 69 73 74 20 69 73 20 72 65  , the list is re
1d70: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1d80: 63 20 69 6e 74 20 44 62 45 76 61 6c 43 61 6c 6c  c int DbEvalCall
1d90: 62 61 63 6b 32 28 0a 20 20 76 6f 69 64 20 2a 63  back2(.  void *c
1da0: 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20  lientData,      
1db0: 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
1dc0: 66 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 2a  f CallbackData *
1dd0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20  /.  int nCol,   
1de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1df0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1e00: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
1e10: 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a 43 6f 6c  .  char ** azCol
1e20: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ,         /* Dat
1e30: 61 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  a for each colum
1e40: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61  n */.  char ** a
1e50: 7a 4e 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  zN            /*
1e60: 20 4e 61 6d 65 20 66 6f 72 20 65 61 63 68 20 63   Name for each c
1e70: 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 54 63  olumn */.){.  Tc
1e80: 6c 5f 4f 62 6a 20 2a 70 4c 69 73 74 20 3d 20 28  l_Obj *pList = (
1e90: 54 63 6c 5f 4f 62 6a 2a 29 63 6c 69 65 6e 74 44  Tcl_Obj*)clientD
1ea0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ata;.  int i;.  
1eb0: 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 72  if( azCol==0 ) r
1ec0: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
1ed0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
1ee0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
1ef0: 45 6c 65 6d 3b 0a 20 20 20 20 69 66 28 20 61 7a  Elem;.    if( az
1f00: 43 6f 6c 5b 69 5d 20 26 26 20 2a 61 7a 43 6f 6c  Col[i] && *azCol
1f10: 5b 69 5d 20 29 7b 0a 23 69 66 64 65 66 20 55 54  [i] ){.#ifdef UT
1f20: 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45  F_TRANSLATION_NE
1f30: 45 44 45 44 0a 20 20 20 20 20 20 54 63 6c 5f 44  EDED.      Tcl_D
1f40: 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 20  String dCol;.   
1f50: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
1f60: 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20  it(&dCol);.     
1f70: 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55   Tcl_ExternalToU
1f80: 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20  tfDString(NULL, 
1f90: 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 26 64  azCol[i], -1, &d
1fa0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 45 6c 65  Col);.      pEle
1fb0: 6d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  m = Tcl_NewStrin
1fc0: 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67  gObj(Tcl_DString
1fd0: 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31  Value(&dCol), -1
1fe0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  );.      Tcl_DSt
1ff0: 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29 3b  ringFree(&dCol);
2000: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 45 6c  .#else.      pEl
2010: 65 6d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  em = Tcl_NewStri
2020: 6e 67 4f 62 6a 28 61 7a 43 6f 6c 5b 69 5d 2c 20  ngObj(azCol[i], 
2030: 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  -1);.#endif.    
2040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 6c  }else{.      pEl
2050: 65 6d 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  em = Tcl_NewObj(
2060: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
2070: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2080: 65 6d 65 6e 74 28 30 2c 20 70 4c 69 73 74 2c 20  ement(0, pList, 
2090: 70 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65  pElem);.  }.  re
20a0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
20b0: 20 54 68 69 73 20 69 73 20 61 20 73 65 63 6f 6e   This is a secon
20c0: 64 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 61  d alternative ca
20d0: 6c 6c 62 61 63 6b 20 66 6f 72 20 64 61 74 61 62  llback for datab
20e0: 61 73 65 20 71 75 65 72 69 65 73 2e 20 20 41 20  ase queries.  A 
20f0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
2100: 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  umn of the first
2110: 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
2120: 6c 74 20 69 73 20 6d 61 64 65 20 74 68 65 20 54  lt is made the T
2130: 43 4c 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  CL result..*/.st
2140: 61 74 69 63 20 69 6e 74 20 44 62 45 76 61 6c 43  atic int DbEvalC
2150: 61 6c 6c 62 61 63 6b 33 28 0a 20 20 76 6f 69 64  allback3(.  void
2160: 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20   *clientData,   
2170: 20 20 20 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63     /* An instanc
2180: 65 20 6f 66 20 43 61 6c 6c 62 61 63 6b 44 61 74  e of CallbackDat
2190: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c  a */.  int nCol,
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
21c0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
21d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a   */.  char ** az
21e0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Col,         /* 
21f0: 44 61 74 61 20 66 6f 72 20 65 61 63 68 20 63 6f  Data for each co
2200: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
2210: 2a 20 61 7a 4e 20 20 20 20 20 20 20 20 20 20 20  * azN           
2220: 20 2f 2a 20 4e 61 6d 65 20 66 6f 72 20 65 61 63   /* Name for eac
2230: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  h column */.){. 
2240: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2250: 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
2260: 70 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  p*)clientData;. 
2270: 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 6c 65 6d 3b   Tcl_Obj *pElem;
2280: 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20  .  if( azCol==0 
2290: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
22a0: 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ( nCol==0 ) retu
22b0: 72 6e 20 31 3b 0a 23 69 66 64 65 66 20 55 54 46  rn 1;.#ifdef UTF
22c0: 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45  _TRANSLATION_NEE
22d0: 44 45 44 0a 20 20 7b 0a 20 20 20 20 54 63 6c 5f  DED.  {.    Tcl_
22e0: 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20  DString dCol;.  
22f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
2300: 74 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 54 63  t(&dCol);.    Tc
2310: 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44  l_ExternalToUtfD
2320: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 61 7a 43  String(NULL, azC
2330: 6f 6c 5b 30 5d 2c 20 2d 31 2c 20 26 64 43 6f 6c  ol[0], -1, &dCol
2340: 29 3b 0a 20 20 20 20 70 45 6c 65 6d 20 3d 20 54  );.    pElem = T
2350: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2360: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
2370: 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20  (&dCol), -1);.  
2380: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
2390: 65 28 26 64 43 6f 6c 29 3b 0a 20 20 7d 0a 23 65  e(&dCol);.  }.#e
23a0: 6c 73 65 0a 20 20 70 45 6c 65 6d 20 3d 20 54 63  lse.  pElem = Tc
23b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 61  l_NewStringObj(a
23c0: 7a 43 6f 6c 5b 30 5d 2c 20 2d 31 29 3b 0a 23 65  zCol[0], -1);.#e
23d0: 6e 64 69 66 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ndif.  Tcl_SetOb
23e0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
23f0: 70 45 6c 65 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pElem);.  return
2400: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c   1;.}../*.** Cal
2410: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6d  led when the com
2420: 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e  mand is deleted.
2430: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2440: 44 62 44 65 6c 65 74 65 43 6d 64 28 76 6f 69 64  DbDeleteCmd(void
2450: 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74 65 44   *db){.  SqliteD
2460: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
2470: 44 62 2a 29 64 62 3b 0a 20 20 73 71 6c 69 74 65  Db*)db;.  sqlite
2480: 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29  3_close(pDb->db)
2490: 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e  ;.  while( pDb->
24a0: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c  pFunc ){.    Sql
24b0: 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44  Func *pFunc = pD
24c0: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44  b->pFunc;.    pD
24d0: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  b->pFunc = pFunc
24e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
24f0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75  _Free((char*)pFu
2500: 6e 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  nc);.  }.  if( p
2510: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
2520: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
2530: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
2540: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
2550: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
2560: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
2570: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
2580: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
2590: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d  pDb->zAuth);.  }
25a0: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
25b0: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
25c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25d0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
25e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
25f0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
2600: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
2610: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
2620: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
2630: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
2640: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
2650: 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20  , int nTries){. 
2660: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
2670: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
2680: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2690: 20 7a 56 61 6c 5b 33 30 5d 3b 0a 20 20 63 68 61   zVal[30];.  cha
26a0: 72 20 2a 7a 43 6d 64 3b 0a 20 20 54 63 6c 5f 44  r *zCmd;.  Tcl_D
26b0: 53 74 72 69 6e 67 20 63 6d 64 3b 0a 0a 20 20 54  String cmd;..  T
26c0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
26d0: 63 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  cmd);.  Tcl_DStr
26e0: 69 6e 67 41 70 70 65 6e 64 28 26 63 6d 64 2c 20  ingAppend(&cmd, 
26f0: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 2d 31 29 3b  pDb->zBusy, -1);
2700: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
2710: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64  pendElement(&cmd
2720: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 73 70 72  , zTable);.  spr
2730: 69 6e 74 66 28 7a 56 61 6c 2c 20 22 20 25 64 22  intf(zVal, " %d"
2740: 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 54 63 6c  , nTries);.  Tcl
2750: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
2760: 63 6d 64 2c 20 7a 56 61 6c 2c 20 2d 31 29 3b 0a  cmd, zVal, -1);.
2770: 20 20 7a 43 6d 64 20 3d 20 54 63 6c 5f 44 53 74    zCmd = Tcl_DSt
2780: 72 69 6e 67 56 61 6c 75 65 28 26 63 6d 64 29 3b  ringValue(&cmd);
2790: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  .  rc = Tcl_Eval
27a0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 7a 43  (pDb->interp, zC
27b0: 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  md);.  Tcl_DStri
27c0: 6e 67 46 72 65 65 28 26 63 6d 64 29 3b 0a 20 20  ngFree(&cmd);.  
27d0: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c  if( rc!=TCL_OK |
27e0: 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74  | atoi(Tcl_GetSt
27f0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
2800: 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20  interp)) ){.    
2810: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2820: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
2830: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2840: 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68  is invoked as th
2850: 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  e 'progress call
2860: 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61  back' for the da
2870: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
2880: 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73  c int DbProgress
2890: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
28a0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
28b0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
28c0: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
28d0: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50   assert( pDb->zP
28e0: 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20  rogress );.  rc 
28f0: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
2900: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
2910: 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72  ogress);.  if( r
2920: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
2930: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
2940: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
2950: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
2960: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2970: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2980: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2990: 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69  lled by the SQLi
29a0: 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72  te trace handler
29b0: 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a   whenever a new.
29c0: 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20  ** block of SQL 
29d0: 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68  is executed.  Th
29e0: 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20  e TCL script in 
29f0: 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65  pDb->zTrace is e
2a00: 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  xecuted..*/.stat
2a10: 69 63 20 76 6f 69 64 20 44 62 54 72 61 63 65 48  ic void DbTraceH
2a20: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c  andler(void *cd,
2a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2a40: 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  l){.  SqliteDb *
2a50: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
2a60: 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  )cd;.  Tcl_DStri
2a70: 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44  ng str;..  Tcl_D
2a80: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
2a90: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
2aa0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
2ab0: 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20  >zTrace, -1);.  
2ac0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
2ad0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
2ae0: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  Sql);.  Tcl_Eval
2af0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63  (pDb->interp, Tc
2b00: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
2b10: 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74  str));.  Tcl_DSt
2b20: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
2b30: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2b40: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
2b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2b60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2b70: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
2b80: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
2b90: 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72    The.** TCL scr
2ba0: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d  ipt in pDb->zCom
2bb0: 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  mit is executed.
2bc0: 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20    If it returns 
2bd0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69  non-zero or.** i
2be0: 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65  f it throws an e
2bf0: 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72  xception, the tr
2c00: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
2c10: 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64  led back instead
2c20: 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d  .** of being com
2c30: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mitted..*/.stati
2c40: 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61  c int DbCommitHa
2c50: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
2c60: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
2c70: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
2c80: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
2c90: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
2ca0: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
2cb0: 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
2cc0: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
2cd0: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
2ce0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
2cf0: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
2d00: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2d10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2d20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2d30: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
2d40: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
2d50: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
2d60: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
2d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d80: 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69   tclSqlFunc(sqli
2d90: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
2da0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
2db0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2dc0: 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63  argv){.  SqlFunc
2dd0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   *p = sqlite3_us
2de0: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
2df0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2e00: 63 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  cmd;.  int i;.  
2e10: 69 6e 74 20 72 63 3b 0a 0a 20 20 54 63 6c 5f 44  int rc;..  Tcl_D
2e20: 53 74 72 69 6e 67 49 6e 69 74 28 26 63 6d 64 29  StringInit(&cmd)
2e30: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
2e40: 70 70 65 6e 64 28 26 63 6d 64 2c 20 70 2d 3e 7a  ppend(&cmd, p->z
2e50: 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 66  Script, -1);.  f
2e60: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
2e70: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51  i++){.    if( SQ
2e80: 4c 49 54 45 33 5f 4e 55 4c 4c 3d 3d 73 71 6c 69  LITE3_NULL==sqli
2e90: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
2ea0: 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  rgv[i]) ){.     
2eb0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2ec0: 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64 2c 20  ndElement(&cmd, 
2ed0: 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  "");.    }else{.
2ee0: 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e        Tcl_DStrin
2ef0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
2f00: 63 6d 64 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  cmd, sqlite3_val
2f10: 75 65 5f 64 61 74 61 28 61 72 67 76 5b 69 5d 29  ue_data(argv[i])
2f20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2f30: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 2d 3e  c = Tcl_Eval(p->
2f40: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
2f50: 69 6e 67 56 61 6c 75 65 28 26 63 6d 64 29 29 3b  ingValue(&cmd));
2f60: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2f70: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f80: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
2f90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
2fa0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
2fb0: 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1); .  }else{.  
2fc0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2fd0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 54  _text(context, T
2fe0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
2ff0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
3000: 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 69 66  1, 1);.  }.}.#if
3010: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3020: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
3030: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
3040: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
3050: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70  function.  It ap
3060: 70 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e  pends the authen
3070: 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65  tication.** type
3080: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77   code and the tw
3090: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a  o arguments to z
30a0: 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b  Cmd[] then invok
30b0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
30c0: 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   on the interpre
30d0: 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20  ter.  The reply 
30e0: 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64  is examined to d
30f0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a  etermine if the.
3100: 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ** authenticatio
3110: 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65  n fails or succe
3120: 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eds..*/.static i
3130: 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  nt auth_callback
3140: 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  (.  void *pArg,.
3150: 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f    int code,.  co
3160: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c  nst char *zArg1,
3170: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3180: 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg2,.  const ch
3190: 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e  ar *zArg3,.  con
31a0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29  st char *zArg4.)
31b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
31c0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
31d0: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
31e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70  const char *zRep
31f0: 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  ly;.  SqliteDb *
3200: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3210: 29 70 41 72 67 3b 0a 0a 20 20 73 77 69 74 63 68  )pArg;..  switch
3220: 28 20 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  ( code ){.    ca
3230: 73 65 20 53 51 4c 49 54 45 5f 43 4f 50 59 20 20  se SQLITE_COPY  
3240: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
3250: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59  ode="SQLITE_COPY
3260: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
3270: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
3280: 5f 49 4e 44 45 58 20 20 20 20 20 20 3a 20 7a 43  _INDEX      : zC
3290: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
32a0: 54 45 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  TE_INDEX"; break
32b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
32c0: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 20 20  E_CREATE_TABLE  
32d0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
32e0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
32f0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
3300: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
3310: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43  _TEMP_INDEX : zC
3320: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
3330: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20  TE_TEMP_INDEX"; 
3340: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3350: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
3360: 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65  MP_TABLE : zCode
3370: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
3380: 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  TEMP_TABLE"; bre
3390: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
33a0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
33b0: 54 52 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22  TRIGGER: zCode="
33c0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
33d0: 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  MP_TRIGGER"; bre
33e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
33f0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
3400: 56 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53  VIEW  : zCode="S
3410: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
3420: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
3430: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3440: 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 20 20  CREATE_TRIGGER  
3450: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
3460: 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52  E_CREATE_TRIGGER
3470: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
3480: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
3490: 5f 56 49 45 57 20 20 20 20 20 20 20 3a 20 7a 43  _VIEW       : zC
34a0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
34b0: 54 45 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  TE_VIEW"; break;
34c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
34d0: 5f 44 45 4c 45 54 45 20 20 20 20 20 20 20 20 20  _DELETE         
34e0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
34f0: 54 45 5f 44 45 4c 45 54 45 22 3b 20 62 72 65 61  TE_DELETE"; brea
3500: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
3510: 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20 20  TE_DROP_INDEX   
3520: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
3530: 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22  LITE_DROP_INDEX"
3540: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3550: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  e SQLITE_DROP_TA
3560: 42 4c 45 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  BLE        : zCo
3570: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
3580: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
3590: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
35a0: 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20  ROP_TEMP_INDEX  
35b0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
35c0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
35d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
35e0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
35f0: 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43  EMP_TABLE   : zC
3600: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
3610: 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72  _TEMP_TABLE"; br
3620: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
3630: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
3640: 52 49 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22  RIGGER : zCode="
3650: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
3660: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
3670: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
3680: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
3690: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
36a0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
36b0: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
36c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
36d0: 5f 54 52 49 47 47 45 52 20 20 20 20 20 20 3a 20  _TRIGGER      : 
36e0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
36f0: 4f 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  OP_TRIGGER"; bre
3700: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
3710: 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 20 20 20  ITE_DROP_VIEW   
3720: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
3730: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 22  QLITE_DROP_VIEW"
3740: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3750: 65 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  e SQLITE_INSERT 
3760: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
3770: 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45 52  de="SQLITE_INSER
3780: 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
3790: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d  ase SQLITE_PRAGM
37a0: 41 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  A            : z
37b0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50 52 41  Code="SQLITE_PRA
37c0: 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GMA"; break;.   
37d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
37e0: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a  D              :
37f0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52   zCode="SQLITE_R
3800: 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  EAD"; break;.   
3810: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c   case SQLITE_SEL
3820: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 3a  ECT            :
3830: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53   zCode="SQLITE_S
3840: 45 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20  ELECT"; break;. 
3850: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
3860: 52 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20  RANSACTION      
3870: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3880: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62  _TRANSACTION"; b
3890: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
38a0: 51 4c 49 54 45 5f 55 50 44 41 54 45 20 20 20 20  QLITE_UPDATE    
38b0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
38c0: 22 53 51 4c 49 54 45 5f 55 50 44 41 54 45 22 3b  "SQLITE_UPDATE";
38d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
38e0: 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20 20   SQLITE_ATTACH  
38f0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
3900: 65 3d 22 53 51 4c 49 54 45 5f 41 54 54 41 43 48  e="SQLITE_ATTACH
3910: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
3920: 73 65 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48  se SQLITE_DETACH
3930: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
3940: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 54 41  ode="SQLITE_DETA
3950: 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CH"; break;.    
3960: 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20  default         
3970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
3980: 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72  zCode="????"; br
3990: 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44  eak;.  }.  Tcl_D
39a0: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
39b0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
39c0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
39d0: 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54  >zAuth, -1);.  T
39e0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
39f0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43  Element(&str, zC
3a00: 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  ode);.  Tcl_DStr
3a10: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
3a20: 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a  (&str, zArg1 ? z
3a30: 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg1 : "");.  Tc
3a40: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
3a50: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
3a60: 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29  g2 ? zArg2 : "")
3a70: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
3a80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
3a90: 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33  r, zArg3 ? zArg3
3aa0: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
3ab0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
3ac0: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f  nt(&str, zArg4 ?
3ad0: 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20   zArg4 : "");.  
3ae0: 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  rc = Tcl_GlobalE
3af0: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
3b00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
3b10: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
3b20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
3b30: 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54 63  );.  zReply = Tc
3b40: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3b50: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
3b60: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65    if( strcmp(zRe
3b70: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29  ply,"SQLITE_OK")
3b80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
3b90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
3ba0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
3bb0: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e  eply,"SQLITE_DEN
3bc0: 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Y")==0 ){.    rc
3bd0: 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a   = SQLITE_DENY;.
3be0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
3bf0: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
3c00: 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b  E_IGNORE")==0 ){
3c10: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
3c20: 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65  _IGNORE;.  }else
3c30: 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a  {.    rc = 999;.
3c40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
3c50: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
3c60: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
3c70: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ZATION */../*.**
3c80: 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
3c90: 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61  mmand below crea
3ca0: 74 65 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f  tes a new Tcl co
3cb0: 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a  mmand for each.*
3cc0: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20  * connection it 
3cd0: 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69  opens to an SQLi
3ce0: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  te database.  Th
3cf0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
3d00: 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65  voked.** wheneve
3d10: 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63  r one of those c
3d20: 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66  onnection-specif
3d30: 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65  ic commands is e
3d40: 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63  xecuted.** in Tc
3d50: 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
3d60: 20 69 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20   if you run Tcl 
3d70: 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a  code like this:.
3d80: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69  **.**       sqli
3d90: 74 65 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61  te db1  "my_data
3da0: 62 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64  base".**       d
3db0: 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54  b1 close.**.** T
3dc0: 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64  he first command
3dd0: 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74   opens a connect
3de0: 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64  ion to the "my_d
3df0: 61 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73  atabase" databas
3e00: 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74  e.** and calls t
3e10: 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22  hat connection "
3e20: 64 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e  db1".  The secon
3e30: 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73  d command causes
3e40: 20 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74   this.** subrout
3e50: 69 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ine to be invoke
3e60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
3e70: 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a   DbObjCmd(void *
3e80: 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  cd, Tcl_Interp *
3e90: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
3ea0: 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a  ,Tcl_Obj *const*
3eb0: 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44  objv){.  SqliteD
3ec0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
3ed0: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68  Db*)cd;.  int ch
3ee0: 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  oice;.  int rc =
3ef0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69   TCL_OK;.  stati
3f00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42  c const char *DB
3f10: 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  _strs[] = {.    
3f20: 22 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20  "authorizer",   
3f30: 20 20 20 20 20 20 22 62 75 73 79 22 2c 20 20 20        "busy",   
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f50: 22 63 68 61 6e 67 65 73 22 2c 0a 20 20 20 20 22  "changes",.    "
3f60: 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20  close",         
3f70: 20 20 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f       "commit_hoo
3f80: 6b 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  k",            "
3f90: 63 6f 6d 70 6c 65 74 65 22 2c 0a 20 20 20 20 22  complete",.    "
3fa0: 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20  errorcode",     
3fb0: 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20       "eval",    
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
3fd0: 66 75 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22  function",.    "
3fe0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
3ff0: 64 22 2c 20 20 22 6c 61 73 74 5f 73 74 61 74 65  d",  "last_state
4000: 6d 65 6e 74 5f 63 68 61 6e 67 65 73 22 2c 20 22  ment_changes", "
4010: 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20  onecolumn",.    
4020: 22 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20 20  "progress",     
4030: 20 20 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20        "rekey",  
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 22 74 69 6d 65 6f 75 74 22 2c 0a 20 20 20 20 22  "timeout",.    "
4060: 74 72 61 63 65 22 2c 0a 20 20 20 20 30 20 20 20  trace",.    0   
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4080: 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42   .  };.  enum DB
4090: 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41  _enum {.    DB_A
40a0: 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20  UTHORIZER,      
40b0: 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20    DB_BUSY,      
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
40d0: 43 48 41 4e 47 45 53 2c 0a 20 20 20 20 44 42 5f  CHANGES,.    DB_
40e0: 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
40f0: 20 20 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f     DB_COMMIT_HOO
4100: 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42  K,            DB
4110: 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44  _COMPLETE,.    D
4120: 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20 20 20 20  B_ERRORCODE,    
4130: 20 20 20 20 20 44 42 5f 45 56 41 4c 2c 20 20 20       DB_EVAL,   
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 0a 20 20 20  DB_FUNCTION,.   
4160: 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f   DB_LAST_INSERT_
4170: 52 4f 57 49 44 2c 20 44 42 5f 4c 41 53 54 5f 53  ROWID, DB_LAST_S
4180: 54 41 54 45 4d 45 4e 54 5f 43 48 41 4e 47 45 53  TATEMENT_CHANGES
4190: 2c 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20  , DB_ONECOLUMN, 
41a0: 20 20 20 20 20 20 20 0a 20 20 20 20 44 42 5f 50         .    DB_P
41b0: 52 4f 47 52 45 53 53 2c 20 20 20 20 20 20 20 20  ROGRESS,        
41c0: 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20    DB_REKEY,     
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
41e0: 54 49 4d 45 4f 55 54 2c 0a 20 20 20 20 44 42 5f  TIMEOUT,.    DB_
41f0: 54 52 41 43 45 0a 20 20 7d 3b 0a 0a 20 20 69 66  TRACE.  };..  if
4200: 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20  ( objc<2 ){.    
4210: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
4220: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
4230: 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e  , "SUBCOMMAND ..
4240: 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
4250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4260: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65   if( Tcl_GetInde
4270: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
4280: 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72   objv[1], DB_str
4290: 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20  s, "option", 0, 
42a0: 26 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20  &choice) ){.    
42b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
42c0: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
42d0: 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63   (enum DB_enum)c
42e0: 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20  hoice ){..  /*  
42f0: 20 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72    $db authorizer
4300: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
4310: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
4320: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
4330: 74 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63  to authorize eac
4340: 68 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20  h SQL operation 
4350: 61 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f  as it is.  ** co
4360: 6d 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d  mpiled.  5 argum
4370: 65 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64 65  ents are appende
4380: 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  d to the callbac
4390: 6b 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20  k before it is. 
43a0: 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a   ** invoked:.  *
43b0: 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65  *.  **   (1) The
43c0: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
43d0: 79 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f  ype (ex: SQLITE_
43e0: 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51  CREATE_TABLE, SQ
43f0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e  LITE_INSERT, ...
4400: 29 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72  ).  **   (2) Fir
4410: 73 74 20 64 65 73 63 72 69 70 74 69 76 65 20 6e  st descriptive n
4420: 61 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20  ame (depends on 
4430: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79  authorization ty
4440: 70 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53  pe).  **   (3) S
4450: 65 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76  econd descriptiv
4460: 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34  e name.  **   (4
4470: 29 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  ) Name of the da
4480: 74 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69  tabase (ex: "mai
4490: 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a  n", "temp").  **
44a0: 20 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74     (5) Name of t
44b0: 72 69 67 67 65 72 20 74 68 61 74 20 69 73 20 64  rigger that is d
44c0: 6f 69 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a  oing the access.
44d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61    **.  ** The ca
44e0: 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65  llback should re
44f0: 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66  turn on of the f
4500: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73  ollowing strings
4510: 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a  : SQLITE_OK,.  *
4520: 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c  * SQLITE_IGNORE,
4530: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e   or SQLITE_DENY.
4540: 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
4550: 72 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65  rn value is an e
4560: 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rror..  **.  ** 
4570: 49 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69  If this method i
4580: 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e  s invoked with n
4590: 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65  o arguments, the
45a0: 20 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69   current authori
45b0: 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c  zation.  ** call
45c0: 62 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72  back string is r
45d0: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  eturned..  */.  
45e0: 63 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a  case DB_AUTHORIZ
45f0: 45 52 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  ER: {.    if( ob
4600: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
4610: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
4620: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
4630: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
4640: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
4650: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
4660: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
4670: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
4680: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4690: 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b   pDb->zAuth, 0);
46a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
46b0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
46c0: 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74  zAuth;.      int
46d0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
46e0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
46f0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
4700: 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20  Db->zAuth);.    
4710: 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20    }.      zAuth 
4720: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
4730: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
4740: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
4750: 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20   zAuth && len>0 
4760: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
4770: 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zAuth = Tcl_Allo
4780: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
4790: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
47a0: 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 29 3b  ->zAuth, zAuth);
47b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
47c0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
47d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
47e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
47f0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
4800: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
4810: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
4820: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
4830: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
4840: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
4850: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75  izer(pDb->db, au
4860: 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62  th_callback, pDb
4870: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4890: 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
48a0: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
48b0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
48c0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
48d0: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
48e0: 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  busy ?CALLBACK?.
48f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
4900: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
4910: 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74  ack if an SQL st
4920: 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73  atement attempts
4930: 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
4940: 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20  locked database 
4950: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  file..  */.  cas
4960: 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20  e DB_BUSY: {.   
4970: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
4980: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
4990: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
49a0: 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b   objv, "CALLBACK
49b0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
49c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
49d0: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
49e0: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
49f0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
4a00: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
4a10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
4a20: 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20  b->zBusy, 0);.  
4a30: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4a40: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75  .      char *zBu
4a50: 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  sy;.      int le
4a60: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
4a70: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20  ->zBusy ){.     
4a80: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
4a90: 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d  >zBusy);.      }
4aa0: 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54  .      zBusy = T
4ab0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
4ac0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
4ad0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42  n);.      if( zB
4ae0: 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  usy && len>0 ){.
4af0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
4b00: 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  sy = Tcl_Alloc( 
4b10: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
4b20: 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a     strcpy(pDb->z
4b30: 42 75 73 79 2c 20 7a 42 75 73 79 29 3b 0a 20 20  Busy, zBusy);.  
4b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b50: 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20     pDb->zBusy = 
4b60: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
4b70: 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
4b80: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
4b90: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
4ba0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4bb0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44  _busy_handler(pD
4bc0: 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e  b->db, DbBusyHan
4bd0: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
4be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4bf0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
4c00: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30  ndler(pDb->db, 0
4c10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
4c20: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
4c30: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
4c40: 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c  progress ?N CALL
4c50: 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a  BACK?.  ** .  **
4c60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
4c70: 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79  n callback every
4c80: 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   N virtual machi
4c90: 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65  ne opcodes while
4ca0: 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20   executing.  ** 
4cb0: 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
4cc0: 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53  case DB_PROGRESS
4cd0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
4ce0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
4cf0: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
4d00: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
4d10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4d20: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
4d30: 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ss, 0);.      }.
4d40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
4d50: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
4d60: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
4d70: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
4d80: 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
4d90: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
4da0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
4db0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
4dc0: 20 26 4e 29 20 29 7b 0a 09 72 65 74 75 72 6e 20   &N) ){..return 
4dd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
4de0: 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   };.      if( pD
4df0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
4e00: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
4e10: 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29  (pDb->zProgress)
4e20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4e30: 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
4e40: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
4e50: 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b  (objv[3], &len);
4e60: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67  .      if( zProg
4e70: 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b  ress && len>0 ){
4e80: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
4e90: 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c  rogress = Tcl_Al
4ea0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
4eb0: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
4ec0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a  Db->zProgress, z
4ed0: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
4ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4ef0: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
4f00: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
4f10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4f20: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
4f30: 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  K.      if( pDb-
4f40: 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
4f50: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
4f60: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
4f70: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
4f80: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
4f90: 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72  ->db, N, DbProgr
4fa0: 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  essHandler, pDb)
4fb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4fc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
4fd0: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
4fe0: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30  pDb->db, 0, 0, 0
4ff0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
5000: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
5010: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
5020: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
5030: 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b  bjv, "N CALLBACK
5040: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
5050: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5060: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
5070: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
5080: 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  $db changes.  **
5090: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
50a0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
50b0: 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
50c0: 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
50d0: 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a   deleted by.  **
50e0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
50f0: 20 22 65 76 61 6c 22 2e 0a 20 20 2a 2f 0a 20 20   "eval"..  */.  
5100: 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a  case DB_CHANGES:
5110: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
5120: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
5130: 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 69 66   nChange;.    if
5140: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
5150: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
5160: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
5170: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
5180: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61  ;.    }.    nCha
51a0: 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 68  nge = sqlite3_ch
51b0: 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 3b 0a  anges(pDb->db);.
51c0: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
51d0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
51e0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
51f0: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
5200: 74 2c 20 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  t, nChange);.   
5210: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
5220: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c  *.  **     $db l
5230: 61 73 74 5f 73 74 61 74 65 6d 65 6e 74 5f 63 68  ast_statement_ch
5240: 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
5250: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5260: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
5270: 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
5280: 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
5290: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6c  ed by.  ** the l
52a0: 61 73 74 20 73 74 61 74 6d 65 6e 74 20 74 6f 20  ast statment to 
52b0: 63 6f 6d 70 6c 65 74 65 20 65 78 65 63 75 74 69  complete executi
52c0: 6f 6e 20 28 65 78 63 6c 75 64 69 6e 67 20 63 68  on (excluding ch
52d0: 61 6e 67 65 73 20 64 75 65 20 74 6f 0a 20 20 2a  anges due to.  *
52e0: 2a 20 74 72 69 67 67 65 72 73 29 0a 20 20 2a 2f  * triggers).  */
52f0: 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f  .  case DB_LAST_
5300: 53 54 41 54 45 4d 45 4e 54 5f 43 48 41 4e 47 45  STATEMENT_CHANGE
5310: 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
5320: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
5330: 6e 74 20 6c 73 43 68 61 6e 67 65 3b 0a 20 20 20  nt lsChange;.   
5340: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
5350: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
5360: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
5370: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
5380: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5390: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  ROR;.    }.    l
53a0: 73 43 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65  sChange = sqlite
53b0: 33 5f 6c 61 73 74 5f 73 74 61 74 65 6d 65 6e 74  3_last_statement
53c0: 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
53d0: 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
53e0: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
53f0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
5400: 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
5410: 73 75 6c 74 2c 20 6c 73 43 68 61 6e 67 65 29 3b  sult, lsChange);
5420: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
5430: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f  .  /*    $db clo
5440: 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75  se.  **.  ** Shu
5450: 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61  tdown the databa
5460: 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  se.  */.  case D
5470: 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54  B_CLOSE: {.    T
5480: 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
5490: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
54a0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
54b0: 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20  jv[0], 0));.    
54c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
54d0: 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68      $db commit_h
54e0: 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ook ?CALLBACK?. 
54f0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
5500: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
5510: 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ck just before c
5520: 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20  ommitting every 
5530: 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  SQL transaction.
5540: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  .  ** If the cal
5550: 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20  lback throws an 
5560: 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74  exception or ret
5570: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
5580: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  hen the.  ** tra
5590: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72  nsaction is abor
55a0: 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43  ted.  If CALLBAC
55b0: 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  K is an empty st
55c0: 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61  ring, the callba
55d0: 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  ck.  ** is disab
55e0: 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  led..  */.  case
55f0: 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a   DB_COMMIT_HOOK:
5600: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
5610: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
5620: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
5630: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
5640: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
5650: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
5660: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
5670: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
5680: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
5690: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
56a0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29  pDb->zCommit, 0)
56b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
56c0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
56d0: 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20  *zCommit;.      
56e0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
56f0: 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
5700: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
5710: 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  ree(pDb->zCommit
5720: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5730: 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47   zCommit = Tcl_G
5740: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5750: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
5760: 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69        if( zCommi
5770: 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  t && len>0 ){.  
5780: 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d        pDb->zComm
5790: 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  it = Tcl_Alloc( 
57a0: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
57b0: 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a     strcpy(pDb->z
57c0: 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 29  Commit, zCommit)
57d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
57e0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
57f0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  mit = 0;.      }
5800: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
5810: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
5820: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
5830: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
5840: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
5850: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62  hook(pDb->db, Db
5860: 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70  CommitHandler, p
5870: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
5880: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5890: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
58a0: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
58b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
58c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
58d0: 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
58e0: 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
58f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
5900: 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
5910: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
5920: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
5930: 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
5940: 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
5950: 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
5960: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
5970: 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
5980: 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
5990: 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
59a0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
59b0: 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 20 20 20 20  COMPLETE: {.    
59c0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
59d0: 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70  ;.    int isComp
59e0: 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62  lete;.    if( ob
59f0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
5a00: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
5a10: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
5a20: 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72   "SQL");.      r
5a30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5a40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d  .    }.    isCom
5a50: 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  plete = sqlite3_
5a60: 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65  complete( Tcl_Ge
5a70: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
5a80: 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20  bjv[2], 0) );.  
5a90: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
5aa0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
5ab0: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
5ac0: 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73  tBooleanObj(pRes
5ad0: 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29  ult, isComplete)
5ae0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
5af0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
5b00: 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a  db errorcode.  *
5b10: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
5b20: 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20  e numeric error 
5b30: 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65  code that was re
5b40: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f  turned by the mo
5b50: 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63  st recent.  ** c
5b60: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
5b70: 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  xec()..  */.  ca
5b80: 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a  se DB_ERRORCODE:
5b90: 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   {.    Tcl_SetOb
5ba0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
5bb0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 44  Tcl_NewIntObj(pD
5bc0: 62 2d 3e 72 63 29 29 3b 0a 20 20 20 20 62 72 65  b->rc));.    bre
5bd0: 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a  ak;.  }.   .  /*
5be0: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61  .  **    $db eva
5bf0: 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 20 7b 20  l $sql ?array { 
5c00: 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20   ...code... }?. 
5c10: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
5c20: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73   statement in $s
5c30: 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  ql is evaluated.
5c40: 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20    For each row, 
5c50: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20  the values are. 
5c60: 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c   ** placed in el
5c70: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72  ements of the ar
5c80: 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79  ray named "array
5c90: 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e  " and ...code...
5ca0: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
5cb0: 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61 6e  ** If "array" an
5cc0: 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69  d "code" are omi
5cd0: 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61  tted, then no ca
5ce0: 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79 20  llback is every 
5cf0: 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66  invoked..  ** If
5d00: 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20 65   "array" is an e
5d10: 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65  mpty string, the
5d20: 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  n the values are
5d30: 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61   placed in varia
5d40: 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68  bles.  ** that h
5d50: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ave the same nam
5d60: 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73 20  e as the fields 
5d70: 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65  extracted by the
5d80: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63   query..  */.  c
5d90: 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20  ase DB_EVAL: {. 
5da0: 20 20 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20     CallbackData 
5db0: 63 62 44 61 74 61 3b 0a 20 20 20 20 63 68 61 72  cbData;.    char
5dc0: 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 63   *zErrMsg;.    c
5dd0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 23 69 66 64 65  har *zSql;.#ifde
5de0: 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f  f UTF_TRANSLATIO
5df0: 4e 5f 4e 45 45 44 45 44 0a 20 20 20 20 54 63 6c  N_NEEDED.    Tcl
5e00: 5f 44 53 74 72 69 6e 67 20 64 53 71 6c 3b 0a 20  _DString dSql;. 
5e10: 20 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66     int i;.#endif
5e20: 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ..    if( objc!=
5e30: 35 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  5 && objc!=3 ){.
5e40: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
5e50: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
5e60: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52  , objv, "SQL ?AR
5e70: 52 41 59 2d 4e 41 4d 45 20 43 4f 44 45 3f 22 29  RAY-NAME CODE?")
5e80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
5e90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5ea0: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
5eb0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 7a 53  = interp;.    zS
5ec0: 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
5ed0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
5ee0: 5d 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 55 54  ], 0);.#ifdef UT
5ef0: 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45  F_TRANSLATION_NE
5f00: 45 44 45 44 0a 20 20 20 20 54 63 6c 5f 44 53 74  EDED.    Tcl_DSt
5f10: 72 69 6e 67 49 6e 69 74 28 26 64 53 71 6c 29 3b  ringInit(&dSql);
5f20: 0a 20 20 20 20 54 63 6c 5f 55 74 66 54 6f 45 78  .    Tcl_UtfToEx
5f30: 74 65 72 6e 61 6c 44 53 74 72 69 6e 67 28 4e 55  ternalDString(NU
5f40: 4c 4c 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 64  LL, zSql, -1, &d
5f50: 53 71 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  Sql);.    zSql =
5f60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
5f70: 65 28 26 64 53 71 6c 29 3b 0a 23 65 6e 64 69 66  e(&dSql);.#endif
5f80: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5f90: 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a  Count(objv[2]);.
5fa0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20      if( objc==5 
5fb0: 29 7b 0a 20 20 20 20 20 20 63 62 44 61 74 61 2e  ){.      cbData.
5fc0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
5fd0: 0a 20 20 20 20 20 20 63 62 44 61 74 61 2e 6f 6e  .      cbData.on
5fe0: 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 62  ce = 1;.      cb
5ff0: 44 61 74 61 2e 7a 41 72 72 61 79 20 3d 20 54 63  Data.zArray = Tc
6000: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
6010: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a  bj(objv[3], 0);.
6020: 20 20 20 20 20 20 63 62 44 61 74 61 2e 70 43 6f        cbData.pCo
6030: 64 65 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20  de = objv[4];.  
6040: 20 20 20 20 63 62 44 61 74 61 2e 74 63 6c 5f 72      cbData.tcl_r
6050: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
6060: 20 20 63 62 44 61 74 61 2e 6e 43 6f 6c 4e 61 6d    cbData.nColNam
6070: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 62 44  e = 0;.      cbD
6080: 61 74 61 2e 61 7a 43 6f 6c 4e 61 6d 65 20 3d 20  ata.azColName = 
6090: 30 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67  0;.      zErrMsg
60a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f   = 0;.      Tcl_
60b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a  IncrRefCount(obj
60c0: 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 54 63 6c  v[3]);.      Tcl
60d0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62  _IncrRefCount(ob
60e0: 6a 76 5b 34 5d 29 3b 0a 20 20 20 20 20 20 72 63  jv[4]);.      rc
60f0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
6100: 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 44  pDb->db, zSql, D
6110: 62 45 76 61 6c 43 61 6c 6c 62 61 63 6b 2c 20 26  bEvalCallback, &
6120: 63 62 44 61 74 61 2c 20 26 7a 45 72 72 4d 73 67  cbData, &zErrMsg
6130: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  );.      Tcl_Dec
6140: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 34  rRefCount(objv[4
6150: 5d 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65  ]);.      Tcl_De
6160: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b  crRefCount(objv[
6170: 33 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  3]);.      if( c
6180: 62 44 61 74 61 2e 74 63 6c 5f 72 63 3d 3d 54 43  bData.tcl_rc==TC
6190: 4c 5f 42 52 45 41 4b 20 29 7b 20 63 62 44 61 74  L_BREAK ){ cbDat
61a0: 61 2e 74 63 6c 5f 72 63 20 3d 20 54 43 4c 5f 4f  a.tcl_rc = TCL_O
61b0: 4b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  K; }.    }else{.
61c0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
61d0: 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  List = Tcl_NewOb
61e0: 6a 28 29 3b 0a 20 20 20 20 20 20 63 62 44 61 74  j();.      cbDat
61f0: 61 2e 74 63 6c 5f 72 63 20 3d 20 54 43 4c 5f 4f  a.tcl_rc = TCL_O
6200: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  K;.      rc = sq
6210: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
6220: 64 62 2c 20 7a 53 71 6c 2c 20 44 62 45 76 61 6c  db, zSql, DbEval
6230: 43 61 6c 6c 62 61 63 6b 32 2c 20 70 4c 69 73 74  Callback2, pList
6240: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
6250: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
6260: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 4c 69 73  ult(interp, pLis
6270: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  t);.    }.    pD
6280: 62 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  b->rc = rc;.    
6290: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41  if( rc==SQLITE_A
62a0: 42 4f 52 54 20 29 7b 0a 20 20 20 20 20 20 69 66  BORT ){.      if
62b0: 28 20 7a 45 72 72 4d 73 67 20 29 20 66 72 65 65  ( zErrMsg ) free
62c0: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
62d0: 20 72 63 20 3d 20 63 62 44 61 74 61 2e 74 63 6c   rc = cbData.tcl
62e0: 5f 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _rc;.    }else i
62f0: 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
6300: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
6310: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73  t(interp, zErrMs
6320: 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  g, TCL_VOLATILE)
6330: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 45 72  ;.      free(zEr
6340: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20  rMsg);.      rc 
6350: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
6360: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
6370: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6380: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6390: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
63a0: 65 33 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  e3_error_string(
63b0: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  rc), 0);.      r
63c0: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
63d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7d 0a     }else{.    }.
63e0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
63f0: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 23  ount(objv[2]);.#
6400: 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c  ifdef UTF_TRANSL
6410: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 20  ATION_NEEDED.   
6420: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
6430: 28 26 64 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  (&dSql);.    if(
6440: 20 6f 62 6a 63 3d 3d 35 20 26 26 20 63 62 44 61   objc==5 && cbDa
6450: 74 61 2e 61 7a 43 6f 6c 4e 61 6d 65 20 29 7b 0a  ta.azColName ){.
6460: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6470: 3c 63 62 44 61 74 61 2e 6e 43 6f 6c 4e 61 6d 65  <cbData.nColName
6480: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6490: 69 66 28 20 63 62 44 61 74 61 2e 61 7a 43 6f 6c  if( cbData.azCol
64a0: 4e 61 6d 65 5b 69 5d 20 29 20 66 72 65 65 28 63  Name[i] ) free(c
64b0: 62 44 61 74 61 2e 61 7a 43 6f 6c 4e 61 6d 65 5b  bData.azColName[
64c0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
64d0: 20 20 20 66 72 65 65 28 63 62 44 61 74 61 2e 61     free(cbData.a
64e0: 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zColName);.     
64f0: 20 63 62 44 61 74 61 2e 61 7a 43 6f 6c 4e 61 6d   cbData.azColNam
6500: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 0;.    }.#en
6510: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72  dif.    return r
6520: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  c;.  }..  /*.  *
6530: 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63 74 69  *     $db functi
6540: 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20  on NAME SCRIPT. 
6550: 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
6560: 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69  a new SQL functi
6570: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
6580: 20 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66   Whenever that f
6590: 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  unction is.  ** 
65a0: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
65b0: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
65c0: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
65d0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46    */.  case DB_F
65e0: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53  UNCTION: {.    S
65f0: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  qlFunc *pFunc;. 
6600: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
6610: 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70      char *zScrip
6620: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69  t;.    int nScri
6630: 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  pt;.    if( objc
6640: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
6650: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6660: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
6670: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
6680: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6690: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
66a0: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
66b0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
66c0: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
66d0: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74  Script = Tcl_Get
66e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
66f0: 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29  jv[3], &nScript)
6700: 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 28 53  ;.    pFunc = (S
6710: 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f  qlFunc*)Tcl_Allo
6720: 63 28 20 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  c( sizeof(*pFunc
6730: 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20  ) + nScript + 1 
6740: 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
6750: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
6760: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 46 75 6e  _ERROR;.    pFun
6770: 63 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  c->interp = inte
6780: 72 70 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70  rp;.    pFunc->p
6790: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Next = pDb->pFun
67a0: 63 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 7a 53  c;.    pFunc->zS
67b0: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
67c0: 70 46 75 6e 63 5b 31 5d 3b 0a 20 20 20 20 73 74  pFunc[1];.    st
67d0: 72 63 70 79 28 70 46 75 6e 63 2d 3e 7a 53 63 72  rcpy(pFunc->zScr
67e0: 69 70 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20  ipt, zScript);. 
67f0: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
6800: 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e  e_function(pDb->
6810: 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 74  db, zName, -1, t
6820: 63 6c 53 71 6c 46 75 6e 63 2c 20 70 46 75 6e 63  clSqlFunc, pFunc
6830: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
6840: 75 6e 63 74 69 6f 6e 5f 74 79 70 65 28 70 44 62  unction_type(pDb
6850: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  ->db, zName, SQL
6860: 49 54 45 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  ITE_NUMERIC);.  
6870: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6880: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
6890: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
68a0: 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  d .  **.  ** Ret
68b0: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
68c0: 68 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49  hich is the ROWI
68d0: 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  D for the most r
68e0: 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20  ecent insert..  
68f0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53  */.  case DB_LAS
6900: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20  T_INSERT_ROWID: 
6910: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
6920: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
6930: 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f  rowid;.    if( o
6940: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc!=2 ){.      
6950: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6960: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
6970: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
6980: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6990: 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d     }.    rowid =
69a0: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
69b0: 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e  sert_rowid(pDb->
69c0: 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  db);.    pResult
69d0: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
69e0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
69f0: 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70   Tcl_SetIntObj(p
6a00: 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a  Result, rowid);.
6a10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6a20: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
6a30: 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 53 51 4c 0a  b onecolumn SQL.
6a40: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
6a50: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
6a60: 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 72   from a single r
6a70: 6f 77 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ow of the given 
6a80: 53 51 4c 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  SQL query..  */.
6a90: 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c    case DB_ONECOL
6aa0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  UMN: {.    char 
6ab0: 2a 7a 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20  *zSql;.    char 
6ac0: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
6ad0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
6ae0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
6af0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
6b00: 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b  2, objv, "SQL");
6b10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
6b20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6b30: 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65     zSql = Tcl_Ge
6b40: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
6b50: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
6b60: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
6b70: 63 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  c(pDb->db, zSql,
6b80: 20 44 62 45 76 61 6c 43 61 6c 6c 62 61 63 6b 33   DbEvalCallback3
6b90: 2c 20 69 6e 74 65 72 70 2c 20 26 7a 45 72 72 4d  , interp, &zErrM
6ba0: 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  sg);.    if( rc=
6bb0: 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 29 7b  =SQLITE_ABORT ){
6bc0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6bd0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
6be0: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
6bf0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
6c00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
6c10: 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  Msg, TCL_VOLATIL
6c20: 45 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  E);.      free(z
6c30: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
6c40: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
6c50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
6c60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6c70: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
6c80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
6c90: 69 74 65 33 5f 65 72 72 6f 72 5f 73 74 72 69 6e  ite3_error_strin
6ca0: 67 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20  g(rc), 0);.     
6cb0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
6cc0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6cd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6ce0: 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b       $db rekey K
6cf0: 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  EY.  **.  ** Cha
6d00: 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74 69  nge the encrypti
6d10: 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75  on key on the cu
6d20: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74  rrently open dat
6d30: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
6d40: 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20  se DB_REKEY: {. 
6d50: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
6d60: 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20   void *pKey;.   
6d70: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
6d80: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6d90: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6da0: 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a  , objv, "KEY");.
6db0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6dc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6dd0: 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
6de0: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
6df0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29  (objv[2], &nKey)
6e00: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6e10: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72 63  HAS_CODEC.    rc
6e20: 20 3d 20 73 71 6c 69 74 65 5f 72 65 6b 65 79 28   = sqlite_rekey(
6e30: 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e  pDb->db, pKey, n
6e40: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Key);.    if( rc
6e50: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
6e60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6e70: 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6f 72  p, sqlite3_error
6e80: 5f 73 74 72 69 6e 67 28 72 63 29 2c 20 30 29 3b  _string(rc), 0);
6e90: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
6ea0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERROR;.    }.#en
6eb0: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
6ec0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
6ed0: 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49    $db timeout MI
6ee0: 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a  LLESECONDS.  **.
6ef0: 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74    ** Delay for t
6f00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
6f10: 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66  liseconds specif
6f20: 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  ied when a file 
6f30: 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  is locked..  */.
6f40: 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55    case DB_TIMEOU
6f50: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b  T: {.    int ms;
6f60: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
6f70: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
6f80: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
6f90: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 2, objv, "MIL
6fa0: 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
6fb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6fc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
6fd0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
6fe0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
6ff0: 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
7000: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7010: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
7020: 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c  timeout(pDb->db,
7030: 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   ms);.    break;
7040: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
7050: 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43  b trace ?CALLBAC
7060: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
7070: 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
7080: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
7090: 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f  LBACK routine fo
70a0: 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
70b0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69  ment.  ** that i
70c0: 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
70d0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
70e0: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
70f0: 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a  CALLBACK before.
7100: 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75    ** it is execu
7110: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
7120: 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20   DB_TRACE: {.   
7130: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
7140: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
7150: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
7160: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
7170: 4b 3f 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  K?");.    }else 
7180: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
7190: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
71a0: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
71b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
71c0: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54  (interp, pDb->zT
71d0: 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  race, 0);.      
71e0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
71f0: 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b     char *zTrace;
7200: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
7210: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
7220: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
7230: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
7240: 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Trace);.      }.
7250: 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54        zTrace = T
7260: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7270: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
7280: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54  n);.      if( zT
7290: 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b  race && len>0 ){
72a0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
72b0: 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  race = Tcl_Alloc
72c0: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
72d0: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
72e0: 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65 29  >zTrace, zTrace)
72f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7300: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
7310: 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ce = 0;.      }.
7320: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
7330: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
7340: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
7350: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
7360: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62  qlite3_trace(pDb
7370: 2d 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e  ->db, DbTraceHan
7380: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
7390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
73a0: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70   sqlite3_trace(p
73b0: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
73c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
73d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 7d   break;.  }..  }
73e0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53   /* End of the S
73f0: 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20  WITCH statement 
7400: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
7410: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  }../*.**   sqlit
7420: 65 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d  e DBNAME FILENAM
7430: 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b  E ?MODE? ?-key K
7440: 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  EY?.**.** This i
7450: 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63  s the main Tcl c
7460: 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68  ommand.  When th
7470: 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63  e "sqlite" Tcl c
7480: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76  ommand is.** inv
7490: 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  oked, this routi
74a0: 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65  ne runs to proce
74b0: 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e  ss that command.
74c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
74d0: 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d   argument, DBNAM
74e0: 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61  E, is an arbitra
74f0: 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ry name for a ne
7500: 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  w.** database co
7510: 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  nnection.  This 
7520: 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20  command creates 
7530: 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61  a new command na
7540: 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68  med.** DBNAME th
7550: 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
7560: 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65  ntrol that conne
7570: 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61  ction.  The data
7580: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
7590: 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68  on is deleted wh
75a0: 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f  en the DBNAME co
75b0: 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64  mmand is deleted
75c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
75d0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
75e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
75f0: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
7600: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 73 71  ntains.** the sq
7610: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 68  lite database th
7620: 61 74 20 69 73 20 74 6f 20 62 65 20 61 63 63 65  at is to be acce
7630: 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ssed..**.** For 
7640: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
7650: 2c 20 77 65 20 61 6c 73 6f 20 73 75 70 70 6f 72  , we also suppor
7660: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  t the following:
7670: 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 20 2d  .**.**  sqlite -
7680: 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20  encoding.**.**  
7690: 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20       Return the 
76a0: 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
76b0: 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f   LIKE and GLOB o
76c0: 70 65 72 61 74 6f 72 73 2e 20 20 43 68 6f 69 63  perators.  Choic
76d0: 65 73 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20  es.**       are 
76e0: 55 54 46 2d 38 20 61 6e 64 20 69 73 6f 38 38 35  UTF-8 and iso885
76f0: 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  9..**.**  sqlite
7700: 20 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20   -version.**.** 
7710: 20 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65        Return the
7720: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
7730: 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  of the SQLite li
7740: 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71  brary..**.**  sq
7750: 6c 69 74 65 20 2d 74 63 6c 2d 75 73 65 73 2d 75  lite -tcl-uses-u
7760: 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52  tf.**.**       R
7770: 65 74 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d  eturn "1" if com
7780: 70 69 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c  piled with a Tcl
7790: 20 75 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65   uses UTF-8.  Re
77a0: 74 75 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20  turn "0" if.**  
77b0: 20 20 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20       not.  Used 
77c0: 62 79 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65  by tests to make
77d0: 20 73 75 72 65 20 74 68 65 20 6c 69 62 72 61 72   sure the librar
77e0: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a  y was compiled .
77f0: 2a 2a 20 20 20 20 20 20 20 63 6f 72 72 65 63 74  **       correct
7800: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
7810: 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63  t DbMain(void *c
7820: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
7830: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
7840: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
7850: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
7860: 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65   *p;.  void *pKe
7870: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65  y = 0;.  int nKe
7880: 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  y = 0;.  const c
7890: 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61  har *zArg;.  cha
78a0: 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f  r *zErrMsg;.  co
78b0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
78c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
78d0: 4f 70 74 73 5b 32 5d 20 3d 20 7b 30 2c 20 30 7d  Opts[2] = {0, 0}
78e0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 38 30  ;.  char zBuf[80
78f0: 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  ];.  if( objc==2
7900: 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54   ){.    zArg = T
7910: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7920: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
7930: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
7940: 7a 41 72 67 2c 22 2d 65 6e 63 6f 64 69 6e 67 22  zArg,"-encoding"
7950: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
7960: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7970: 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 65 6e  nterp,sqlite3_en
7980: 63 6f 64 69 6e 67 2c 30 29 3b 0a 20 20 20 20 20  coding,0);.     
7990: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
79a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
79b0: 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73  rcmp(zArg,"-vers
79c0: 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
79d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
79e0: 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
79f0: 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20  3_version,0);.  
7a00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
7a10: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
7a20: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68   strcmp(zArg,"-h
7a30: 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b  as-codec")==0 ){
7a40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
7a50: 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54  AS_CODEC.      T
7a60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7a70: 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23  interp,"1",0);.#
7a80: 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41  else.      Tcl_A
7a90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7aa0: 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69  rp,"0",0);.#endi
7ab0: 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  f.      return T
7ac0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
7ad0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
7ae0: 2c 22 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 22  ,"-tcl-uses-utf"
7af0: 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 54  )==0 ){.#ifdef T
7b00: 43 4c 5f 55 54 46 5f 4d 41 58 0a 20 20 20 20 20  CL_UTF_MAX.     
7b10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7b20: 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b  t(interp,"1",0);
7b30: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c  .#else.      Tcl
7b40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7b50: 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e  terp,"0",0);.#en
7b60: 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
7b70: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
7b80: 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35   }.  if( objc==5
7b90: 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20   || objc==6 ){. 
7ba0: 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
7bb0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
7bc0: 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b  bjv[objc-2], 0);
7bd0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
7be0: 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20  zArg,"-key")==0 
7bf0: 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20  ){.      pKey = 
7c00: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
7c10: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a  FromObj(objv[obj
7c20: 63 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20  c-1], &nKey);.  
7c30: 20 20 20 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20      objc -= 2;. 
7c40: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
7c50: 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
7c60: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
7c70: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
7c80: 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 23 69 66 64  , 1, objv, .#ifd
7c90: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
7ca0: 44 45 43 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  DEC.      "HANDL
7cb0: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79  E FILENAME ?-key
7cc0: 20 43 4f 44 45 43 2d 4b 45 59 3f 22 0a 23 65 6c   CODEC-KEY?".#el
7cd0: 73 65 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45  se.      "HANDLE
7ce0: 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f   FILENAME ?MODE?
7cf0: 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a  ".#endif.    );.
7d00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7d10: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  RROR;.  }.  zErr
7d20: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28  Msg = 0;.  p = (
7d30: 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c  SqliteDb*)Tcl_Al
7d40: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
7d50: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
7d60: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
7d70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c  lt(interp, "mall
7d80: 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f  oc failed", TCL_
7d90: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
7da0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7db0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
7dc0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
7dd0: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
7de0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
7df0: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 23 69 66 64 65  jv[2], 0);.#ifde
7e00: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
7e10: 45 43 0a 20 20 70 2d 3e 64 62 20 3d 20 73 71 6c  EC.  p->db = sql
7e20: 69 74 65 33 5f 6f 70 65 6e 5f 65 6e 63 72 79 70  ite3_open_encryp
7e30: 74 65 64 28 7a 46 69 6c 65 2c 20 70 4b 65 79 2c  ted(zFile, pKey,
7e40: 20 6e 4b 65 79 2c 20 30 2c 20 26 7a 45 72 72 4d   nKey, 0, &zErrM
7e50: 73 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  sg);.#else.  if(
7e60: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 7a   objc>3 ){.    z
7e70: 4f 70 74 73 5b 30 5d 20 3d 20 54 63 6c 5f 47 65  Opts[0] = Tcl_Ge
7e80: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
7e90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
7ea0: 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 26 70 2d 3e  open(zFile, &p->
7eb0: 64 62 2c 20 7a 4f 70 74 73 29 3b 0a 20 20 69 66  db, zOpts);.  if
7ec0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
7ed0: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e  ite3_errcode(p->
7ee0: 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d  db) ){.    zErrM
7ef0: 73 67 20 3d 20 73 74 72 64 75 70 28 73 71 6c 69  sg = strdup(sqli
7f00: 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
7f10: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
7f20: 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20  close(p->db);.  
7f30: 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d    p->db = 0;.  }
7f40: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
7f50: 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  >db==0 ){.    Tc
7f60: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
7f70: 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c  rp, zErrMsg, TCL
7f80: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
7f90: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
7fa0: 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 45 72  p);.    free(zEr
7fb0: 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
7fc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
7fd0: 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65  .  zArg = Tcl_Ge
7fe0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
7ff0: 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63  bjv[1], 0);.  Tc
8000: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
8010: 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
8020: 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72   DbObjCmd, (char
8030: 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
8040: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 74  );..  /* The ret
8050: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
8060: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 71   value of the sq
8070: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 20 20  lite* pointer.  
8080: 2a 2f 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  */.  sprintf(zBu
8090: 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62 29 3b  f, "%p", p->db);
80a0: 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  .  if( strncmp(z
80b0: 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b 0a 20  Buf,"0x",2) ){. 
80c0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
80d0: 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62 29 3b   "0x%p", p->db);
80e0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
80f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8100: 7a 42 75 66 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  zBuf, 0);..  /* 
8110: 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  If compiled with
8120: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 74 75 72   SQLITE_TEST tur
8130: 6e 65 64 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67  ned on, then reg
8140: 69 73 74 65 72 20 74 68 65 20 22 6d 64 35 73 75  ister the "md5su
8150: 6d 22 0a 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63  m".  ** SQL func
8160: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  tion..  */.#ifde
8170: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
8180: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
8190: 64 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73  d Md5_Register(s
81a0: 71 6c 69 74 65 2a 29 3b 0a 20 20 20 20 4d 64 35  qlite*);.    Md5
81b0: 5f 52 65 67 69 73 74 65 72 28 70 2d 3e 64 62 29  _Register(p->db)
81c0: 3b 0a 20 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a  ;.   }.#endif  .
81d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
81e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  .}../*.** Provid
81f0: 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e  e a dummy Tcl_In
8200: 69 74 53 74 75 62 73 20 69 66 20 77 65 20 61 72  itStubs if we ar
8210: 65 20 75 73 69 6e 67 20 74 68 69 73 20 61 73 20  e using this as 
8220: 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72  a static.** libr
8230: 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ary..*/.#ifndef 
8240: 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20  USE_TCL_STUBS.# 
8250: 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53  undef  Tcl_InitS
8260: 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63  tubs.# define Tc
8270: 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c  l_InitStubs(a,b,
8280: 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
8290: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
82a0: 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   module..**.** T
82b0: 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63  his Tcl module c
82c0: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73  ontains only a s
82d0: 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f  ingle new Tcl co
82e0: 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c  mmand named "sql
82f0: 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20  ite"..** (Hence 
8300: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65  there is no name
8310: 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73  space.  There is
8320: 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69   no point in usi
8330: 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a  ng a namespace.*
8340: 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69  * if the extensi
8350: 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73  on only supplies
8360: 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20   one new name!) 
8370: 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
8380: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64  mmand is.** used
8390: 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53   to open a new S
83a0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
83b0: 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28   See the DbMain(
83c0: 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a  ) routine above.
83d0: 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
83e0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
83f0: 2f 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69  /.int Sqlite_Ini
8400: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
8410: 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69  terp){.  Tcl_Ini
8420: 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22  tStubs(interp, "
8430: 38 2e 30 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  8.0", 0);.  Tcl_
8440: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
8450: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
8460: 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
8470: 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
8480: 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76  );.  Tcl_PkgProv
8490: 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ide(interp, "sql
84a0: 69 74 65 22 2c 20 22 32 2e 30 22 29 3b 0a 20 20  ite", "2.0");.  
84b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
84c0: 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49  .int Tclsqlite_I
84d0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
84e0: 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49  interp){.  Tcl_I
84f0: 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
8500: 20 22 38 2e 30 22 2c 20 30 29 3b 0a 20 20 54 63   "8.0", 0);.  Tc
8510: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
8520: 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
8530: 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64  te", (Tcl_ObjCmd
8540: 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c  Proc*)DbMain, 0,
8550: 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72   0);.  Tcl_PkgPr
8560: 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73  ovide(interp, "s
8570: 71 6c 69 74 65 22 2c 20 22 32 2e 30 22 29 3b 0a  qlite", "2.0");.
8580: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8590: 0a 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f 53 61  .}.int Sqlite_Sa
85a0: 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
85b0: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72 65  p *interp){.  re
85c0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69  turn TCL_OK;.}.i
85d0: 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66  nt Tclsqlite_Saf
85e0: 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
85f0: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74   *interp){.  ret
8600: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
8610: 69 66 20 30 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f  if 0./*.** If co
8620: 6d 70 69 6c 65 64 20 75 73 69 6e 67 20 6d 6b 74  mpiled using mkt
8630: 63 6c 61 70 70 2c 20 74 68 69 73 20 72 6f 75 74  clapp, this rout
8640: 69 6e 65 20 72 75 6e 73 20 74 6f 20 69 6e 69 74  ine runs to init
8650: 69 61 6c 69 7a 65 0a 2a 2a 20 65 76 65 72 79 74  ialize.** everyt
8660: 68 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 45 74 5f  hing..*/.int Et_
8670: 41 70 70 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  AppInit(Tcl_Inte
8680: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72  rp *interp){.  r
8690: 65 74 75 72 6e 20 53 71 6c 69 74 65 5f 49 6e 69  eturn Sqlite_Ini
86a0: 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  t(interp);.}.#en
86b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
86c0: 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
86d0: 20 64 65 66 69 6e 65 64 20 61 6e 64 20 69 73 20   defined and is 
86e0: 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e  one, then put in
86f0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 0a 2a 2a   code for the.**
8700: 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20   "main" routine 
8710: 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61  that will initia
8720: 6c 69 7a 65 20 54 63 6c 2e 0a 2a 2f 0a 23 69 66  lize Tcl..*/.#if
8730: 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48 29 20   defined(TCLSH) 
8740: 26 26 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74  && TCLSH==1.stat
8750: 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f  ic char zMainloo
8760: 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e  p[] =.  "set lin
8770: 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65  e {}\n".  "while
8780: 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20   {![eof stdin]} 
8790: 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c  {\n".    "if {$l
87a0: 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ine!=\"\"} {\n".
87b0: 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
87c0: 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22  ewline \"> \"\n"
87d0: 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e  .    "} else {\n
87e0: 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
87f0: 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c  onewline \"% \"\
8800: 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20  n".    "}\n".   
8810: 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e   "flush stdout\n
8820: 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69  ".    "append li
8830: 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c  ne [gets stdin]\
8840: 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66  n".    "if {[inf
8850: 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65  o complete $line
8860: 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69  ]} {\n".      "i
8870: 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76  f {[catch {uplev
8880: 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73  el #0 $line} res
8890: 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ult]} {\n".     
88a0: 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20     "puts stderr 
88b0: 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74  \"Error: $result
88c0: 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65  \"\n".      "} e
88d0: 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d  lseif {$result!=
88e0: 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  \"\"} {\n".     
88f0: 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74     "puts $result
8900: 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a  \n".      "}\n".
8910: 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20        "set line 
8920: 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73  {}\n".    "} els
8930: 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70  e {\n".      "ap
8940: 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22  pend line \\n\n"
8950: 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c  .    "}\n".  "}\
8960: 6e 22 0a 3b 0a 0a 23 64 65 66 69 6e 65 20 54 43  n".;..#define TC
8970: 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20  LSH_MAIN main   
8980: 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b  /* Needed to fak
8990: 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a  e out mktclapp *
89a0: 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e  /.int TCLSH_MAIN
89b0: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
89c0: 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49  **argv){.  Tcl_I
89d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
89e0: 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61   Tcl_FindExecuta
89f0: 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
8a00: 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65  interp = Tcl_Cre
8a10: 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 53  ateInterp();.  S
8a20: 71 6c 69 74 65 5f 49 6e 69 74 28 69 6e 74 65 72  qlite_Init(inter
8a30: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
8a40: 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65  E_TEST.  {.    e
8a50: 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
8a60: 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49  test1_Init(Tcl_I
8a70: 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
8a80: 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
8a90: 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st2_Init(Tcl_Int
8aa0: 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
8ab0: 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
8ac0: 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
8ad0: 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
8ae0: 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f  int Sqlitetest4_
8af0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
8b00: 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
8b10: 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e  t Sqlitetest5_In
8b20: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
8b30: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
8b40: 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Md5_Init(Tcl_Int
8b50: 65 72 70 2a 29 3b 0a 20 20 20 20 53 71 6c 69 74  erp*);.    Sqlit
8b60: 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65  etest1_Init(inte
8b70: 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
8b80: 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70  est2_Init(interp
8b90: 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
8ba0: 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t3_Init(interp);
8bb0: 0a 2f 2a 20 20 20 20 53 71 6c 69 74 65 74 65 73  ./*    Sqlitetes
8bc0: 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t4_Init(interp);
8bd0: 20 2a 2f 0a 20 20 20 20 53 71 6c 69 74 65 74 65   */.    Sqlitete
8be0: 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st5_Init(interp)
8bf0: 3b 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74 28 69  ;.    Md5_Init(i
8c00: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  nterp);.  }.#end
8c10: 69 66 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32  if.  if( argc>=2
8c20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
8c30: 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
8c40: 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67  terp,"argv0",arg
8c50: 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f  v[1],TCL_GLOBAL_
8c60: 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
8c70: 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
8c80: 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f  gv", "", TCL_GLO
8c90: 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66  BAL_ONLY);.    f
8ca0: 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20  or(i=2; i<argc; 
8cb0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
8cc0: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
8cd0: 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a  argv", argv[i],.
8ce0: 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c            TCL_GL
8cf0: 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
8d00: 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
8d10: 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
8d20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8d30: 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74  Tcl_EvalFile(int
8d40: 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54  erp, argv[1])!=T
8d50: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63  CL_OK ){.      c
8d60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f  onst char *zInfo
8d70: 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e   = Tcl_GetVar(in
8d80: 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f  terp, "errorInfo
8d90: 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
8da0: 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LY);.      if( z
8db0: 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20  Info==0 ) zInfo 
8dc0: 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74  = interp->result
8dd0: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
8de0: 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e  stderr,"%s: %s\n
8df0: 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29  ", *argv, zInfo)
8e00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
8e10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
8e20: 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  .    Tcl_GlobalE
8e30: 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69  val(interp, zMai
8e40: 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nloop);.  }.  re
8e50: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
8e60: 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23 65   /* TCLSH */..#e
8e70: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
8e80: 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a 0a 0a 0a     (NO_TCL) */....