/ Hex Artifact Content
Login

Artifact 3ce001b3c301876a9c8163472077a4c10e0d49f3:


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 39  clsqlite.c,v 1.9
01b0: 37 20 32 30 30 34 2f 30 37 2f 32 33 20 30 30 3a  7 2004/07/23 00:
01c0: 30 31 3a 33 39 20 64 72 68 20 45 78 70 20 24 0a  01:39 drh Exp $.
01d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54 43  */.#ifndef NO_TC
01e0: 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74 68  L     /* Omit th
01f0: 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69 66  is whole file if
0200: 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c 61   TCL is unavaila
0210: 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  ble */..#include
0220: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0230: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
0240: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
0250: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0260: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0270: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a   <assert.h>../*.
0280: 2a 2a 20 49 66 20 54 43 4c 20 75 73 65 73 20 55  ** If TCL uses U
0290: 54 46 2d 38 20 61 6e 64 20 53 51 4c 69 74 65 20  TF-8 and SQLite 
02a0: 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
02b0: 20 75 73 65 20 69 73 6f 38 38 35 39 2c 20 74 68   use iso8859, th
02c0: 65 6e 20 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f  en we.** have to
02d0: 20 64 6f 20 61 20 74 72 61 6e 73 6c 61 74 69 6f   do a translatio
02e0: 6e 20 77 68 65 6e 20 67 6f 69 6e 67 20 62 65 74  n when going bet
02f0: 77 65 65 6e 20 74 68 65 20 74 77 6f 2e 20 20 53  ween the two.  S
0300: 65 74 20 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54  et the .** UTF_T
0310: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
0320: 44 20 6d 61 63 72 6f 20 74 6f 20 69 6e 64 69 63  D macro to indic
0330: 61 74 65 20 74 68 61 74 20 77 65 20 6e 65 65 64  ate that we need
0340: 20 74 6f 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74   to do.** this t
0350: 72 61 6e 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f  ranslation.  .*/
0360: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c  .#if defined(TCL
0370: 5f 55 54 46 5f 4d 41 58 29 20 26 26 20 21 64 65  _UTF_MAX) && !de
0380: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46  fined(SQLITE_UTF
0390: 38 29 0a 23 20 64 65 66 69 6e 65 20 55 54 46 5f  8).# define UTF_
03a0: 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44  TRANSLATION_NEED
03b0: 45 44 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ED 1.#endif../*.
03c0: 2a 2a 20 4e 65 77 20 53 51 4c 20 66 75 6e 63 74  ** New SQL funct
03d0: 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 72 65 61  ions can be crea
03e0: 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70  ted as TCL scrip
03f0: 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 66  ts.  Each such f
0400: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65  unction.** is de
0410: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0420: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0430: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0440: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0450: 72 75 63 74 20 53 71 6c 46 75 6e 63 20 53 71 6c  ruct SqlFunc Sql
0460: 46 75 6e 63 3b 0a 73 74 72 75 63 74 20 53 71 6c  Func;.struct Sql
0470: 46 75 6e 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74  Func {.  Tcl_Int
0480: 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f  erp *interp;   /
0490: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
04a0: 72 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74  ret to execute t
04b0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
04c0: 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20   char *zScript; 
04d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63         /* The sc
04e0: 72 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a  ript to be run *
04f0: 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e 65  /.  SqlFunc *pNe
0500: 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  xt;       /* Nex
0510: 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  t function on th
0520: 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  e list of them a
0530: 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ll */.};../*.** 
0540: 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  New collation se
0550: 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f 6e  quences function
0560: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
0570: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
0580: 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66 75   Each such.** fu
0590: 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72 69  nction is descri
05a0: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
05b0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
05c0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
05d0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
05e0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c 43   SqlCollate SqlC
05f0: 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20 53  ollate;.struct S
0600: 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54 63  qlCollate {.  Tc
0610: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69  ;   /* The TCL i
0630: 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65 63  nterpret to exec
0640: 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ute the function
0650: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63 72   */.  char *zScr
0660: 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ipt;        /* T
0670: 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65 20  he script to be 
0680: 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  run */.  SqlColl
0690: 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ate *pNext;     
06a0: 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69    /* Next functi
06b0: 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  on on the list o
06c0: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b  f them all */.};
06d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ../*.** There is
06e0: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
06f0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0700: 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20  for each SQLite 
0710: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74  database.** that
0720: 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
0730: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54   by the SQLite T
0740: 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  CL interface..*/
0750: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0760: 53 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44  SqliteDb SqliteD
0770: 62 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65  b;.struct Sqlite
0780: 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  Db {.  sqlite *d
0790: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
07a0: 54 68 65 20 22 72 65 61 6c 22 20 64 61 74 61 62  The "real" datab
07b0: 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ase structure */
07c0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
07d0: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
07e0: 69 6e 74 65 72 70 72 65 74 65 72 20 75 73 65 64  interpreter used
07f0: 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
0800: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  se */.  char *zB
0810: 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  usy;          /*
0820: 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   The busy callba
0830: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0840: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
0850: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
0860: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
0870: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0880: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0890: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63       /* The trac
08a0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
08b0: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ne */.  char *zP
08c0: 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 2f 2a  rogress;      /*
08d0: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
08e0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
08f0: 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b  /.  char *zAuth;
0900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0910: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
0920: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0930: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  */.  SqlFunc *pF
0940: 75 6e 63 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  unc;       /* Li
0950: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
0960: 6f 6e 73 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ons */.  SqlColl
0970: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 2f  ate *pCollate; /
0980: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
0990: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
09a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
09c0: 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d  Return code of m
09d0: 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
09e0: 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20 54  e3_exec() */.  T
09f0: 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65  cl_Obj *pCollate
0a00: 4e 65 65 64 65 64 3b 20 20 2f 2a 20 43 6f 6c 6c  Needed;  /* Coll
0a10: 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 73 63 72  ation needed scr
0a20: 69 70 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ipt */.};../*.**
0a30: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
0a40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  this structure p
0a50: 61 73 73 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f  asses informatio
0a60: 6e 20 74 68 72 75 20 74 68 65 20 73 71 6c 69 74  n thru the sqlit
0a70: 65 0a 2a 2a 20 6c 6f 67 69 63 20 66 72 6f 6d 20  e.** logic from 
0a80: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 54 43 4c  the original TCL
0a90: 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 6f 20 74 68   command into th
0aa0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
0ab0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
0ac0: 74 72 75 63 74 20 43 61 6c 6c 62 61 63 6b 44 61  truct CallbackDa
0ad0: 74 61 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 3b  ta CallbackData;
0ae0: 0a 73 74 72 75 63 74 20 43 61 6c 6c 62 61 63 6b  .struct Callback
0af0: 44 61 74 61 20 7b 0a 20 20 54 63 6c 5f 49 6e 74  Data {.  Tcl_Int
0b00: 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20  erp *interp;    
0b10: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
0b20: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 63  terpreter */.  c
0b30: 68 61 72 20 2a 7a 41 72 72 61 79 3b 20 20 20 20  har *zArray;    
0b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0b50: 61 72 72 61 79 20 69 6e 74 6f 20 77 68 69 63 68  array into which
0b60: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
0b70: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
0b80: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
0b90: 2f 2a 20 54 68 65 20 63 6f 64 65 20 74 6f 20 65  /* The code to e
0ba0: 78 65 63 75 74 65 20 66 6f 72 20 65 61 63 68 20  xecute for each 
0bb0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 63  row */.  int onc
0bc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
0bd0: 20 20 20 2f 2a 20 53 65 74 20 66 6f 72 20 66 69     /* Set for fi
0be0: 72 73 74 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 6c  rst callback onl
0bf0: 79 20 2a 2f 0a 20 20 69 6e 74 20 74 63 6c 5f 72  y */.  int tcl_r
0c00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
0c10: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
0c20: 66 72 6f 6d 20 54 43 4c 20 73 63 72 69 70 74 20  from TCL script 
0c30: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 4e 61 6d  */.  int nColNam
0c40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
0c50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
0c60: 69 65 73 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c  ies in the azCol
0c70: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  Name[] array */.
0c80: 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 4e 61    char **azColNa
0c90: 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  me;         /* C
0ca0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 72 61 6e  olumn names tran
0cb0: 73 6c 61 74 65 64 20 74 6f 20 55 54 46 2d 38 20  slated to UTF-8 
0cc0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.};../*.** Thi
0cd0: 73 20 69 73 20 61 20 73 65 63 6f 6e 64 20 61 6c  s is a second al
0ce0: 74 65 72 6e 61 74 69 76 65 20 63 61 6c 6c 62 61  ternative callba
0cf0: 63 6b 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ck for database 
0d00: 71 75 65 72 69 65 73 2e 20 20 41 20 74 68 65 0a  queries.  A the.
0d10: 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
0d20: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0d30: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   of the result i
0d40: 73 20 6d 61 64 65 20 74 68 65 20 54 43 4c 20 72  s made the TCL r
0d50: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
0d60: 20 69 6e 74 20 44 62 45 76 61 6c 43 61 6c 6c 62   int DbEvalCallb
0d70: 61 63 6b 33 28 0a 20 20 76 6f 69 64 20 2a 63 6c  ack3(.  void *cl
0d80: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 2f  ientData,      /
0d90: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0da0: 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 2a 2f   CallbackData */
0db0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20  .  int nCol,    
0dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0dd0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
0de0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
0df0: 20 20 63 68 61 72 20 2a 2a 20 61 7a 43 6f 6c 2c    char ** azCol,
0e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
0e10: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
0e20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a   */.  char ** az
0e30: 4e 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  N            /* 
0e40: 4e 61 6d 65 20 66 6f 72 20 65 61 63 68 20 63 6f  Name for each co
0e50: 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  lumn */.){.  Tcl
0e60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
0e70: 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 63  = (Tcl_Interp*)c
0e80: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 54 63 6c  lientData;.  Tcl
0e90: 5f 4f 62 6a 20 2a 70 45 6c 65 6d 3b 0a 20 20 69  _Obj *pElem;.  i
0ea0: 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 72 65  f( azCol==0 ) re
0eb0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6e 43  turn 1;.  if( nC
0ec0: 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ol==0 ) return 1
0ed0: 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41  ;.#ifdef UTF_TRA
0ee0: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a  NSLATION_NEEDED.
0ef0: 20 20 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72    {.    Tcl_DStr
0f00: 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 20 20 54 63  ing dCol;.    Tc
0f10: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
0f20: 43 6f 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 45 78  Col);.    Tcl_Ex
0f30: 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69  ternalToUtfDStri
0f40: 6e 67 28 4e 55 4c 4c 2c 20 61 7a 43 6f 6c 5b 30  ng(NULL, azCol[0
0f50: 5d 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20  ], -1, &dCol);. 
0f60: 20 20 20 70 45 6c 65 6d 20 3d 20 54 63 6c 5f 4e     pElem = Tcl_N
0f70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
0f80: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43  DStringValue(&dC
0f90: 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63  ol), -1);.    Tc
0fa0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
0fb0: 43 6f 6c 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  Col);.  }.#else.
0fc0: 20 20 70 45 6c 65 6d 20 3d 20 54 63 6c 5f 4e 65    pElem = Tcl_Ne
0fd0: 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 43 6f 6c  wStringObj(azCol
0fe0: 5b 30 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  [0], -1);.#endif
0ff0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1000: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 45 6c 65  ult(interp, pEle
1010: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  m);.  return 1;.
1020: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20  }../*.** Called 
1030: 77 68 65 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  when the command
1040: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   is deleted..*/.
1050: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44 65  static void DbDe
1060: 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62  leteCmd(void *db
1070: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
1080: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1090: 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  db;.  sqlite3_cl
10a0: 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  ose(pDb->db);.  
10b0: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e  while( pDb->pFun
10c0: 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63  c ){.    SqlFunc
10d0: 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70   *pFunc = pDb->p
10e0: 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70  Func;.    pDb->p
10f0: 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e  Func = pFunc->pN
1100: 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  ext;.    Tcl_Fre
1110: 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b  e((char*)pFunc);
1120: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44  .  }.  while( pD
1130: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  b->pCollate ){. 
1140: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
1150: 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70  Collate = pDb->p
1160: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62  Collate;.    pDb
1170: 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f  ->pCollate = pCo
1180: 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  llate->pNext;.  
1190: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
11a0: 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d  *)pCollate);.  }
11b0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73  .  if( pDb->zBus
11c0: 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  y ){.    Tcl_Fre
11d0: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
11e0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54   }.  if( pDb->zT
11f0: 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f  race ){.    Tcl_
1200: 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
1210: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
1220: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
1230: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
1240: 74 68 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46  th);.  }.  Tcl_F
1250: 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b  ree((char*)pDb);
1260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1270: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1280: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
1290: 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20   file is locked 
12a0: 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
12b0: 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a  to execute SQL..
12c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
12d0: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
12e0: 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73   *cd, int nTries
12f0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
1300: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1310: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  cd;.  int rc;.  
1320: 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 20  char zVal[30];. 
1330: 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 54   char *zCmd;.  T
1340: 63 6c 5f 44 53 74 72 69 6e 67 20 63 6d 64 3b 0a  cl_DString cmd;.
1350: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
1360: 69 74 28 26 63 6d 64 29 3b 0a 20 20 54 63 6c 5f  it(&cmd);.  Tcl_
1370: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 63  DStringAppend(&c
1380: 6d 64 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20  md, pDb->zBusy, 
1390: 2d 31 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  -1);.  sprintf(z
13a0: 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65  Val, "%d", nTrie
13b0: 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  s);.  Tcl_DStrin
13c0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
13d0: 63 6d 64 2c 20 7a 56 61 6c 29 3b 0a 20 20 7a 43  cmd, zVal);.  zC
13e0: 6d 64 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67  md = Tcl_DString
13f0: 56 61 6c 75 65 28 26 63 6d 64 29 3b 0a 20 20 72  Value(&cmd);.  r
1400: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
1410: 2d 3e 69 6e 74 65 72 70 2c 20 7a 43 6d 64 29 3b  ->interp, zCmd);
1420: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
1430: 65 65 28 26 63 6d 64 29 3b 0a 20 20 69 66 28 20  ee(&cmd);.  if( 
1440: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
1450: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
1460: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
1470: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
1480: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1490: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 1;.}../*.** T
14a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
14b0: 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70  nvoked as the 'p
14c0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
14d0: 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  ' for the databa
14e0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
14f0: 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  t DbProgressHand
1500: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
1510: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
1520: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
1530: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1540: 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72  ert( pDb->zProgr
1550: 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63  ess );.  rc = Tc
1560: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
1570: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
1580: 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  ss);.  if( rc!=T
1590: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
15a0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
15b0: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
15c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
15d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
15e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
15f0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1600: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 74   by the SQLite t
1610: 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65  race handler whe
1620: 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62  never a new.** b
1630: 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65  lock of SQL is e
1640: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43  xecuted.  The TC
1650: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
1660: 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63 75  >zTrace is execu
1670: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
1680: 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c  oid DbTraceHandl
1690: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e  er(void *cd, con
16a0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
16b0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
16c0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
16d0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
16e0: 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr;..  Tcl_DStri
16f0: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
1700: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
1710: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72  d(&str, pDb->zTr
1720: 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ace, -1);.  Tcl_
1730: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
1740: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29  ment(&str, zSql)
1750: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  ;.  Tcl_Eval(pDb
1760: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
1770: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
1780: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
1790: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63  Free(&str);.  Tc
17a0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44  l_ResetResult(pD
17b0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f  b->interp);.}../
17c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17d0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
17e0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
17f0: 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54 68  s committed.  Th
1800: 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74 20  e.** TCL script 
1810: 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  in pDb->zCommit 
1820: 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 49 66  is executed.  If
1830: 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d   it returns non-
1840: 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69 74  zero or.** if it
1850: 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
1860: 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73 61  tion, the transa
1870: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1880: 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a 20  back instead.** 
1890: 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  of being committ
18a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
18b0: 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65  t DbCommitHandle
18c0: 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53  r(void *cd){.  S
18d0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
18e0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
18f0: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
1900: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
1910: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d  terp, pDb->zComm
1920: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  it);.  if( rc!=T
1930: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
1940: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1950: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
1960: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1970: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1980: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1990: 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  tclCollateNeeded
19a0: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
19b0: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 0a 20 20    sqlite *db,.  
19c0: 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74  int enc,.  const
19d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
19e0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
19f0: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43  = (SqliteDb *)pC
1a00: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
1a10: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70  Script = Tcl_Dup
1a20: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
1a30: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
1a40: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1a50: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54  nt(pScript);.  T
1a60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1a70: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69  Element(0, pScri
1a80: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
1a90: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
1aa0: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
1ab0: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
1ac0: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63  Script, 0);.  Tc
1ad0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
1ae0: 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Script);.}../*.*
1af0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1b00: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
1b10: 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c  uate an SQL coll
1b20: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
1b30: 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73  mplemented.** us
1b40: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a  ing TCL script..
1b50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
1b60: 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76  lSqlCollate(.  v
1b70: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
1b80: 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nA,.  const voi
1b90: 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
1ba0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1bb0: 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  B.){.  SqlCollat
1bc0: 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  e *p = (SqlColla
1bd0: 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  te *)pCtx;.  Tcl
1be0: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70  _Obj *pCmd;..  p
1bf0: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
1c00: 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70  ingObj(p->zScrip
1c10: 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  t, -1);.  Tcl_In
1c20: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
1c30: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
1c40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
1c50: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
1c60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
1c70: 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c  A, nA));.  Tcl_L
1c80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1c90: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
1ca0: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
1cb0: 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a  ngObj(zB, nB));.
1cc0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
1cd0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
1ce0: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
1cf0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
1d00: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
1d10: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1d20: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
1d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1d40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1d50: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
1d60: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
1d70: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
1d80: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
1d90: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
1da0: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
1db0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1dc0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
1dd0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
1de0: 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d  {.  SqlFunc *p =
1df0: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
1e00: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54  ta(context);.  T
1e10: 63 6c 5f 44 53 74 72 69 6e 67 20 63 6d 64 3b 0a  cl_DString cmd;.
1e20: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
1e30: 63 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  c;..  Tcl_DStrin
1e40: 67 49 6e 69 74 28 26 63 6d 64 29 3b 0a 20 20 54  gInit(&cmd);.  T
1e50: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
1e60: 28 26 63 6d 64 2c 20 70 2d 3e 7a 53 63 72 69 70  (&cmd, p->zScrip
1e70: 74 2c 20 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d  t, -1);.  for(i=
1e80: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
1e90: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1ea0: 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61  NULL==sqlite3_va
1eb0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d  lue_type(argv[i]
1ec0: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  ) ){.      Tcl_D
1ed0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1ee0: 65 6e 74 28 26 63 6d 64 2c 20 22 22 29 3b 0a 20  ent(&cmd, "");. 
1ef0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f00: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
1f10: 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64 2c 20 73  dElement(&cmd, s
1f20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1f30: 74 28 61 72 67 76 5b 69 5d 29 29 3b 0a 20 20 20  t(argv[i]));.   
1f40: 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 54 63   }.  }.  rc = Tc
1f50: 6c 5f 45 76 61 6c 28 70 2d 3e 69 6e 74 65 72 70  l_Eval(p->interp
1f60: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
1f70: 75 65 28 26 63 6d 64 29 29 3b 0a 20 20 69 66 28  ue(&cmd));.  if(
1f80: 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
1f90: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
1fa0: 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74  context, Tcl_Get
1fb0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
1fc0: 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20  interp), -1); . 
1fd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1fe0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1ff0: 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74  context, Tcl_Get
2000: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
2010: 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 0a 20 20  interp), -1, .  
2020: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41        SQLITE_TRA
2030: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 23  NSIENT);.  }.}.#
2040: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2050: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
2060: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
2070: 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  he authenticatio
2080: 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  n function.  It 
2090: 61 70 70 65 6e 64 73 20 74 68 65 20 61 75 74 68  appends the auth
20a0: 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79  entication.** ty
20b0: 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  pe code and the 
20c0: 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  two arguments to
20d0: 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76   zCmd[] then inv
20e0: 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  okes the result.
20f0: 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70  ** on the interp
2100: 72 65 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c  reter.  The repl
2110: 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f  y is examined to
2120: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
2130: 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74  e.** authenticat
2140: 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63  ion fails or suc
2150: 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ceeds..*/.static
2160: 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61   int auth_callba
2170: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ck(.  void *pArg
2180: 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20  ,.  int code,.  
2190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
21a0: 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1,.  const char 
21b0: 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20  *zArg2,.  const 
21c0: 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63  char *zArg3,.  c
21d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34  onst char *zArg4
21e0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64  .){.  char *zCod
21f0: 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  e;.  Tcl_DString
2200: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   str;.  int rc;.
2210: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
2220: 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62  eply;.  SqliteDb
2230: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
2240: 62 2a 29 70 41 72 67 3b 0a 0a 20 20 73 77 69 74  b*)pArg;..  swit
2250: 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20 20 20  ch( code ){.    
2260: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 50 59  case SQLITE_COPY
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
2280: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f  zCode="SQLITE_CO
2290: 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  PY"; break;.    
22a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
22b0: 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20 3a 20  TE_INDEX      : 
22c0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
22d0: 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62 72 65  EATE_INDEX"; bre
22e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
22f0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
2300: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
2310: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
2320: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
2330: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
2340: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20  TE_TEMP_INDEX : 
2350: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
2360: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22  EATE_TEMP_INDEX"
2370: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
2380: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
2390: 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f  TEMP_TABLE : zCo
23a0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
23b0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62  E_TEMP_TABLE"; b
23c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
23d0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
23e0: 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f 64 65  P_TRIGGER: zCode
23f0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
2400: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62  TEMP_TRIGGER"; b
2410: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2420: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
2430: 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d  P_VIEW  : zCode=
2440: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
2450: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
2460: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2470: 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52  E_CREATE_TRIGGER
2480: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
2490: 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47  ITE_CREATE_TRIGG
24a0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
24b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
24c0: 54 45 5f 56 49 45 57 20 20 20 20 20 20 20 3a 20  TE_VIEW       : 
24d0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
24e0: 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72 65 61  EATE_VIEW"; brea
24f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2500: 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 20  TE_DELETE       
2510: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
2520: 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20 62 72  LITE_DELETE"; br
2530: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2540: 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20  LITE_DROP_INDEX 
2550: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
2560: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
2570: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
2580: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
2590: 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a 20 7a  TABLE        : z
25a0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
25b0: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
25c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
25d0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
25e0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
25f0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
2600: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
2610: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
2620: 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20  _TEMP_TABLE   : 
2630: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
2640: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20  OP_TEMP_TABLE"; 
2650: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2660: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
2670: 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f 64 65  _TRIGGER : zCode
2680: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
2690: 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  MP_TRIGGER"; bre
26a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
26b0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
26c0: 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  EW    : zCode="S
26d0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
26e0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
26f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
2700: 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20 20 20  OP_TRIGGER      
2710: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
2720: 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b 20 62  DROP_TRIGGER"; b
2730: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2740: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 20  QLITE_DROP_VIEW 
2750: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
2760: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45  "SQLITE_DROP_VIE
2770: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
2780: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  ase SQLITE_INSER
2790: 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  T            : z
27a0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53  Code="SQLITE_INS
27b0: 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ERT"; break;.   
27c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 41   case SQLITE_PRA
27d0: 47 4d 41 20 20 20 20 20 20 20 20 20 20 20 20 3a  GMA            :
27e0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50   zCode="SQLITE_P
27f0: 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20  RAGMA"; break;. 
2800: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
2810: 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
2820: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
2830: 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20  _READ"; break;. 
2840: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
2850: 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20  ELECT           
2860: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
2870: 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b  _SELECT"; break;
2880: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2890: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20 20 20  _TRANSACTION    
28a0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
28b0: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b  TE_TRANSACTION";
28c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
28d0: 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 20   SQLITE_UPDATE  
28e0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
28f0: 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41 54 45  e="SQLITE_UPDATE
2900: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
2910: 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48  se SQLITE_ATTACH
2920: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
2930: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54 54 41  ode="SQLITE_ATTA
2940: 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CH"; break;.    
2950: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 54 41  case SQLITE_DETA
2960: 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CH            : 
2970: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45  zCode="SQLITE_DE
2980: 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TACH"; break;.  
2990: 20 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20    default       
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20  : zCode="????"; 
29c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c  break;.  }.  Tcl
29d0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
29e0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
29f0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
2a00: 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20  b->zAuth, -1);. 
2a10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2a20: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
2a30: 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53  zCode);.  Tcl_DS
2a40: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
2a50: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f  nt(&str, zArg1 ?
2a60: 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20   zArg1 : "");.  
2a70: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
2a80: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
2a90: 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22  Arg2 ? zArg2 : "
2aa0: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
2ab0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
2ac0: 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72  str, zArg3 ? zAr
2ad0: 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g3 : "");.  Tcl_
2ae0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
2af0: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34  ment(&str, zArg4
2b00: 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a   ? zArg4 : "");.
2b10: 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61    rc = Tcl_Globa
2b20: 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72  lEval(pDb->inter
2b30: 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  p, Tcl_DStringVa
2b40: 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63  lue(&str));.  Tc
2b50: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
2b60: 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20  tr);.  zReply = 
2b70: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
2b80: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
2b90: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
2ba0: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b  Reply,"SQLITE_OK
2bb0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
2bc0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2bd0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
2be0: 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44  zReply,"SQLITE_D
2bf0: 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ENY")==0 ){.    
2c00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59  rc = SQLITE_DENY
2c10: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
2c20: 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c  rcmp(zReply,"SQL
2c30: 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20  ITE_IGNORE")==0 
2c40: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2c50: 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c  TE_IGNORE;.  }el
2c60: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39  se{.    rc = 999
2c70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2c80: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2c90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
2ca0: 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a  RIZATION */../*.
2cb0: 2a 2a 20 7a 54 65 78 74 20 69 73 20 61 20 70 6f  ** zText is a po
2cc0: 69 6e 74 65 72 20 74 6f 20 74 65 78 74 20 6f 62  inter to text ob
2cd0: 74 61 69 6e 65 64 20 76 69 61 20 61 6e 20 73 71  tained via an sq
2ce0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
2cf0: 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61  t().** or simila
2d00: 72 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69  r interface. Thi
2d10: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2d20: 73 20 61 20 54 63 6c 20 73 74 72 69 6e 67 20 6f  s a Tcl string o
2d30: 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72  bject, .** refer
2d40: 65 6e 63 65 20 63 6f 75 6e 74 20 73 65 74 20 74  ence count set t
2d50: 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20  o 0, containing 
2d60: 74 68 65 20 74 65 78 74 2e 20 49 66 20 61 20 74  the text. If a t
2d70: 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65  ranslation.** be
2d80: 74 77 65 65 6e 20 69 73 6f 38 38 35 39 20 61 6e  tween iso8859 an
2d90: 64 20 55 54 46 2d 38 20 69 73 20 72 65 71 75 69  d UTF-8 is requi
2da0: 72 65 64 2c 20 69 74 20 69 73 20 70 72 65 66 6f  red, it is prefo
2db0: 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rmed..*/.static 
2dc0: 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54  Tcl_Obj *dbTextT
2dd0: 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73 74 20  oObj(char const 
2de0: 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f  *zText){.  Tcl_O
2df0: 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66  bj *pVal;.#ifdef
2e00: 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e   UTF_TRANSLATION
2e10: 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f 44 53  _NEEDED.  Tcl_DS
2e20: 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63  tring dCol;.  Tc
2e30: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
2e40: 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65  Col);.  Tcl_Exte
2e50: 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67  rnalToUtfDString
2e60: 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31  (NULL, zText, -1
2e70: 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c  , &dCol);.  pVal
2e80: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
2e90: 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56  Obj(Tcl_DStringV
2ea0: 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29  alue(&dCol), -1)
2eb0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2ec0: 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73  ree(&dCol);.#els
2ed0: 65 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e  e.  pVal = Tcl_N
2ee0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78  ewStringObj(zTex
2ef0: 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  t, -1);.#endif. 
2f00: 20 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a   return pVal;.}.
2f10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69  ./*.** The "sqli
2f20: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f  te" command belo
2f30: 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  w creates a new 
2f40: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  Tcl command for 
2f50: 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  each.** connecti
2f60: 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61  on it opens to a
2f70: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
2f80: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2f90: 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77   is invoked.** w
2fa0: 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74  henever one of t
2fb0: 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  hose connection-
2fc0: 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64  specific command
2fd0: 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a  s is executed.**
2fe0: 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78   in Tcl.  For ex
2ff0: 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75  ample, if you ru
3000: 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20  n Tcl code like 
3010: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
3020: 20 20 73 71 6c 69 74 65 20 64 62 31 20 20 22 6d    sqlite db1  "m
3030: 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20  y_database".**  
3040: 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a       db1 close.*
3050: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63  *.** The first c
3060: 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63  ommand opens a c
3070: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
3080: 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64   "my_database" d
3090: 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63  atabase.** and c
30a0: 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63  alls that connec
30b0: 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65  tion "db1".  The
30c0: 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20   second command 
30d0: 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73  causes this.** s
30e0: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20  ubroutine to be 
30f0: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
3100: 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28  ic int DbObjCmd(
3110: 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
3120: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
3130: 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
3140: 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
3150: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3160: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
3170: 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e  int choice;.  in
3180: 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20  t rc = TCL_OK;. 
3190: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
31a0: 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20  ar *DB_strs[] = 
31b0: 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65  {.    "authorize
31c0: 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75 73  r",         "bus
31d0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
31e0: 20 22 63 68 61 6e 67 65 73 22 2c 0a 20 20 20 20   "changes",.    
31f0: 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  "close",        
3200: 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c        "collate",
3210: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c             "coll
3220: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 0a 20  ation_needed",. 
3230: 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22     "commit_hook"
3240: 2c 20 20 20 20 20 20 20 20 22 63 6f 6d 70 6c 65  ,        "comple
3250: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 22 65  te",          "e
3260: 72 72 6f 72 63 6f 64 65 22 2c 0a 20 20 20 20 22  rrorcode",.    "
3270: 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20  eval",          
3280: 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c       "function",
3290: 20 20 20 20 20 20 20 20 20 20 22 6c 61 73 74 5f            "last_
32a0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 0a 20  insert_rowid",. 
32b0: 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20     "onecolumn", 
32c0: 20 20 20 20 20 20 20 20 20 22 70 72 6f 67 72 65           "progre
32d0: 73 73 22 2c 20 20 20 20 20 20 20 20 20 20 22 72  ss",          "r
32e0: 65 6b 65 79 22 2c 0a 20 20 20 20 22 74 69 6d 65  ekey",.    "time
32f0: 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  out",           
3300: 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22   "total_changes"
3310: 2c 20 20 20 20 20 22 74 72 61 63 65 22 2c 0a 20  ,     "trace",. 
3320: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
3330: 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20          .  };.  
3340: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20  enum DB_enum {. 
3350: 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52     DB_AUTHORIZER
3360: 2c 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59  ,        DB_BUSY
3370: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
3380: 5f 43 48 41 4e 47 45 53 2c 0a 20 20 20 20 44 42  _CHANGES,.    DB
3390: 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20  _CLOSE,         
33a0: 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20      DB_COLLATE, 
33b0: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c           DB_COLL
33c0: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 0a 20 20  ATION_NEEDED,.  
33d0: 20 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b    DB_COMMIT_HOOK
33e0: 2c 20 20 20 20 20 20 20 44 42 5f 43 4f 4d 50 4c  ,       DB_COMPL
33f0: 45 54 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f  ETE,         DB_
3400: 45 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44  ERRORCODE,.    D
3410: 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20  B_EVAL,         
3420: 20 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e       DB_FUNCTION
3430: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 4c 41 53  ,         DB_LAS
3440: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 0a  T_INSERT_ROWID,.
3450: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
3460: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f  ,         DB_PRO
3470: 47 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 44  GRESS,         D
3480: 42 5f 52 45 4b 45 59 2c 0a 20 20 20 20 44 42 5f  B_REKEY,.    DB_
3490: 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20  TIMEOUT,        
34a0: 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e     DB_TOTAL_CHAN
34b0: 47 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45  GES,    DB_TRACE
34c0: 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62  ,.  };..  if( ob
34d0: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
34e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
34f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
3500: 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b  UBCOMMAND ...");
3510: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3520: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
3530: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
3540: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
3550: 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22  v[1], DB_strs, "
3560: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f  option", 0, &cho
3570: 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ice) ){.    retu
3580: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3590: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e  }..  switch( (en
35a0: 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63  um DB_enum)choic
35b0: 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64  e ){..  /*    $d
35c0: 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41  b authorizer ?CA
35d0: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
35e0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
35f0: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  en callback to a
3600: 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51  uthorize each SQ
3610: 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69  L operation as i
3620: 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c  t is.  ** compil
3630: 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73  ed.  5 arguments
3640: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
3650: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65   the callback be
3660: 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  fore it is.  ** 
3670: 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20  invoked:.  **.  
3680: 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74  **   (1) The aut
3690: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20  horization type 
36a0: 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41  (ex: SQLITE_CREA
36b0: 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45  TE_TABLE, SQLITE
36c0: 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20  _INSERT, ...).  
36d0: 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64  **   (2) First d
36e0: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20  escriptive name 
36f0: 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68  (depends on auth
3700: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a  orization type).
3710: 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e    **   (3) Secon
3720: 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  d descriptive na
3730: 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61  me.  **   (4) Na
3740: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3750: 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20  se (ex: "main", 
3760: 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28  "temp").  **   (
3770: 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  5) Name of trigg
3780: 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67  er that is doing
3790: 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a   the access.  **
37a0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  .  ** The callba
37b0: 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ck should return
37c0: 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f   on of the follo
37d0: 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51  wing strings: SQ
37e0: 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51  LITE_OK,.  ** SQ
37f0: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20  LITE_IGNORE, or 
3800: 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e  SQLITE_DENY.  An
3810: 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
3820: 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72  alue is an error
3830: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
3840: 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e  his method is in
3850: 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72  voked with no ar
3860: 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72  guments, the cur
3870: 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69  rent authorizati
3880: 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  on.  ** callback
3890: 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
38a0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
38b0: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20   DB_AUTHORIZER: 
38c0: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
38d0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
38e0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
38f0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
3900: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
3910: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3920: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
3930: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
3940: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
3950: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
3960: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3970: 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  erp, pDb->zAuth,
3980: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
3990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
39a0: 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20  ar *zAuth;.     
39b0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
39c0: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
39d0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
39e0: 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a  ee(pDb->zAuth);.
39f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41        }.      zA
3a00: 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  uth = Tcl_GetStr
3a10: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
3a20: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
3a30: 20 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65   if( zAuth && le
3a40: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
3a50: 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f  Db->zAuth = Tcl_
3a60: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
3a70: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
3a80: 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75  (pDb->zAuth, zAu
3a90: 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  th);.      }else
3aa0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
3ab0: 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Auth = 0;.      
3ac0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
3ad0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
3ae0: 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44  ION.      if( pD
3af0: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
3b00: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
3b10: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
3b20: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
3b30: 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62  thorizer(pDb->db
3b40: 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c  , auth_callback,
3b50: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
3b60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3b70: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
3b80: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
3b90: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
3ba0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  f.    }.    brea
3bb0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
3bc0: 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41  $db busy ?CALLBA
3bd0: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
3be0: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
3bf0: 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51  allback if an SQ
3c00: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65  L statement atte
3c10: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  mpts to open.  *
3c20: 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62  * a locked datab
3c30: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
3c40: 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b   case DB_BUSY: {
3c50: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
3c60: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
3c70: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
3c80: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c  , 2, objv, "CALL
3c90: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
3ca0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3cb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
3cc0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
3cd0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
3ce0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
3cf0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3d00: 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29  , pDb->zBusy, 0)
3d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
3d20: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
3d30: 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e  *zBusy;.      in
3d40: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
3d50: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
3d60: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
3d70: 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20  pDb->zBusy);.   
3d80: 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79     }.      zBusy
3d90: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
3da0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
3db0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
3dc0: 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30  ( zBusy && len>0
3dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
3de0: 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c  >zBusy = Tcl_All
3df0: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
3e00: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44         strcpy(pD
3e10: 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 29  b->zBusy, zBusy)
3e20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3e30: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
3e40: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
3e50: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
3e60: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  usy ){.        p
3e70: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
3e80: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
3e90: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
3ea0: 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73  r(pDb->db, DbBus
3eb0: 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  yHandler, pDb);.
3ec0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
3ee0: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
3ef0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
3f00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
3f10: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
3f20: 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20  $db progress ?N 
3f30: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a  CALLBACK?.  ** .
3f40: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
3f50: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65  given callback e
3f60: 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d  very N virtual m
3f70: 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77  achine opcodes w
3f80: 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20  hile executing. 
3f90: 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
3fa0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47  /.  case DB_PROG
3fb0: 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20  RESS: {.    if( 
3fc0: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
3fd0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
3fe0: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
3ff0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4000: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
4010: 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20 20  ogress, 0);.    
4020: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
4030: 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
4040: 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65     char *zProgre
4050: 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ss;.      int le
4060: 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a  n;.      int N;.
4070: 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b        if( TCL_OK
4080: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
4090: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
40a0: 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 09 72 65 74  [2], &N) ){..ret
40b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
40c0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66       };.      if
40d0: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
40e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
40f0: 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72  Free(pDb->zProgr
4100: 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ess);.      }.  
4110: 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20      zProgress = 
4120: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
4130: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c  mObj(objv[3], &l
4140: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
4150: 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e  Progress && len>
4160: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
4170: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63  ->zProgress = Tc
4180: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
4190: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
41a0: 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  py(pDb->zProgres
41b0: 73 2c 20 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20  s, zProgress);. 
41c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
41d0: 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
41e0: 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ss = 0;.      }.
41f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4200: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
4210: 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20  LBACK.      if( 
4220: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
4230: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
4240: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
4250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4260: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
4270: 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50  (pDb->db, N, DbP
4280: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20  rogressHandler, 
4290: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
42a0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
42b0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
42c0: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
42d0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
42e0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
42f0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
4300: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
4310: 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c  2, objv, "N CALL
4320: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
4330: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4340: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
4350: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24  .  }..  /*     $
4360: 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a  db changes.  **.
4370: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
4380: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
4390: 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65  hat were modifie
43a0: 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20  d, inserted, or 
43b0: 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20  deleted by.  ** 
43c0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
43d0: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
43e0: 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
43f0: 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e  nt, not includin
4400: 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e  g .  ** any chan
4410: 67 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67  ges made by trig
4420: 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20  ger programs..  
4430: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41  */.  case DB_CHA
4440: 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  NGES: {.    Tcl_
4450: 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
4460: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
4470: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
4480: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
4490: 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
44a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
44b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
44c0: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
44d0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
44e0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
44f0: 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73  ntObj(pResult, s
4500: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70  qlite3_changes(p
4510: 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
4520: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
4530: 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a    $db close.  **
4540: 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  .  ** Shutdown t
4550: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f  he database.  */
4560: 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45  .  case DB_CLOSE
4570: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65  : {.    Tcl_Dele
4580: 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
4590: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
45a0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
45b0: 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  0));.    break;.
45c0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
45d0: 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41   commit_hook ?CA
45e0: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
45f0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
4600: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74  en callback just
4610: 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
4620: 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61  ng every SQL tra
4630: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
4640: 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74  f the callback t
4650: 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
4660: 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f  on or returns no
4670: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
4680: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
4690: 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49  n is aborted.  I
46a0: 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e  f CALLBACK is an
46b0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
46c0: 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a  he callback.  **
46d0: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20   is disabled..  
46e0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d  */.  case DB_COM
46f0: 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20  MIT_HOOK: {.    
4700: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
4710: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
4720: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
4730: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
4740: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
4750: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
4760: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
4770: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
4780: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
4790: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
47a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
47b0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30   pDb->zCommit, 0
47c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
47d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
47e0: 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20   *zCommit;.     
47f0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
4800: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
4810: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
4820: 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  Free(pDb->zCommi
4830: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
4840: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f    zCommit = Tcl_
4850: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
4860: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
4870: 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  .      if( zComm
4880: 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  it && len>0 ){. 
4890: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
48a0: 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  mit = Tcl_Alloc(
48b0: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
48c0: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
48d0: 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74  zCommit, zCommit
48e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
48f0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
4900: 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
4910: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
4920: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
4930: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
4940: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
4950: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74    sqlite3_commit
4960: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44  _hook(pDb->db, D
4970: 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20  bCommitHandler, 
4980: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
4990: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
49a0: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
49b0: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
49c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
49d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
49e0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
49f0: 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49  ollate NAME SCRI
4a00: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
4a10: 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f  ate a new SQL co
4a20: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
4a30: 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57   called NAME.  W
4a40: 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61  henever.  ** tha
4a50: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  t function is ca
4a60: 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52  lled, invoke SCR
4a70: 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20  IPT to evaluate 
4a80: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  the function..  
4a90: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c  */.  case DB_COL
4aa0: 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43  LATE: {.    SqlC
4ab0: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
4ac0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
4ad0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63  e;.    char *zSc
4ae0: 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53  ript;.    int nS
4af0: 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f  cript;.    if( o
4b00: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
4b10: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
4b20: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
4b30: 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29  , "NAME SCRIPT")
4b40: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
4b50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
4b60: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
4b70: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
4b80: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
4b90: 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f    zScript = Tcl_
4ba0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
4bb0: 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69  (objv[3], &nScri
4bc0: 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  pt);.    pCollat
4bd0: 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a  e = (SqlCollate*
4be0: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
4bf0: 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20  of(*pCollate) + 
4c00: 6e 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20  nScript + 1 );. 
4c10: 20 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d     if( pCollate=
4c20: 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
4c30: 45 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c  ERROR;.    pColl
4c40: 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  ate->interp = in
4c50: 74 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  terp;.    pColla
4c60: 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  te->pNext = pDb-
4c70: 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70  >pCollate;.    p
4c80: 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74  Collate->zScript
4c90: 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
4ca0: 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d  ate[1];.    pDb-
4cb0: 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c  >pCollate = pCol
4cc0: 6c 61 74 65 3b 0a 20 20 20 20 73 74 72 63 70 79  late;.    strcpy
4cd0: 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69  (pCollate->zScri
4ce0: 70 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20  pt, zScript);.  
4cf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72    if( sqlite3_cr
4d00: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70  eate_collation(p
4d10: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53  Db->db, zName, S
4d20: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
4d30: 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74       pCollate, t
4d40: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b  clSqlCollate) ){
4d50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
4d60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
4d70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
4d80: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
4d90: 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65   collation_neede
4da0: 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  d SCRIPT.  **.  
4db0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
4dc0: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
4dd0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
4de0: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
4df0: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
4e00: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
4e10: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
4e20: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
4e30: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
4e40: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
4e50: 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  DED: {.    if( o
4e60: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
4e70: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
4e80: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
4e90: 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20  , "SCRIPT");.   
4ea0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4eb0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
4ec0: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
4ed0: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20  Needed ){.      
4ee0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4ef0: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
4f00: 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eded);.    }.   
4f10: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
4f20: 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  eded = Tcl_Dupli
4f30: 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29  cateObj(objv[2])
4f40: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
4f50: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
4f60: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
4f70: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
4f80: 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64  on_needed(pDb->d
4f90: 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61  b, pDb, tclColla
4fa0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62  teNeeded);.    b
4fb0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
4fc0: 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20     $db complete 
4fd0: 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  SQL.  **.  ** Re
4fe0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c  turn TRUE if SQL
4ff0: 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53   is a complete S
5000: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52  QL statement.  R
5010: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20  eturn FALSE if. 
5020: 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c   ** additional l
5030: 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72  ines of input ar
5040: 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20  e needed.  This 
5050: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  is similar to th
5060: 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20  e.  ** built-in 
5070: 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20  "info complete" 
5080: 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a  command of Tcl..
5090: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
50a0: 4f 4d 50 4c 45 54 45 3a 20 7b 0a 20 20 20 20 54  OMPLETE: {.    T
50b0: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
50c0: 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  .    int isCompl
50d0: 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ete;.    if( obj
50e0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
50f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
5100: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
5110: 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
5120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5130: 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70      }.    isComp
5140: 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lete = sqlite3_c
5150: 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74  omplete( Tcl_Get
5160: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
5170: 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20  jv[2], 0) );.   
5180: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
5190: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
51a0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
51b0: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75  BooleanObj(pResu
51c0: 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b  lt, isComplete);
51d0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
51e0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
51f0: 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a  b errorcode.  **
5200: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
5210: 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63   numeric error c
5220: 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65 74  ode that was ret
5230: 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73  urned by the mos
5240: 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61  t recent.  ** ca
5250: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
5260: 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ec()..  */.  cas
5270: 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20  e DB_ERRORCODE: 
5280: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
5290: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
52a0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
52b0: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
52c0: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65  ->db)));.    bre
52d0: 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a  ak;.  }.   .  /*
52e0: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61  .  **    $db eva
52f0: 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 20 7b 20  l $sql ?array { 
5300: 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20   ...code... }?. 
5310: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
5320: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73   statement in $s
5330: 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  ql is evaluated.
5340: 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20    For each row, 
5350: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20  the values are. 
5360: 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c   ** placed in el
5370: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72  ements of the ar
5380: 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79  ray named "array
5390: 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e  " and ...code...
53a0: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
53b0: 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61 6e  ** If "array" an
53c0: 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69  d "code" are omi
53d0: 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61  tted, then no ca
53e0: 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79 20  llback is every 
53f0: 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66  invoked..  ** If
5400: 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20 65   "array" is an e
5410: 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65  mpty string, the
5420: 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  n the values are
5430: 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61   placed in varia
5440: 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68  bles.  ** that h
5450: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ave the same nam
5460: 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73 20  e as the fields 
5470: 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65  extracted by the
5480: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63   query..  */.  c
5490: 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20  ase DB_EVAL: {. 
54a0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
54b0: 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20 63 6f  Sql;.    char co
54c0: 6e 73 74 20 2a 7a 4c 65 66 74 3b 0a 20 20 20 20  nst *zLeft;.    
54d0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
54e0: 74 6d 74 3b 0a 0a 20 20 20 20 54 63 6c 5f 4f 62  tmt;..    Tcl_Ob
54f0: 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
5500: 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63 6c 5f  wObj();.    Tcl_
5510: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
5520: 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a  t);..    if( obj
5530: 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=5 && objc!=3 
5540: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
5550: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
5560: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20  , 2, objv, "SQL 
5570: 3f 41 52 52 41 59 2d 4e 41 4d 45 20 43 4f 44 45  ?ARRAY-NAME CODE
5580: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
5590: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
55a0: 20 7d 0a 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54   }..    zSql = T
55b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
55c0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
55d0: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  .    while( zSql
55e0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
55f0: 20 69 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28   i;.  .      if(
5600: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5610: 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
5620: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
5630: 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29  pStmt, &zLeft) )
5640: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
5650: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
5660: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
5670: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
5680: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
5690: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
56a0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
56b0: 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
56c0: 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 6f    if( pStmt && o
56d0: 62 6a 63 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20  bjc==5 ){.      
56e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c    Tcl_Obj *pColL
56f0: 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ist = Tcl_NewObj
5700: 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ();.        Tcl_
5710: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f  IncrRefCount(pCo
5720: 6c 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 20  lList);..       
5730: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c 69   for(i=0; i<sqli
5740: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
5750: 28 70 53 74 6d 74 29 3b 20 69 2b 2b 29 7b 0a 20  (pStmt); i++){. 
5760: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
5770: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5780: 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69  t(interp, pColLi
5790: 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
57a0: 20 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71    dbTextToObj(sq
57b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
57c0: 65 28 70 53 74 6d 74 2c 20 69 29 29 0a 20 20 20  e(pStmt, i)).   
57d0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
57e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f    }.        Tcl_
57f0: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
5800: 70 2c 6f 62 6a 76 5b 33 5d 2c 54 63 6c 5f 4e 65  p,objv[3],Tcl_Ne
5810: 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 2d  wStringObj("*",-
5820: 31 29 2c 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a  1),pColList,0);.
5830: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 77        }..      w
5840: 68 69 6c 65 28 20 70 53 74 6d 74 20 26 26 20 53  hile( pStmt && S
5850: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
5860: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
5870: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
5880: 30 3b 20 69 3c 73 71 6c 69 74 65 33 5f 63 6f 6c  0; i<sqlite3_col
5890: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
58a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
58b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
58c0: 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
58d0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61        /* Set pVa
58e0: 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  l to contain the
58f0: 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i'th column of 
5900: 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20  this row. */.   
5910: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5920: 45 5f 42 4c 4f 42 21 3d 73 71 6c 69 74 65 33 5f  E_BLOB!=sqlite3_
5930: 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
5940: 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  t, i) ){.       
5950: 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65       pVal = dbTe
5960: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
5970: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
5980: 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20  t, i));.        
5990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
59a0: 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d       int bytes =
59b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
59c0: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 29 3b  bytes(pStmt, i);
59d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61  .            pVa
59e0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
59f0: 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f  rrayObj(sqlite3_
5a00: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
5a10: 74 2c 20 69 29 2c 20 62 79 74 65 73 29 3b 0a 20  t, i), bytes);. 
5a20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
5a30: 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63          if( objc
5a40: 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==5 ){.         
5a50: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 61 6d     Tcl_Obj *pNam
5a60: 65 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  e = dbTextToObj(
5a70: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
5a80: 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a  ame(pStmt, i));.
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
5aa0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 61  IncrRefCount(pNa
5ab0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
5ac0: 20 69 66 28 20 21 73 74 72 63 6d 70 28 22 22 2c   if( !strcmp("",
5ad0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
5ae0: 62 6a 76 5b 33 5d 29 29 20 29 7b 0a 20 20 20 20  bjv[3])) ){.    
5af0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
5b00: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
5b10: 20 70 4e 61 6d 65 2c 20 30 2c 20 70 56 61 6c 2c   pName, 0, pVal,
5b20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
5b30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5b40: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
5b50: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
5b60: 76 5b 33 5d 2c 20 70 4e 61 6d 65 2c 20 70 56 61  v[3], pName, pVa
5b70: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
5b80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5b90: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5ba0: 74 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  t(pName);.      
5bb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5bc0: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
5bd0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5be0: 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56  interp, pRet, pV
5bf0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  al);.          }
5c00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
5c10: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d        if( objc==
5c20: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  5 ){.          r
5c30: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
5c40: 78 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  x(interp, objv[4
5c50: 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 0);.         
5c60: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45 52 52   if( rc!=TCL_ERR
5c70: 4f 52 20 29 20 72 63 20 3d 20 54 43 4c 5f 4f 4b  OR ) rc = TCL_OK
5c80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5c90: 20 20 7d 0a 20 20 20 20 20 20 20 0a 20 20 20 20    }.       .    
5ca0: 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 53    if( pStmt && S
5cb0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 73 71  QLITE_SCHEMA==sq
5cc0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
5cd0: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stmt) ){.       
5ce0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5cf0: 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
5d00: 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f  pStmt && SQLITE_
5d10: 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
5d20: 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a  ode(pDb->db) ){.
5d30: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
5d40: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
5d50: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
5d60: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
5d70: 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >db)));.        
5d80: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
5d90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5da0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 53       }..      zS
5db0: 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20  ql = zLeft;.    
5dc0: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54  }..    if( rc==T
5dd0: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  CL_OK ){.      T
5de0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
5df0: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
5e00: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
5e10: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
5e20: 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ..    break;.  }
5e30: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
5e40: 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d  $db function NAM
5e50: 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
5e60: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
5e70: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  SQL function cal
5e80: 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65  led NAME.  Whene
5e90: 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f  ver that functio
5ea0: 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64  n is.  ** called
5eb0: 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20  , invoke SCRIPT 
5ec0: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
5ed0: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
5ee0: 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f   case DB_FUNCTIO
5ef0: 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63  N: {.    SqlFunc
5f00: 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 63 68 61   *pFunc;.    cha
5f10: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
5f20: 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20  ar *zScript;.   
5f30: 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20   int nScript;.  
5f40: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
5f50: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
5f60: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
5f70: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
5f80: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
5f90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5fa0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
5fb0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
5fc0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
5fd0: 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74   0);.    zScript
5fe0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
5ff0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
6000: 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20   &nScript);.    
6010: 70 46 75 6e 63 20 3d 20 28 53 71 6c 46 75 6e 63  pFunc = (SqlFunc
6020: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
6030: 65 6f 66 28 2a 70 46 75 6e 63 29 20 2b 20 6e 53  eof(*pFunc) + nS
6040: 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20  cript + 1 );.   
6050: 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20   if( pFunc==0 ) 
6060: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6070: 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 69 6e 74  ;.    pFunc->int
6080: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
6090: 20 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 20 3d    pFunc->pNext =
60a0: 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20   pDb->pFunc;.   
60b0: 20 70 46 75 6e 63 2d 3e 7a 53 63 72 69 70 74 20   pFunc->zScript 
60c0: 3d 20 28 63 68 61 72 2a 29 26 70 46 75 6e 63 5b  = (char*)&pFunc[
60d0: 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75  1];.    pDb->pFu
60e0: 6e 63 20 3d 20 70 46 75 6e 63 3b 0a 20 20 20 20  nc = pFunc;.    
60f0: 73 74 72 63 70 79 28 70 46 75 6e 63 2d 3e 7a 53  strcpy(pFunc->zS
6100: 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 29 3b  cript, zScript);
6110: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6120: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
6130: 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65  n(pDb->db, zName
6140: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
6150: 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  8,.        pFunc
6160: 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c  , tclSqlFunc, 0,
6170: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
6180: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
6190: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
61a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
61b0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c  *.  **     $db l
61c0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
61d0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75   .  **.  ** Retu
61e0: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
61f0: 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44  ich is the ROWID
6200: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
6210: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a  cent insert..  *
6220: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54  /.  case DB_LAST
6230: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b  _INSERT_ROWID: {
6240: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
6250: 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72  esult;.    int r
6260: 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62  owid;.    if( ob
6270: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
6280: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6290: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
62a0: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
62b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
62c0: 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20    }.    rowid = 
62d0: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
62e0: 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64  ert_rowid(pDb->d
62f0: 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20  b);.    pResult 
6300: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
6310: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
6320: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
6330: 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20  esult, rowid);. 
6340: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6350: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
6360: 20 6f 6e 65 63 6f 6c 75 6d 6e 20 53 51 4c 0a 20   onecolumn SQL. 
6370: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
6380: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
6390: 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 72 6f  from a single ro
63a0: 77 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 53  w of the given S
63b0: 51 4c 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  QL query..  */. 
63c0: 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55   case DB_ONECOLU
63d0: 4d 4e 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  MN: {.    char *
63e0: 7a 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  zSql;.    char *
63f0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
6400: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
6410: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6420: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6430: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
6440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6450: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6460: 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74    zSql = Tcl_Get
6470: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
6480: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72  jv[2], 0);.    r
6490: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
64a0: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
64b0: 44 62 45 76 61 6c 43 61 6c 6c 62 61 63 6b 33 2c  DbEvalCallback3,
64c0: 20 69 6e 74 65 72 70 2c 20 26 7a 45 72 72 4d 73   interp, &zErrMs
64d0: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
64e0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 29 7b 0a  SQLITE_ABORT ){.
64f0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6500: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
6510: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
6520: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
6530: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d  lt(interp, zErrM
6540: 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  sg, TCL_VOLATILE
6550: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 45  );.      free(zE
6560: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
6570: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
6580: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
6590: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
65a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
65b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
65c0: 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30  te3ErrStr(rc), 0
65d0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
65e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
65f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6600: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
6610: 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a   rekey KEY.  **.
6620: 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20    ** Change the 
6630: 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f  encryption key o
6640: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
6650: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20  open database.. 
6660: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45   */.  case DB_RE
6670: 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e  KEY: {.    int n
6680: 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  Key;.    void *p
6690: 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  Key;.    if( obj
66a0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
66b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
66c0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
66d0: 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65  "KEY");.      re
66e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
66f0: 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d      }.    pKey =
6700: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
6710: 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
6720: 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66  , &nKey);.#ifdef
6730: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
6740: 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  C.    rc = sqlit
6750: 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62  e3_rekey(pDb->db
6760: 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
6770: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
6780: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6790: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
67a0: 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30  te3ErrStr(rc), 0
67b0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
67c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
67d0: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
67e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
67f0: 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20      $db timeout 
6800: 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a  MILLESECONDS.  *
6810: 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72  *.  ** Delay for
6820: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
6830: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63  illiseconds spec
6840: 69 66 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c  ified when a fil
6850: 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  e is locked..  *
6860: 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45  /.  case DB_TIME
6870: 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d  OUT: {.    int m
6880: 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  s;.    if( objc!
6890: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
68a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
68b0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d  erp, 2, objv, "M
68c0: 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20  ILLISECONDS");. 
68d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
68e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
68f0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
6900: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
6910: 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  bjv[2], &ms) ) r
6920: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6930: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
6940: 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64  y_timeout(pDb->d
6950: 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61  b, ms);.    brea
6960: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
6970: 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f  *     $db total_
6980: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
6990: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
69a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
69b0: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
69c0: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
69d0: 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  eted .  ** since
69e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
69f0: 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
6a00: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
6a10: 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
6a20: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
6a30: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
6a40: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
6a50: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
6a60: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
6a70: 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
6a80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6a90: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
6aa0: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
6ab0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
6ac0: 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
6ad0: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
6ae0: 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
6af0: 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
6b00: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
6b10: 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
6b20: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
6b30: 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
6b40: 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
6b50: 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
6b60: 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
6b70: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
6b80: 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
6b90: 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
6ba0: 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
6bb0: 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
6bc0: 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
6bd0: 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
6be0: 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
6bf0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
6c00: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
6c10: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6c20: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
6c30: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
6c40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6c50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6c60: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
6c70: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
6c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
6c90: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6ca0: 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
6cb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6cc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
6cd0: 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
6ce0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
6cf0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
6d00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
6d10: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
6d20: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
6d30: 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
6d40: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6d50: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
6d60: 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
6d70: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
6d80: 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
6d90: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
6da0: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
6db0: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 54 72   strcpy(pDb->zTr
6dc0: 61 63 65 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20  ace, zTrace);.  
6dd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6de0: 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
6df0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6e00: 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
6e10: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  e ){.        pDb
6e20: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
6e30: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
6e40: 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62  e3_trace(pDb->db
6e50: 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72  , DbTraceHandler
6e60: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
6e70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
6e80: 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e  ite3_trace(pDb->
6e90: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
6ea0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
6eb0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 7d 20 2f 2a 20  ak;.  }..  } /* 
6ec0: 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43  End of the SWITC
6ed0: 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  H statement */. 
6ee0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6ef0: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 20 44 42  *.**   sqlite DB
6f00: 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d  NAME FILENAME ?M
6f10: 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a  ODE? ?-key KEY?.
6f20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
6f30: 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61  e main Tcl comma
6f40: 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73  nd.  When the "s
6f50: 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61  qlite" Tcl comma
6f60: 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  nd is.** invoked
6f70: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
6f80: 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74  uns to process t
6f90: 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  hat command..**.
6fa0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
6fb0: 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69  ument, DBNAME, i
6fc0: 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e  s an arbitrary n
6fd0: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a  ame for a new.**
6fe0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6ff0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d  tion.  This comm
7000: 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65  and creates a ne
7010: 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a  w command named.
7020: 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69  ** DBNAME that i
7030: 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  s used to contro
7040: 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  l that connectio
7050: 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  n.  The database
7060: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
7070: 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  s deleted when t
7080: 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e  he DBNAME comman
7090: 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  d is deleted..**
70a0: 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
70b0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
70c0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
70d0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
70e0: 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  ns.** the sqlite
70f0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
7100: 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
7110: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74  ..**.** For test
7120: 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65  ing purposes, we
7130: 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74 68   also support th
7140: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
7150: 2a 2a 20 20 73 71 6c 69 74 65 20 2d 65 6e 63 6f  **  sqlite -enco
7160: 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ding.**.**      
7170: 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e 63 6f   Return the enco
7180: 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c 49 4b  ding used by LIK
7190: 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61  E and GLOB opera
71a0: 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73 0a 2a  tors.  Choices.*
71b0: 2a 20 20 20 20 20 20 20 61 72 65 20 55 54 46 2d  *       are UTF-
71c0: 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e 0a 2a  8 and iso8859..*
71d0: 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 20 2d 76 65  *.**  sqlite -ve
71e0: 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rsion.**.**     
71f0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72    Return the ver
7200: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74  sion number of t
7210: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
7220: 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  y..**.**  sqlite
7230: 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a   -tcl-uses-utf.*
7240: 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72  *.**       Retur
7250: 6e 20 22 31 22 20 69 66 20 63 6f 6d 70 69 6c 65  n "1" if compile
7260: 64 20 77 69 74 68 20 61 20 54 63 6c 20 75 73 65  d with a Tcl use
7270: 73 20 55 54 46 2d 38 2e 20 20 52 65 74 75 72 6e  s UTF-8.  Return
7280: 20 22 30 22 20 69 66 0a 2a 2a 20 20 20 20 20 20   "0" if.**      
7290: 20 6e 6f 74 2e 20 20 55 73 65 64 20 62 79 20 74   not.  Used by t
72a0: 65 73 74 73 20 74 6f 20 6d 61 6b 65 20 73 75 72  ests to make sur
72b0: 65 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  e the library wa
72c0: 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20  s compiled .**  
72d0: 20 20 20 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a       correctly..
72e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
72f0: 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54  Main(void *cd, T
7300: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7310: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f  p, int objc,Tcl_
7320: 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29  Obj *const*objv)
7330: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b  {.  SqliteDb *p;
7340: 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20  .  void *pKey = 
7350: 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  0;.  int nKey = 
7360: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
7370: 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a  *zArg;.  char *z
7380: 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e 73 74 20  ErrMsg;.  const 
7390: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
73a0: 68 61 72 20 7a 42 75 66 5b 38 30 5d 3b 0a 20 20  har zBuf[80];.  
73b0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
73c0: 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
73d0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
73e0: 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[1], 0);.    
73f0: 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
7400: 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29  "-version")==0 )
7410: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
7420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7430: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c  sqlite3_version,
7440: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
7450: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
7460: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
7470: 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29  rg,"-has-codec")
7480: 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
7490: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
74a0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
74b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22  esult(interp,"1"
74c0: 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ,0);.#else.     
74d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
74e0: 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b  t(interp,"0",0);
74f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
7500: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
7510: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
7520: 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d 75 73 65  p(zArg,"-tcl-use
7530: 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b 0a 23 69  s-utf")==0 ){.#i
7540: 66 64 65 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58  fdef TCL_UTF_MAX
7550: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
7560: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
7570: 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1",0);.#else.   
7580: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7590: 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30  ult(interp,"0",0
75a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
75b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
75c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
75d0: 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d  bjc==5 || objc==
75e0: 36 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  6 ){.    zArg = 
75f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7600: 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32  mObj(objv[objc-2
7610: 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73  ], 0);.    if( s
7620: 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79  trcmp(zArg,"-key
7630: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ")==0 ){.      p
7640: 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
7650: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
7660: 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65  jv[objc-1], &nKe
7670: 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a 63 20 2d  y);.      objc -
7680: 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 2;.    }.  }. 
7690: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
76a0: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
76b0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
76c0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
76d0: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
76e0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
76f0: 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
7700: 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d 4b 45 59   ?-key CODEC-KEY
7710: 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  ?".#else.      "
7720: 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20  HANDLE FILENAME 
7730: 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69 66 0a 20  ?MODE?".#endif. 
7740: 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
7750: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
7760: 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
7770: 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29   p = (SqliteDb*)
7780: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
7790: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
77a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
77b0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
77c0: 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22   "malloc failed"
77d0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
77e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
77f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ROR;.  }.  memse
7800: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
7810: 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54  p));.  zFile = T
7820: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7830: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
7840: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  .  sqlite3_open(
7850: 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a  zFile, &p->db);.
7860: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
7870: 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  =sqlite3_errcode
7880: 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a  (p->db) ){.    z
7890: 45 72 72 4d 73 67 20 3d 20 73 74 72 64 75 70 28  ErrMsg = strdup(
78a0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
78b0: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  ->db));.    sqli
78c0: 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
78d0: 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b  ;.    p->db = 0;
78e0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
78f0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73  TE_HAS_CODEC.  s
7900: 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62  qlite3_key(p->db
7910: 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23  , pKey, nKey);.#
7920: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64  endif.  if( p->d
7930: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  b==0 ){.    Tcl_
7940: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
7950: 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56  , zErrMsg, TCL_V
7960: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63  OLATILE);.    Tc
7970: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29  l_Free((char*)p)
7980: 3b 0a 20 20 20 20 66 72 65 65 28 7a 45 72 72 4d  ;.    free(zErrM
7990: 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  sg);.    return 
79a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
79b0: 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
79c0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
79d0: 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  v[1], 0);.  Tcl_
79e0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
79f0: 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
7a00: 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
7a10: 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
7a20: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72  ..  /* The retur
7a30: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 76  n value is the v
7a40: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 71 6c 69  alue of the sqli
7a50: 74 65 2a 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2f  te* pointer.  */
7a60: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
7a70: 20 22 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20   "%p", p->db);. 
7a80: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 42 75   if( strncmp(zBu
7a90: 66 2c 22 30 78 22 2c 32 29 20 29 7b 0a 20 20 20  f,"0x",2) ){.   
7aa0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
7ab0: 30 78 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20  0x%p", p->db);. 
7ac0: 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
7ad0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
7ae0: 75 66 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  uf, 0);..  /* If
7af0: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
7b00: 51 4c 49 54 45 5f 54 45 53 54 20 74 75 72 6e 65  QLITE_TEST turne
7b10: 64 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67 69 73  d on, then regis
7b20: 74 65 72 20 74 68 65 20 22 6d 64 35 73 75 6d 22  ter the "md5sum"
7b30: 0a 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  .  ** SQL functi
7b40: 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  on..  */.#ifdef 
7b50: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a  SQLITE_TEST.  {.
7b60: 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
7b70: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
7b80: 69 74 65 2a 29 3b 0a 23 69 66 64 65 66 20 53 51  ite*);.#ifdef SQ
7b90: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
7ba0: 6e 74 20 6d 61 6c 6c 6f 63 66 61 69 6c 20 3d 20  nt mallocfail = 
7bb0: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
7bc0: 61 69 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ail;.    sqlite3
7bd0: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 30  _iMallocFail = 0
7be0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 4d 64 35  ;.#endif.    Md5
7bf0: 5f 52 65 67 69 73 74 65 72 28 70 2d 3e 64 62 29  _Register(p->db)
7c00: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
7c10: 44 45 42 55 47 0a 20 20 20 20 73 71 6c 69 74 65  DEBUG.    sqlite
7c20: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20  3_iMallocFail = 
7c30: 6d 61 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64  mallocfail;.#end
7c40: 69 66 0a 20 20 20 7d 0a 23 65 6e 64 69 66 20 20  if.   }.#endif  
7c50: 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
7c60: 6e 74 65 72 70 3b 0a 20 20 72 65 74 75 72 6e 20  nterp;.  return 
7c70: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
7c80: 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79   Provide a dummy
7c90: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69   Tcl_InitStubs i
7ca0: 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
7cb0: 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a  his as a static.
7cc0: 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ** library..*/.#
7cd0: 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  ifndef USE_TCL_S
7ce0: 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63  TUBS.# undef  Tc
7cf0: 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65  l_InitStubs.# de
7d00: 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75  fine Tcl_InitStu
7d10: 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  bs(a,b,c).#endif
7d20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
7d30: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
7d40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d  **.** This Tcl m
7d50: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f  odule contains o
7d60: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  nly a single new
7d70: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
7d80: 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20  ed "sqlite"..** 
7d90: 28 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20  (Hence there is 
7da0: 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54  no namespace.  T
7db0: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
7dc0: 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65   in using a name
7dd0: 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20  space.** if the 
7de0: 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73  extension only s
7df0: 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20  upplies one new 
7e00: 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c  name!)  The "sql
7e10: 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a  ite" command is.
7e20: 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  ** used to open 
7e30: 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74  a new SQLite dat
7e40: 61 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20  abase.  See the 
7e50: 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65  DbMain() routine
7e60: 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64   above.** for ad
7e70: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
7e80: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c  tion..*/.int Sql
7e90: 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
7ea0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
7eb0: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69   Tcl_InitStubs(i
7ec0: 6e 74 65 72 70 2c 20 22 38 2e 30 22 2c 20 30 29  nterp, "8.0", 0)
7ed0: 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
7ee0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
7ef0: 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
7f00: 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
7f10: 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
7f20: 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
7f30: 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
7f40: 22 33 2e 30 22 29 3b 0a 20 20 72 65 74 75 72 6e  "3.0");.  return
7f50: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 54   TCL_OK;.}.int T
7f60: 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  clsqlite3_Init(T
7f70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7f80: 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74  p){.  Tcl_InitSt
7f90: 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 30  ubs(interp, "8.0
7fa0: 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ", 0);.  Tcl_Cre
7fb0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
7fc0: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
7fd0: 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
7fe0: 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
7ff0: 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
8000: 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
8010: 65 33 22 2c 20 22 33 2e 30 22 29 3b 0a 20 20 72  e3", "3.0");.  r
8020: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8030: 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65  int Sqlite3_Safe
8040: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
8050: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74 75  *interp){.  retu
8060: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74  rn TCL_OK;.}.int
8070: 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65   Tclsqlite3_Safe
8080: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
8090: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74 75  *interp){.  retu
80a0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
80b0: 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a  fdef TCLSH./****
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
8110: 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
8120: 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  ws is used to bu
8130: 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54  ild standalone T
8140: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a  CL interpreters.
8150: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  */../*.** If the
8160: 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
8170: 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e  one, then put in
8180: 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74   code this for t
8190: 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75  he.** "main" rou
81a0: 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69  tine that will i
81b0: 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e  nitialize Tcl an
81c0: 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f  d take input fro
81d0: 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  m.** standard in
81e0: 70 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53  put..*/.#if TCLS
81f0: 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72  H==1.static char
8200: 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20   zMainloop[] =. 
8210: 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22   "set line {}\n"
8220: 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66  .  "while {![eof
8230: 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20   stdin]} {\n".  
8240: 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22    "if {$line!=\"
8250: 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  \"} {\n".      "
8260: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
8270: 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d  \"> \"\n".    "}
8280: 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
8290: 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e   "puts -nonewlin
82a0: 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20  e \"% \"\n".    
82b0: 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68  "}\n".    "flush
82c0: 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22   stdout\n".    "
82d0: 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74  append line [get
82e0: 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20  s stdin]\n".    
82f0: 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c  "if {[info compl
8300: 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22  ete $line]} {\n"
8310: 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74  .      "if {[cat
8320: 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24  ch {uplevel #0 $
8330: 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b  line} result]} {
8340: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
8350: 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72  s stderr \"Error
8360: 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20  : $result\"\n". 
8370: 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b       "} elseif {
8380: 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b  $result!=\"\"} {
8390: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
83a0: 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20  s $result\n".   
83b0: 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22     "}\n".      "
83c0: 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
83d0: 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a     "} else {\n".
83e0: 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69        "append li
83f0: 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d  ne \\n\n".    "}
8400: 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65  \n".  "}\n".;.#e
8410: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
8420: 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69  he macro TCLSH i
8430: 73 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20  s two, then get 
8440: 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f  the main loop co
8450: 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65  de out of.** the
8460: 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 20 22   separate file "
8470: 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22  spaceanal_tcl.h"
8480: 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ..*/.#if TCLSH==
8490: 32 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d  2.static char zM
84a0: 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e  ainloop[] = .#in
84b0: 63 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c  clude "spaceanal
84c0: 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66  _tcl.h".;.#endif
84d0: 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f  ..#define TCLSH_
84e0: 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e  MAIN main   /* N
84f0: 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75  eeded to fake ou
8500: 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e  t mktclapp */.in
8510: 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74  t TCLSH_MAIN(int
8520: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
8530: 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  gv){.  Tcl_Inter
8540: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
8550: 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28  _FindExecutable(
8560: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65  argv[0]);.  inte
8570: 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49  rp = Tcl_CreateI
8580: 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74  nterp();.  Sqlit
8590: 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
85a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
85b0: 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65  EST.  {.    exte
85c0: 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
85d0: 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t1_Init(Tcl_Inte
85e0: 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
85f0: 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32   int Sqlitetest2
8600: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
8610: 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
8620: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49  nt Sqlitetest3_I
8630: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
8640: 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
8650: 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
8660: 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
8670: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
8680: 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
8690: 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
86a0: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35    extern int Md5
86b0: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
86c0: 2a 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  *);.    Sqlitete
86d0: 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st1_Init(interp)
86e0: 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
86f0: 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  2_Init(interp);.
8700: 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f      Sqlitetest3_
8710: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
8720: 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e    Sqlitetest4_In
8730: 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
8740: 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
8750: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d 64  (interp);.    Md
8760: 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
8770: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
8780: 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53   argc>=2 || TCLS
8790: 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  H==2 ){.    int 
87a0: 69 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  i;.    Tcl_SetVa
87b0: 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22  r(interp,"argv0"
87c0: 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f  ,argv[1],TCL_GLO
87d0: 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
87e0: 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
87f0: 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c  ,"argv", "", TCL
8800: 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
8810: 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72     for(i=2; i<ar
8820: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
8830: 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
8840: 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b  p, "argv", argv[
8850: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43  i],.          TC
8860: 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20  L_GLOBAL_ONLY | 
8870: 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54  TCL_LIST_ELEMENT
8880: 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41   | TCL_APPEND_VA
8890: 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LUE);.    }.    
88a0: 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20  if( TCLSH==1 && 
88b0: 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74  Tcl_EvalFile(int
88c0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54  erp, argv[1])!=T
88d0: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63  CL_OK ){.      c
88e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f  onst char *zInfo
88f0: 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e   = Tcl_GetVar(in
8900: 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f  terp, "errorInfo
8910: 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
8920: 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LY);.      if( z
8930: 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20  Info==0 ) zInfo 
8940: 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74  = interp->result
8950: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
8960: 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e  stderr,"%s: %s\n
8970: 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29  ", *argv, zInfo)
8980: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
8990: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
89a0: 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c  ( argc<=1 || TCL
89b0: 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  SH==2 ){.    Tcl
89c0: 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65  _GlobalEval(inte
89d0: 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a  rp, zMainloop);.
89e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
89f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53  }.#endif /* TCLS
8a00: 48 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  H */..#endif /* 
8a10: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 43 4c 29  !defined(NO_TCL)
8a20: 20 2a 2f 0a                                       */.