/ Hex Artifact Content
Login

Artifact 8d093146332b2f0cbf2a8ebe8597d481619308a3:


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: 30 20 32 30 30 34 2f 30 36 2f 32 31 20 30 36 3a  0 2004/06/21 06:
01c0: 35 30 3a 32 38 20 64 61 6e 69 65 6c 6b 31 39 37  50:28 danielk197
01d0: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
01e0: 65 66 20 4e 4f 5f 54 43 4c 20 20 20 20 20 2f 2a  ef NO_TCL     /*
01f0: 20 4f 6d 69 74 20 74 68 69 73 20 77 68 6f 6c 65   Omit this whole
0200: 20 66 69 6c 65 20 69 66 20 54 43 4c 20 69 73 20   file if TCL is 
0210: 75 6e 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 0a  unavailable */..
0220: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0230: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0240: 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65  "tcl.h".#include
0250: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0260: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0270: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0280: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43  .h>../*.** If TC
0290: 4c 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e 64  L uses UTF-8 and
02a0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66 69   SQLite is confi
02b0: 67 75 72 65 64 20 74 6f 20 75 73 65 20 69 73 6f  gured to use iso
02c0: 38 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a  8859, then we.**
02d0: 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74 72   have to do a tr
02e0: 61 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67  anslation when g
02f0: 6f 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65  oing between the
0300: 20 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20 0a   two.  Set the .
0310: 2a 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ** UTF_TRANSLATI
0320: 4f 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f 20  ON_NEEDED macro 
0330: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
0340: 20 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a   we need to do.*
0350: 2a 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69  * this translati
0360: 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66  on.  .*/.#if def
0370: 69 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58  ined(TCL_UTF_MAX
0380: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
0390: 4c 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65 66  LITE_UTF8).# def
03a0: 69 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  ine UTF_TRANSLAT
03b0: 49 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e  ION_NEEDED 1.#en
03c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53  dif../*.** New S
03d0: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  QL functions can
03e0: 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54   be created as T
03f0: 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63  CL scripts.  Eac
0400: 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a  h such function.
0410: 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65 64 20  ** is described 
0420: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0430: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0440: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
0450: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0460: 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74  Func SqlFunc;.st
0470: 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20  ruct SqlFunc {. 
0480: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0490: 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43  erp;   /* The TC
04a0: 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65  L interpret to e
04b0: 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74  xecute the funct
04c0: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
04d0: 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f  Script;        /
04e0: 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20  * The script to 
04f0: 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 46  be run */.  SqlF
0500: 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  unc *pNext;     
0510: 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69    /* Next functi
0520: 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  on on the list o
0530: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b  f them all */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c 6c  ../*.** New coll
0550: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
0560: 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  function can be 
0570: 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20 73  created as TCL s
0580: 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73 75  cripts.  Each su
0590: 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ch.** function i
05a0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
05b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
05c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
05d0: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
05e0: 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c  f struct SqlColl
05f0: 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65 3b 0a  ate SqlCollate;.
0600: 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74  struct SqlCollat
0610: 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  e {.  Tcl_Interp
0620: 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54   *interp;   /* T
0630: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
0640: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
0650: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  function */.  ch
0660: 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20 20  ar *zScript;    
0670: 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69 70      /* The scrip
0680: 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a 20  t to be run */. 
0690: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e 65   SqlCollate *pNe
06a0: 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  xt;       /* Nex
06b0: 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  t function on th
06c0: 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  e list of them a
06d0: 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ll */.};../*.** 
06e0: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
06f0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0700: 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
0710: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0720: 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
0730: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
0740: 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72  SQLite TCL inter
0750: 66 61 63 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  face..*/.typedef
0760: 20 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62   struct SqliteDb
0770: 20 53 71 6c 69 74 65 44 62 3b 0a 73 74 72 75 63   SqliteDb;.struc
0780: 74 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73  t SqliteDb {.  s
0790: 71 6c 69 74 65 20 2a 64 62 3b 20 20 20 20 20 20  qlite *db;      
07a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61       /* The "rea
07b0: 6c 22 20 64 61 74 61 62 61 73 65 20 73 74 72 75  l" database stru
07c0: 63 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 49  cture */.  Tcl_I
07d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20  nterp *interp;  
07e0: 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65   /* The interpre
07f0: 74 65 72 20 75 73 65 64 20 66 6f 72 20 74 68 69  ter used for thi
0800: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
0810: 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20  char *zBusy;    
0820: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 75 73        /* The bus
0830: 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  y callback routi
0840: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ne */.  char *zC
0850: 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 2f 2a  ommit;        /*
0860: 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   The commit hook
0870: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0880: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72  e */.  char *zTr
0890: 61 63 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ace;         /* 
08a0: 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62 61  The trace callba
08b0: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
08c0: 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b  char *zProgress;
08d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f        /* The pro
08e0: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72  gress callback r
08f0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
0900: 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20 20 20   *zAuth;        
0910: 20 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69    /* The authori
0920: 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20  zation callback 
0930: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 71 6c  routine */.  Sql
0940: 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20  Func *pFunc;    
0950: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0960: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  L functions */. 
0970: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
0980: 6c 6c 61 74 65 3b 20 2f 2a 20 4c 69 73 74 20 6f  llate; /* List o
0990: 66 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  f SQL collation 
09a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
09b0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
09c0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
09d0: 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65  ode of most rece
09e0: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
09f0: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
0a00: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20  pCollateNeeded; 
0a10: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65   /* Collation ne
0a20: 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 7d  eded script */.}
0a30: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
0a40: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
0a50: 75 63 74 75 72 65 20 70 61 73 73 65 73 20 69 6e  ucture passes in
0a60: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 72 75 20 74  formation thru t
0a70: 68 65 20 73 71 6c 69 74 65 0a 2a 2a 20 6c 6f 67  he sqlite.** log
0a80: 69 63 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ic from the orig
0a90: 69 6e 61 6c 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  inal TCL command
0aa0: 20 69 6e 74 6f 20 74 68 65 20 63 61 6c 6c 62 61   into the callba
0ab0: 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74  ck routine..*/.t
0ac0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 61  ypedef struct Ca
0ad0: 6c 6c 62 61 63 6b 44 61 74 61 20 43 61 6c 6c 62  llbackData Callb
0ae0: 61 63 6b 44 61 74 61 3b 0a 73 74 72 75 63 74 20  ackData;.struct 
0af0: 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 7b 0a 20  CallbackData {. 
0b00: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0b10: 65 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  erp;       /* Th
0b20: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
0b30: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 72  r */.  char *zAr
0b40: 72 61 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ray;            
0b50: 20 2f 2a 20 54 68 65 20 61 72 72 61 79 20 69 6e   /* The array in
0b60: 74 6f 20 77 68 69 63 68 20 64 61 74 61 20 69 73  to which data is
0b70: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 63   written */.  Tc
0b80: 6c 5f 4f 62 6a 20 2a 70 43 6f 64 65 3b 20 20 20  l_Obj *pCode;   
0b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
0ba0: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 66  ode to execute f
0bb0: 6f 72 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 20  or each row */. 
0bc0: 20 69 6e 74 20 6f 6e 63 65 3b 20 20 20 20 20 20   int once;      
0bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
0be0: 74 20 66 6f 72 20 66 69 72 73 74 20 63 61 6c 6c  t for first call
0bf0: 62 61 63 6b 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  back only */.  i
0c00: 6e 74 20 74 63 6c 5f 72 63 3b 20 20 20 20 20 20  nt tcl_rc;      
0c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
0c20: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 54 43 4c  rn code from TCL
0c30: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74   script */.  int
0c40: 20 6e 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20   nColName;      
0c50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0c60: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
0c70: 68 65 20 61 7a 43 6f 6c 4e 61 6d 65 5b 5d 20 61  he azColName[] a
0c80: 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rray */.  char *
0c90: 2a 61 7a 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20  *azColName;     
0ca0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
0cb0: 6d 65 73 20 74 72 61 6e 73 6c 61 74 65 64 20 74  mes translated t
0cc0: 6f 20 55 54 46 2d 38 20 2a 2f 0a 7d 3b 0a 0a 2f  o UTF-8 */.};../
0cd0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73  *.** This is a s
0ce0: 65 63 6f 6e 64 20 61 6c 74 65 72 6e 61 74 69 76  econd alternativ
0cf0: 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 64  e callback for d
0d00: 61 74 61 62 61 73 65 20 71 75 65 72 69 65 73 2e  atabase queries.
0d10: 20 20 41 20 74 68 65 0a 2a 2a 20 66 69 72 73 74    A the.** first
0d20: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
0d30: 69 72 73 74 20 72 6f 77 20 6f 66 20 74 68 65 20  irst row of the 
0d40: 72 65 73 75 6c 74 20 69 73 20 6d 61 64 65 20 74  result is made t
0d50: 68 65 20 54 43 4c 20 72 65 73 75 6c 74 2e 0a 2a  he TCL result..*
0d60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 45  /.static int DbE
0d70: 76 61 6c 43 61 6c 6c 62 61 63 6b 33 28 0a 20 20  valCallback3(.  
0d80: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
0d90: 2c 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 73  ,      /* An ins
0da0: 74 61 6e 63 65 20 6f 66 20 43 61 6c 6c 62 61 63  tance of Callbac
0db0: 6b 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  kData */.  int n
0dc0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
0dd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
0de0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
0df0: 73 75 6c 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sult */.  char *
0e00: 2a 20 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  * azCol,        
0e10: 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 65 61 63   /* Data for eac
0e20: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  h column */.  ch
0e30: 61 72 20 2a 2a 20 61 7a 4e 20 20 20 20 20 20 20  ar ** azN       
0e40: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 66 6f 72       /* Name for
0e50: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   each column */.
0e60: 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
0e70: 2a 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49  *interp = (Tcl_I
0e80: 6e 74 65 72 70 2a 29 63 6c 69 65 6e 74 44 61 74  nterp*)clientDat
0e90: 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45  a;.  Tcl_Obj *pE
0ea0: 6c 65 6d 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  lem;.  if( azCol
0eb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
0ec0: 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
0ed0: 72 65 74 75 72 6e 20 31 3b 0a 23 69 66 64 65 66  return 1;.#ifdef
0ee0: 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e   UTF_TRANSLATION
0ef0: 5f 4e 45 45 44 45 44 0a 20 20 7b 0a 20 20 20 20  _NEEDED.  {.    
0f00: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c  Tcl_DString dCol
0f10: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
0f20: 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20  gInit(&dCol);.  
0f30: 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f    Tcl_ExternalTo
0f40: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c  UtfDString(NULL,
0f50: 20 61 7a 43 6f 6c 5b 30 5d 2c 20 2d 31 2c 20 26   azCol[0], -1, &
0f60: 64 43 6f 6c 29 3b 0a 20 20 20 20 70 45 6c 65 6d  dCol);.    pElem
0f70: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
0f80: 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56  Obj(Tcl_DStringV
0f90: 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29  alue(&dCol), -1)
0fa0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
0fb0: 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 20 20  gFree(&dCol);.  
0fc0: 7d 0a 23 65 6c 73 65 0a 20 20 70 45 6c 65 6d 20  }.#else.  pElem 
0fd0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
0fe0: 62 6a 28 61 7a 43 6f 6c 5b 30 5d 2c 20 2d 31 29  bj(azCol[0], -1)
0ff0: 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 53  ;.#endif.  Tcl_S
1000: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1010: 72 70 2c 20 70 45 6c 65 6d 29 3b 0a 20 20 72 65  rp, pElem);.  re
1020: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
1030: 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
1040: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65   command is dele
1050: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
1060: 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28  oid DbDeleteCmd(
1070: 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c  void *db){.  Sql
1080: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
1090: 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 73 71  liteDb*)db;.  sq
10a0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d  lite3_close(pDb-
10b0: 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  >db);.  while( p
10c0: 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20  Db->pFunc ){.   
10d0: 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20   SqlFunc *pFunc 
10e0: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
10f0: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
1100: 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Func->pNext;.   
1110: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1120: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
1130: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
1140: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
1150: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
1160: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
1170: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
1180: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
1190: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
11a0: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
11b0: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
11c0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
11d0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
11e0: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
11f0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
1200: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
1210: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
1220: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
1230: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
1240: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d  pDb->zAuth);.  }
1250: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
1260: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
1270: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1280: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
1290: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
12a0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
12b0: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
12c0: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
12d0: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
12e0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e  ler(void *cd, in
12f0: 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c  t nTries){.  Sql
1300: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
1310: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
1320: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61  t rc;.  char zVa
1330: 6c 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a  l[30];.  char *z
1340: 43 6d 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  Cmd;.  Tcl_DStri
1350: 6e 67 20 63 6d 64 3b 0a 0a 20 20 54 63 6c 5f 44  ng cmd;..  Tcl_D
1360: 53 74 72 69 6e 67 49 6e 69 74 28 26 63 6d 64 29  StringInit(&cmd)
1370: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
1380: 70 70 65 6e 64 28 26 63 6d 64 2c 20 70 44 62 2d  ppend(&cmd, pDb-
1390: 3e 7a 42 75 73 79 2c 20 2d 31 29 3b 0a 20 20 73  >zBusy, -1);.  s
13a0: 70 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64  printf(zVal, "%d
13b0: 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 54 63  ", nTries);.  Tc
13c0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
13d0: 6c 65 6d 65 6e 74 28 26 63 6d 64 2c 20 7a 56 61  lement(&cmd, zVa
13e0: 6c 29 3b 0a 20 20 7a 43 6d 64 20 3d 20 54 63 6c  l);.  zCmd = Tcl
13f0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 63  _DStringValue(&c
1400: 6d 64 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f  md);.  rc = Tcl_
1410: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
1420: 2c 20 7a 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 44  , zCmd);.  Tcl_D
1430: 53 74 72 69 6e 67 46 72 65 65 28 26 63 6d 64 29  StringFree(&cmd)
1440: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
1450: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
1460: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
1470: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
1480: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1490: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
14a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14b0: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
14c0: 73 20 74 68 65 20 27 70 72 6f 67 72 65 73 73 20  s the 'progress 
14d0: 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68  callback' for th
14e0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
14f0: 74 61 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67  tatic int DbProg
1500: 72 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64  ressHandler(void
1510: 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44   *cd){.  SqliteD
1520: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
1530: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
1540: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ;..  assert( pDb
1550: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20  ->zProgress );. 
1560: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
1570: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
1580: 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69  >zProgress);.  i
1590: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
15a0: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
15b0: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
15c0: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
15d0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
15e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
15f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1600: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1610: 53 51 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e  SQLite trace han
1620: 64 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20  dler whenever a 
1630: 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20  new.** block of 
1640: 53 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e  SQL is executed.
1650: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
1660: 20 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20   in pDb->zTrace 
1670: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a  is executed..*/.
1680: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 54 72  static void DbTr
1690: 61 63 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  aceHandler(void 
16a0: 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *cd, const char 
16b0: 2a 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65  *zSql){.  Sqlite
16c0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
16d0: 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44  eDb*)cd;.  Tcl_D
16e0: 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54  String str;..  T
16f0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
1700: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
1710: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
1720: 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29  pDb->zTrace, -1)
1730: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
1740: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
1750: 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f  r, zSql);.  Tcl_
1760: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
1770: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
1780: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
1790: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
17a0: 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  r);.  Tcl_ResetR
17b0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
17c0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  p);.}../*.** Thi
17d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
17e0: 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
17f0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
1800: 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c  ted.  The.** TCL
1810: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
1820: 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75  zCommit is execu
1830: 74 65 64 2e 20 20 49 66 20 69 74 20 72 65 74 75  ted.  If it retu
1840: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a  rns non-zero or.
1850: 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73 20  ** if it throws 
1860: 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68  an exception, th
1870: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1880: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73   rolled back ins
1890: 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67  tead.** of being
18a0: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73   committed..*/.s
18b0: 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d  tatic int DbComm
18c0: 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  itHandler(void *
18d0: 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  cd){.  SqliteDb 
18e0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
18f0: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
1900: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  .  rc = Tcl_Eval
1910: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
1920: 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  b->zCommit);.  i
1930: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
1940: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
1950: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
1960: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
1970: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
1980: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
1990: 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61  ic void tclColla
19a0: 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  teNeeded(.  void
19b0: 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65   *pCtx,.  sqlite
19c0: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c   *db,.  int enc,
19d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19e0: 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65  Name.){.  Sqlite
19f0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
1a00: 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  eDb *)pCtx;.  Tc
1a10: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d  l_Obj *pScript =
1a20: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1a30: 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  j(pDb->pCollateN
1a40: 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e  eeded);.  Tcl_In
1a50: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
1a60: 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pt);.  Tcl_ListO
1a70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1a80: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
1a90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61  NewStringObj(zNa
1aa0: 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  me, -1));.  Tcl_
1ab0: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
1ac0: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
1ad0: 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
1ae0: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
1af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1b00: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1b10: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
1b20: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
1b30: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
1b40: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20  ed.** using TCL 
1b50: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
1b60: 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c  c int tclSqlColl
1b70: 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  ate(.  void *pCt
1b80: 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63  x,.  int nA,.  c
1b90: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
1ba0: 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74   int nB,.  const
1bb0: 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53   void *zB.){.  S
1bc0: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28  qlCollate *p = (
1bd0: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74  SqlCollate *)pCt
1be0: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  x;.  Tcl_Obj *pC
1bf0: 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63  md;..  pCmd = Tc
1c00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
1c10: 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a  ->zScript, -1);.
1c20: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1c30: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f  nt(pCmd);.  Tcl_
1c40: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1c50: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
1c60: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
1c70: 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b  ingObj(zA, nA));
1c80: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
1c90: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
1ca0: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c  nterp, pCmd, Tcl
1cb0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42  _NewStringObj(zB
1cc0: 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , nB));.  Tcl_Ev
1cd0: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
1ce0: 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 54  p, pCmd, 0);.  T
1cf0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1d00: 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCmd);.  return 
1d10: 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72  (atoi(Tcl_GetStr
1d20: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
1d30: 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erp)));.}../*.**
1d40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1d50: 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75   called to evalu
1d60: 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  ate an SQL funct
1d70: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  ion implemented.
1d80: 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72  ** using TCL scr
1d90: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ipt..*/.static v
1da0: 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73  oid tclSqlFunc(s
1db0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1dc0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
1dd0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
1de0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46   **argv){.  SqlF
1df0: 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  unc *p = sqlite3
1e00: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
1e10: 78 74 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  xt);.  Tcl_DStri
1e20: 6e 67 20 63 6d 64 3b 0a 20 20 69 6e 74 20 69 3b  ng cmd;.  int i;
1e30: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 63  .  int rc;..  Tc
1e40: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 63  l_DStringInit(&c
1e50: 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  md);.  Tcl_DStri
1e60: 6e 67 41 70 70 65 6e 64 28 26 63 6d 64 2c 20 70  ngAppend(&cmd, p
1e70: 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a  ->zScript, -1);.
1e80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
1e90: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
1ea0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71   SQLITE_NULL==sq
1eb0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1ec0: 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20  (argv[i]) ){.   
1ed0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
1ee0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64  pendElement(&cmd
1ef0: 2c 20 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , "");.    }else
1f00: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72  {.      Tcl_DStr
1f10: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
1f20: 28 26 63 6d 64 2c 20 73 71 6c 69 74 65 33 5f 76  (&cmd, sqlite3_v
1f30: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
1f40: 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ]));.    }.  }. 
1f50: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
1f60: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
1f70: 74 72 69 6e 67 56 61 6c 75 65 28 26 63 6d 64 29  tringValue(&cmd)
1f80: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1f90: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1fa0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
1fb0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
1fc0: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
1fd0: 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a   -1); .  }else{.
1fe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1ff0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
2000: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
2010: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
2020: 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 53 51   -1, .        SQ
2030: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
2040: 0a 20 20 7d 0a 7d 0a 23 69 66 6e 64 65 66 20 53  .  }.}.#ifndef S
2050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
2060: 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54  RIZATION./*.** T
2070: 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68 65  his is the authe
2080: 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  ntication functi
2090: 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20  on.  It appends 
20a0: 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  the authenticati
20b0: 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20  on.** type code 
20c0: 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67 75  and the two argu
20d0: 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20  ments to zCmd[] 
20e0: 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  then invokes the
20f0: 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68   result.** on th
2100: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20  e interpreter.  
2110: 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78 61  The reply is exa
2120: 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69  mined to determi
2130: 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74  ne if the.** aut
2140: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c  hentication fail
2150: 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a  s or succeeds..*
2160: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
2170: 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f  h_callback(.  vo
2180: 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20  id *pArg,.  int 
2190: 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  code,.  const ch
21a0: 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e  ar *zArg1,.  con
21b0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a  st char *zArg2,.
21c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
21d0: 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg3,.  const cha
21e0: 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68  r *zArg4.){.  ch
21f0: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
2200: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
2210: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
2220: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
2230: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
2240: 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b  (SqliteDb*)pArg;
2250: 0a 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64 65  ..  switch( code
2260: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
2270: 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20  ITE_COPY        
2280: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
2290: 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65  QLITE_COPY"; bre
22a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
22b0: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
22c0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
22d0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
22e0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
22f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
2300: 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20  TE_TABLE      : 
2310: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
2320: 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65  EATE_TABLE"; bre
2330: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2340: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
2350: 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53  INDEX : zCode="S
2360: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
2370: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
2380: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2390: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
23a0: 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  LE : zCode="SQLI
23b0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
23c0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
23d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
23e0: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
23f0: 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45  R: zCode="SQLITE
2400: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
2410: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
2420: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
2430: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20  EATE_TEMP_VIEW  
2440: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
2450: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
2460: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
2470: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
2480: 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43  _TRIGGER    : zC
2490: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
24a0: 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  TE_TRIGGER"; bre
24b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
24c0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20  ITE_CREATE_VIEW 
24d0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
24e0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
24f0: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
2500: 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  ase SQLITE_DELET
2510: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
2520: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c  Code="SQLITE_DEL
2530: 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ETE"; break;.   
2540: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
2550: 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a  P_INDEX        :
2560: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
2570: 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  ROP_INDEX"; brea
2580: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2590: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20  TE_DROP_TABLE   
25a0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
25b0: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22  LITE_DROP_TABLE"
25c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
25d0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
25e0: 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f  MP_INDEX   : zCo
25f0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
2600: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
2610: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2620: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
2630: 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  BLE   : zCode="S
2640: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
2650: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
2660: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
2670: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
2680: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
2690: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  _DROP_TEMP_TRIGG
26a0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
26b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
26c0: 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20  _TEMP_VIEW    : 
26d0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
26e0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  OP_TEMP_VIEW"; b
26f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2700: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
2710: 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  ER      : zCode=
2720: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49  "SQLITE_DROP_TRI
2730: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
2740: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
2750: 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20 20 20  OP_VIEW         
2760: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
2770: 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61  DROP_VIEW"; brea
2780: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2790: 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20  TE_INSERT       
27a0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
27b0: 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72  LITE_INSERT"; br
27c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
27d0: 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20  LITE_PRAGMA     
27e0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
27f0: 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20  SQLITE_PRAGMA"; 
2800: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2810: 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20  SQLITE_READ     
2820: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
2830: 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20  ="SQLITE_READ"; 
2840: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2850: 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20  SQLITE_SELECT   
2860: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
2870: 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22  ="SQLITE_SELECT"
2880: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
2890: 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  e SQLITE_TRANSAC
28a0: 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f  TION       : zCo
28b0: 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53  de="SQLITE_TRANS
28c0: 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a  ACTION"; break;.
28d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
28e0: 55 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20  UPDATE          
28f0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
2900: 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b  E_UPDATE"; break
2910: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2920: 45 5f 41 54 54 41 43 48 20 20 20 20 20 20 20 20  E_ATTACH        
2930: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
2940: 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65  ITE_ATTACH"; bre
2950: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2960: 49 54 45 5f 44 45 54 41 43 48 20 20 20 20 20 20  ITE_DETACH      
2970: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
2980: 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62  QLITE_DETACH"; b
2990: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
29a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
29b0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
29c0: 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20  "????"; break;. 
29d0: 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67   }.  Tcl_DString
29e0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
29f0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
2a00: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68  &str, pDb->zAuth
2a10: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
2a20: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
2a30: 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a  t(&str, zCode);.
2a40: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
2a50: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
2a60: 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a   zArg1 ? zArg1 :
2a70: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
2a80: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
2a90: 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a  (&str, zArg2 ? z
2aa0: 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg2 : "");.  Tc
2ab0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
2ac0: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
2ad0: 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29  g3 ? zArg3 : "")
2ae0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
2af0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
2b00: 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34  r, zArg4 ? zArg4
2b10: 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54   : "");.  rc = T
2b20: 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44  cl_GlobalEval(pD
2b30: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
2b40: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
2b50: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
2b60: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a  gFree(&str);.  z
2b70: 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53  Reply = Tcl_GetS
2b80: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
2b90: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  >interp);.  if( 
2ba0: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
2bb0: 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b  QLITE_OK")==0 ){
2bc0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2bd0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2be0: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
2bf0: 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30  SQLITE_DENY")==0
2c00: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2c10: 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73  ITE_DENY;.  }els
2c20: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
2c30: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f  ply,"SQLITE_IGNO
2c40: 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  RE")==0 ){.    r
2c50: 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  c = SQLITE_IGNOR
2c60: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
2c70: 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20  rc = 999;.  }.  
2c80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
2c90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2ca0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
2cb0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74   */../*.** zText
2cc0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2cd0: 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76   text obtained v
2ce0: 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65  ia an sqlite3_re
2cf0: 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f  sult_text().** o
2d00: 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66  r similar interf
2d10: 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ace. This routin
2d20: 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20  e returns a Tcl 
2d30: 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a  string object, .
2d40: 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ** reference cou
2d50: 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e  nt set to 0, con
2d60: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74  taining the text
2d70: 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69  . If a translati
2d80: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73  on.** between is
2d90: 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20  o8859 and UTF-8 
2da0: 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20  is required, it 
2db0: 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f  is preformed..*/
2dc0: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
2dd0: 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61  *dbTextToObj(cha
2de0: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b  r const *zText){
2df0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c  .  Tcl_Obj *pVal
2e00: 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41  ;.#ifdef UTF_TRA
2e10: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a  NSLATION_NEEDED.
2e20: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43    Tcl_DString dC
2e30: 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ol;.  Tcl_DStrin
2e40: 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20  gInit(&dCol);.  
2e50: 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74  Tcl_ExternalToUt
2e60: 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a  fDString(NULL, z
2e70: 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29  Text, -1, &dCol)
2e80: 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e  ;.  pVal = Tcl_N
2e90: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
2ea0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43  DStringValue(&dC
2eb0: 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ol), -1);.  Tcl_
2ec0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f  DStringFree(&dCo
2ed0: 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c  l);.#else.  pVal
2ee0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
2ef0: 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a  Obj(zText, -1);.
2f00: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2f10: 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pVal;.}../*.** T
2f20: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
2f30: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
2f40: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
2f50: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
2f60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
2f70: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
2f80: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
2f90: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
2fa0: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
2fb0: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
2fc0: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
2fd0: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
2fe0: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
2ff0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
3000: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
3010: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
3020: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
3030: 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61   db1  "my_databa
3040: 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31  se".**       db1
3050: 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65   close.**.** The
3060: 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f   first command o
3070: 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f  pens a connectio
3080: 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74  n to the "my_dat
3090: 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65 0a  abase" database.
30a0: 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61  ** and calls tha
30b0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62  t connection "db
30c0: 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  1".  The second 
30d0: 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74  command causes t
30e0: 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  his.** subroutin
30f0: 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e  e to be invoked.
3100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
3110: 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64  bObjCmd(void *cd
3120: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
3130: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54  terp, int objc,T
3140: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
3150: 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  jv){.  SqliteDb 
3160: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3170: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69  *)cd;.  int choi
3180: 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54  ce;.  int rc = T
3190: 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20  CL_OK;.  static 
31a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73  const char *DB_s
31b0: 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61  trs[] = {.    "a
31c0: 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20  uthorizer",     
31d0: 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 20 20      "busy",     
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
31f0: 68 61 6e 67 65 73 22 2c 0a 20 20 20 20 22 63 6c  hanges",.    "cl
3200: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
3210: 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22     "commit_hook"
3220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ,            "co
3230: 6d 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 65 72  mplete",.    "er
3240: 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20  rorcode",       
3250: 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20     "eval",      
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 75               "fu
3270: 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 6c 61  nction",.    "la
3280: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22  st_insert_rowid"
3290: 2c 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a  ,  "onecolumn",.
32a0: 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c 20      "progress", 
32b0: 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65 79            "rekey
32c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
32d0: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 0a 20      "timeout",. 
32e0: 20 20 20 22 74 72 61 63 65 22 2c 20 20 20 20 20     "trace",     
32f0: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74           "collat
3300: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
3310: 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65     "collation_ne
3320: 65 64 65 64 22 2c 0a 20 20 20 20 22 74 6f 74 61  eded",.    "tota
3330: 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  l_changes",     
3340: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
3350: 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e        .  };.  en
3360: 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20  um DB_enum {.   
3370: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20   DB_AUTHORIZER, 
3380: 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 20         DB_BUSY, 
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 0a 20 20    DB_CHANGES,.  
33b0: 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20    DB_CLOSE,     
33c0: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4d 4d 49          DB_COMMI
33d0: 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20 20 20  T_HOOK,         
33e0: 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a     DB_COMPLETE,.
33f0: 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45      DB_ERRORCODE
3400: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45 56 41  ,         DB_EVA
3410: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L,              
3420: 20 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e       DB_FUNCTION
3430: 2c 0a 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e  ,.    DB_LAST_IN
3440: 53 45 52 54 5f 52 4f 57 49 44 2c 20 44 42 5f 4f  SERT_ROWID, DB_O
3450: 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20  NECOLUMN,       
3460: 20 0a 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53   .    DB_PROGRES
3470: 53 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 52  S,          DB_R
3480: 45 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20  EKEY,           
3490: 20 20 20 20 20 20 20 44 42 5f 54 49 4d 45 4f 55         DB_TIMEOU
34a0: 54 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45 2c  T,.    DB_TRACE,
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
34c0: 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20  COLLATE,        
34d0: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41          DB_COLLA
34e0: 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 0a 20 20 20  TION_NEEDED,.   
34f0: 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
3500: 53 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62  S.  };..  if( ob
3510: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
3520: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
3530: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
3540: 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b  UBCOMMAND ...");
3550: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3560: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
3570: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
3580: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
3590: 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22  v[1], DB_strs, "
35a0: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f  option", 0, &cho
35b0: 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ice) ){.    retu
35c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
35d0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e  }..  switch( (en
35e0: 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63  um DB_enum)choic
35f0: 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64  e ){..  /*    $d
3600: 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41  b authorizer ?CA
3610: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
3620: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
3630: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  en callback to a
3640: 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51  uthorize each SQ
3650: 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69  L operation as i
3660: 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c  t is.  ** compil
3670: 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73  ed.  5 arguments
3680: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
3690: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65   the callback be
36a0: 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  fore it is.  ** 
36b0: 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20  invoked:.  **.  
36c0: 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74  **   (1) The aut
36d0: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20  horization type 
36e0: 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41  (ex: SQLITE_CREA
36f0: 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45  TE_TABLE, SQLITE
3700: 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20  _INSERT, ...).  
3710: 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64  **   (2) First d
3720: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20  escriptive name 
3730: 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68  (depends on auth
3740: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a  orization type).
3750: 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e    **   (3) Secon
3760: 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  d descriptive na
3770: 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61  me.  **   (4) Na
3780: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3790: 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20  se (ex: "main", 
37a0: 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28  "temp").  **   (
37b0: 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  5) Name of trigg
37c0: 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67  er that is doing
37d0: 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a   the access.  **
37e0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  .  ** The callba
37f0: 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ck should return
3800: 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f   on of the follo
3810: 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51  wing strings: SQ
3820: 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51  LITE_OK,.  ** SQ
3830: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20  LITE_IGNORE, or 
3840: 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e  SQLITE_DENY.  An
3850: 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
3860: 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72  alue is an error
3870: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
3880: 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e  his method is in
3890: 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72  voked with no ar
38a0: 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72  guments, the cur
38b0: 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69  rent authorizati
38c0: 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  on.  ** callback
38d0: 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
38e0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
38f0: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20   DB_AUTHORIZER: 
3900: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
3910: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
3920: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
3930: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
3940: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 7d  LLBACK?");.    }
3950: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
3960: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
3970: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
3980: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3990: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
39a0: 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20 20  ->zAuth, 0);.   
39b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
39c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74        char *zAut
39d0: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  h;.      int len
39e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
39f0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
3a00: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3a10: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zAuth);.      }.
3a20: 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63        zAuth = Tc
3a30: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3a40: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
3a50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  );.      if( zAu
3a60: 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  th && len>0 ){. 
3a70: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74         pDb->zAut
3a80: 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  h = Tcl_Alloc( l
3a90: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
3aa0: 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 41    strcpy(pDb->zA
3ab0: 75 74 68 2c 20 7a 41 75 74 68 29 3b 0a 20 20 20  uth, zAuth);.   
3ac0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3ad0: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30    pDb->zAuth = 0
3ae0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
3af0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
3b00: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
3b10: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
3b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
3b30: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
3b40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3b50: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
3b60: 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63  (pDb->db, auth_c
3b70: 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20  allback, pDb);. 
3b80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3b90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
3ba0: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
3bb0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
3bc0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
3bd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
3be0: 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79    /*    $db busy
3bf0: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
3c00: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
3c10: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
3c20: 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  if an SQL statem
3c30: 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ent attempts to 
3c40: 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  open.  ** a lock
3c50: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
3c60: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
3c70: 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28  _BUSY: {.    if(
3c80: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
3c90: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
3ca0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
3cb0: 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a  v, "CALLBACK");.
3cc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
3cd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
3ce0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
3cf0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
3d00: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
3d10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3d20: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
3d30: 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  Busy, 0);.      
3d40: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
3d50: 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a     char *zBusy;.
3d60: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
3d70: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
3d80: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
3d90: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
3da0: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
3db0: 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47     zBusy = Tcl_G
3dc0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
3dd0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
3de0: 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20        if( zBusy 
3df0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
3e00: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
3e10: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
3e20: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
3e30: 74 72 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79  trcpy(pDb->zBusy
3e40: 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20  , zBusy);.      
3e50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
3e60: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20  Db->zBusy = 0;. 
3e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3e80: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
3e90: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
3ea0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
3eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
3ec0: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
3ed0: 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  b, DbBusyHandler
3ee0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
3ef0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3f00: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
3f10: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
3f20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3f30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
3f40: 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67    /*    $db prog
3f50: 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b  ress ?N CALLBACK
3f60: 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76  ?.  ** .  ** Inv
3f70: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
3f80: 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76  llback every N v
3f90: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f  irtual machine o
3fa0: 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65  pcodes while exe
3fb0: 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72  cuting.  ** quer
3fc0: 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ies..  */.  case
3fd0: 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a   DB_PROGRESS: {.
3fe0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20      if( objc==2 
3ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
4000: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->zProgress ){. 
4010: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
4020: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4030: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20  pDb->zProgress, 
4040: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
4050: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
4060: 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  4 ){.      char 
4070: 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20  *zProgress;.    
4080: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
4090: 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66   int N;.      if
40a0: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
40b0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
40c0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29  rp, objv[2], &N)
40d0: 20 29 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f   ){..return TCL_
40e0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a  ERROR;.      };.
40f0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
4100: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
4110: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
4120: 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->zProgress);.  
4130: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
4140: 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53  gress = Tcl_GetS
4150: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
4160: 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[3], &len);.   
4170: 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73     if( zProgress
4180: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
4190: 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
41a0: 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ess = Tcl_Alloc(
41b0: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
41c0: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
41d0: 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67  zProgress, zProg
41e0: 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ress);.      }el
41f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
4200: 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >zProgress = 0;.
4210: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
4220: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
4230: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20  RESS_CALLBACK.  
4240: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
4250: 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
4260: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
4270: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
4280: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
4290: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
42a0: 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48  , N, DbProgressH
42b0: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
42c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
42d0: 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72     sqlite3_progr
42e0: 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  ess_handler(pDb-
42f0: 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  >db, 0, 0, 0);. 
4300: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
4310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
4320: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
4330: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
4340: 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a   "N CALLBACK");.
4350: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
4360: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
4370: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4380: 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e 67  /*     $db chang
4390: 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
43a0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
43b0: 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
43c0: 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
43d0: 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
43e0: 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74  by.  ** the most
43f0: 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20   recent INSERT, 
4400: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
4410: 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20   statement, not 
4420: 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20  including .  ** 
4430: 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
4440: 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67   by trigger prog
4450: 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  rams..  */.  cas
4460: 65 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a  e DB_CHANGES: {.
4470: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
4480: 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  sult;.    if( ob
4490: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
44a0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
44b0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
44c0: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
44d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
44e0: 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20    }.    pResult 
44f0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
4500: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
4510: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
4520: 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63  esult, sqlite3_c
4530: 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29  hanges(pDb->db))
4540: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
4550: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c  ..  /*    $db cl
4560: 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68  ose.  **.  ** Sh
4570: 75 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62  utdown the datab
4580: 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ase.  */.  case 
4590: 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20  DB_CLOSE: {.    
45a0: 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e  Tcl_DeleteComman
45b0: 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  d(interp, Tcl_Ge
45c0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
45d0: 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20  bjv[0], 0));.   
45e0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
45f0: 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f  *    $db commit_
4600: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  hook ?CALLBACK?.
4610: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
4620: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
4630: 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ack just before 
4640: 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79  committing every
4650: 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   SQL transaction
4660: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
4670: 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e  llback throws an
4680: 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65   exception or re
4690: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
46a0: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72  then the.  ** tr
46b0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f  ansaction is abo
46c0: 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41  rted.  If CALLBA
46d0: 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  CK is an empty s
46e0: 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62  tring, the callb
46f0: 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ack.  ** is disa
4700: 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  bled..  */.  cas
4710: 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b  e DB_COMMIT_HOOK
4720: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
4730: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
4740: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
4750: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
4760: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
4770: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
4780: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
4790: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
47a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
47b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
47c0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30   pDb->zCommit, 0
47d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
47e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
47f0: 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20   *zCommit;.     
4800: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
4810: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
4820: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
4830: 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  Free(pDb->zCommi
4840: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
4850: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f    zCommit = Tcl_
4860: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
4870: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
4880: 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  .      if( zComm
4890: 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  it && len>0 ){. 
48a0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
48b0: 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  mit = Tcl_Alloc(
48c0: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
48d0: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
48e0: 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74  zCommit, zCommit
48f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4900: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
4910: 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
4920: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
4930: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
4940: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
4950: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
4960: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74    sqlite3_commit
4970: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44  _hook(pDb->db, D
4980: 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20  bCommitHandler, 
4990: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
49a0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
49b0: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
49c0: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
49d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
49e0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
49f0: 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74  *    $db complet
4a00: 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e SQL.  **.  ** 
4a10: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53  Return TRUE if S
4a20: 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  QL is a complete
4a30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
4a40: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
4a50: 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  .  ** additional
4a60: 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20   lines of input 
4a70: 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69  are needed.  Thi
4a80: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
4a90: 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69  the.  ** built-i
4aa0: 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65  n "info complete
4ab0: 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c  " command of Tcl
4ac0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
4ad0: 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 20 20 20  _COMPLETE: {.   
4ae0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
4af0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d  t;.    int isCom
4b00: 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f  plete;.    if( o
4b10: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
4b20: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
4b30: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
4b40: 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
4b50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4b60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f  ;.    }.    isCo
4b70: 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33  mplete = sqlite3
4b80: 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47  _complete( Tcl_G
4b90: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
4ba0: 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20  objv[2], 0) );. 
4bb0: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
4bc0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
4bd0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
4be0: 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65  etBooleanObj(pRe
4bf0: 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65  sult, isComplete
4c00: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4c10: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
4c20: 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20  $db errorcode.  
4c30: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4c40: 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72  he numeric error
4c50: 20 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72   code that was r
4c60: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d  eturned by the m
4c70: 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20  ost recent.  ** 
4c80: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
4c90: 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63  exec()..  */.  c
4ca0: 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45  ase DB_ERRORCODE
4cb0: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  : {.    Tcl_SetO
4cc0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
4cd0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
4ce0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
4cf0: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62  Db->db)));.    b
4d00: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  reak;.  }.   .  
4d10: 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
4d20: 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 20  val $sql ?array 
4d30: 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f  {  ...code... }?
4d40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53  .  **.  ** The S
4d50: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
4d60: 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65  $sql is evaluate
4d70: 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77  d.  For each row
4d80: 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  , the values are
4d90: 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20  .  ** placed in 
4da0: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
4db0: 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72  array named "arr
4dc0: 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e  ay" and ...code.
4dd0: 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  .. is executed..
4de0: 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20    ** If "array" 
4df0: 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f  and "code" are o
4e00: 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20  mitted, then no 
4e10: 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72  callback is ever
4e20: 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20  y invoked..  ** 
4e30: 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e  If "array" is an
4e40: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
4e50: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61  hen the values a
4e60: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72  re placed in var
4e70: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74  iables.  ** that
4e80: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
4e90: 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64  ame as the field
4ea0: 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74  s extracted by t
4eb0: 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
4ec0: 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b   case DB_EVAL: {
4ed0: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
4ee0: 2a 7a 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20  *zSql;.    char 
4ef0: 63 6f 6e 73 74 20 2a 7a 4c 65 66 74 3b 0a 20 20  const *zLeft;.  
4f00: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4f10: 70 53 74 6d 74 3b 0a 0a 20 20 20 20 54 63 6c 5f  pStmt;..    Tcl_
4f20: 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
4f30: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63  NewObj();.    Tc
4f40: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
4f50: 52 65 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 6f  Ret);..    if( o
4f60: 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
4f70: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
4f80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
4f90: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
4fa0: 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 20 43 4f  L ?ARRAY-NAME CO
4fb0: 44 45 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  DE?");.      ret
4fc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4fd0: 20 20 20 7d 0a 0a 20 20 20 20 7a 53 71 6c 20 3d     }..    zSql =
4fe0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
4ff0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
5000: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 53  );.    while( zS
5010: 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69  ql[0] ){.      i
5020: 6e 74 20 69 3b 0a 20 20 0a 20 20 20 20 20 20 69  nt i;.  .      i
5030: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
5040: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
5050: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
5060: 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29   &pStmt, &zLeft)
5070: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5080: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
5090: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
50a0: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
50b0: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
50c0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
50d0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  OR;.        brea
50e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  k;.      }.  .  
50f0: 20 20 20 20 69 66 28 20 70 53 74 6d 74 20 26 26      if( pStmt &&
5100: 20 6f 62 6a 63 3d 3d 35 20 29 7b 0a 20 20 20 20   objc==5 ){.    
5110: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f      Tcl_Obj *pCo
5120: 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  lList = Tcl_NewO
5130: 62 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63  bj();.        Tc
5140: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
5150: 43 6f 6c 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20  ColList);..     
5160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 71     for(i=0; i<sq
5170: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
5180: 6e 74 28 70 53 74 6d 74 29 3b 20 69 2b 2b 29 7b  nt(pStmt); i++){
5190: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  .          Tcl_L
51a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
51b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
51c0: 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  List,.          
51d0: 20 20 20 20 64 62 54 65 78 74 54 6f 4f 62 6a 28      dbTextToObj(
51e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
51f0: 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 29 0a 20  ame(pStmt, i)). 
5200: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
5210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63      }.        Tc
5220: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
5230: 65 72 70 2c 6f 62 6a 76 5b 33 5d 2c 54 63 6c 5f  erp,objv[3],Tcl_
5240: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22  NewStringObj("*"
5250: 2c 2d 31 29 2c 70 43 6f 6c 4c 69 73 74 2c 30 29  ,-1),pColList,0)
5260: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
5270: 20 77 68 69 6c 65 28 20 70 53 74 6d 74 20 26 26   while( pStmt &&
5280: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
5290: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
52a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
52b0: 69 3d 30 3b 20 69 3c 73 71 6c 69 74 65 33 5f 63  i=0; i<sqlite3_c
52c0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
52d0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t); i++){.      
52e0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
52f0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  l;.          .  
5300: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70          /* Set p
5310: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
5320: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
5330: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
5340: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c           if( SQL
5350: 49 54 45 5f 42 4c 4f 42 21 3d 73 71 6c 69 74 65  ITE_BLOB!=sqlite
5360: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
5370: 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  tmt, i) ){.     
5380: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62         pVal = db
5390: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
53a0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
53b0: 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20  tmt, i));.      
53c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
53d0: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
53e0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
53f0: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
5400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
5410: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  Val = Tcl_NewByt
5420: 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65  eArrayObj(sqlite
5430: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
5440: 74 6d 74 2c 20 69 29 2c 20 62 79 74 65 73 29 3b  tmt, i), bytes);
5450: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
5460: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 62            if( ob
5470: 6a 63 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  jc==5 ){.       
5480: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e       Tcl_Obj *pN
5490: 61 6d 65 20 3d 20 64 62 54 65 78 74 54 6f 4f 62  ame = dbTextToOb
54a0: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
54b0: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 29  _name(pStmt, i))
54c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  ;.            Tc
54d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
54e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
54f0: 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 22     if( !strcmp("
5500: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
5510: 28 6f 62 6a 76 5b 33 5d 29 29 20 29 7b 0a 20 20  (objv[3])) ){.  
5520: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
5530: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
5540: 70 2c 20 70 4e 61 6d 65 2c 20 30 2c 20 70 56 61  p, pName, 0, pVa
5550: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
5560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5570: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53          Tcl_ObjS
5580: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
5590: 62 6a 76 5b 33 5d 2c 20 70 4e 61 6d 65 2c 20 70  bjv[3], pName, p
55a0: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Val, 0);.       
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
55c0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
55d0: 75 6e 74 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  unt(pName);.    
55e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
55f0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
5600: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5610: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
5620: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pVal);.         
5630: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a   }.        }.  .
5640: 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63          if( objc
5650: 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==5 ){.         
5660: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
5670: 6a 45 78 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  jEx(interp, objv
5680: 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  [4], 0);.       
5690: 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45     if( rc!=TCL_E
56a0: 52 52 4f 52 20 29 20 72 63 20 3d 20 54 43 4c 5f  RROR ) rc = TCL_
56b0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
56c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 0a 20 20      }.       .  
56d0: 20 20 20 20 69 66 28 20 70 53 74 6d 74 20 26 26      if( pStmt &&
56e0: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d   SQLITE_SCHEMA==
56f0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
5700: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
5710: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
5720: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66     }.  .      if
5730: 28 20 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54  ( pStmt && SQLIT
5740: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
5750: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29  rcode(pDb->db) )
5760: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
5770: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
5780: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
5790: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
57a0: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
57b0: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
57c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
57d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
57e0: 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  zSql = zLeft;.  
57f0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
5800: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
5810: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
5820: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
5830: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
5840: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ecrRefCount(pRet
5850: 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  );..    break;. 
5860: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
5870: 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e    $db function N
5880: 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  AME SCRIPT.  **.
5890: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
58a0: 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63  w SQL function c
58b0: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
58c0: 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74  never that funct
58d0: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c  ion is.  ** call
58e0: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
58f0: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
5900: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
5910: 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54  .  case DB_FUNCT
5920: 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75  ION: {.    SqlFu
5930: 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 63  nc *pFunc;.    c
5940: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
5950: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20  char *zScript;. 
5960: 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a     int nScript;.
5970: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
5980: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
5990: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
59a0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45  , 2, objv, "NAME
59b0: 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
59c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
59d0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  R;.    }.    zNa
59e0: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
59f0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
5a00: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69  ], 0);.    zScri
5a10: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
5a20: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
5a30: 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20  ], &nScript);.  
5a40: 20 20 70 46 75 6e 63 20 3d 20 28 53 71 6c 46 75    pFunc = (SqlFu
5a50: 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  nc*)Tcl_Alloc( s
5a60: 69 7a 65 6f 66 28 2a 70 46 75 6e 63 29 20 2b 20  izeof(*pFunc) + 
5a70: 6e 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20  nScript + 1 );. 
5a80: 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20     if( pFunc==0 
5a90: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
5aa0: 4f 52 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 69  OR;.    pFunc->i
5ab0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
5ac0: 20 20 20 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74      pFunc->pNext
5ad0: 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20   = pDb->pFunc;. 
5ae0: 20 20 20 70 46 75 6e 63 2d 3e 7a 53 63 72 69 70     pFunc->zScrip
5af0: 74 20 3d 20 28 63 68 61 72 2a 29 26 70 46 75 6e  t = (char*)&pFun
5b00: 63 5b 31 5d 3b 0a 20 20 20 20 73 74 72 63 70 79  c[1];.    strcpy
5b10: 28 70 46 75 6e 63 2d 3e 7a 53 63 72 69 70 74 2c  (pFunc->zScript,
5b20: 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 73   zScript);.    s
5b30: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
5b40: 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  nction(pDb->db, 
5b50: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
5b60: 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
5b70: 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e  pFunc, tclSqlFun
5b80: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 62 72  c, 0, 0);.    br
5b90: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
5ba0: 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74   **     $db last
5bb0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20  _insert_rowid . 
5bc0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
5bd0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
5be0: 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f   is the ROWID fo
5bf0: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
5c00: 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20  t insert..  */. 
5c10: 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e   case DB_LAST_IN
5c20: 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20  SERT_ROWID: {.  
5c30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
5c40: 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77 69  lt;.    int rowi
5c50: 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  d;.    if( objc!
5c60: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
5c70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
5c80: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
5c90: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5ca0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5cb0: 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c  .    rowid = sql
5cc0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
5cd0: 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b  _rowid(pDb->db);
5ce0: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
5cf0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
5d00: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
5d10: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
5d20: 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20  lt, rowid);.    
5d30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
5d40: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6f 6e  .  **     $db on
5d50: 65 63 6f 6c 75 6d 6e 20 53 51 4c 0a 20 20 2a 2a  ecolumn SQL.  **
5d60: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  .  ** Return a s
5d70: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 66 72 6f  ingle column fro
5d80: 6d 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  m a single row o
5d90: 66 20 74 68 65 20 67 69 76 65 6e 20 53 51 4c 20  f the given SQL 
5da0: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61  query..  */.  ca
5db0: 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a  se DB_ONECOLUMN:
5dc0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71   {.    char *zSq
5dd0: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  l;.    char *zEr
5de0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66  rMsg = 0;.    if
5df0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
5e00: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
5e10: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
5e20: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
5e30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5e40: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
5e50: 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
5e60: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
5e70: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  2], 0);.    rc =
5e80: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
5e90: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 44 62 45  b->db, zSql, DbE
5ea0: 76 61 6c 43 61 6c 6c 62 61 63 6b 33 2c 20 69 6e  valCallback3, in
5eb0: 74 65 72 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b  terp, &zErrMsg);
5ec0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5ed0: 49 54 45 5f 41 42 4f 52 54 20 29 7b 0a 20 20 20  ITE_ABORT ){.   
5ee0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
5ef0: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
5f00: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
5f10: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
5f20: 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c  interp, zErrMsg,
5f30: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
5f40: 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 4d        free(zErrM
5f50: 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
5f60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5f70: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
5f80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
5f90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5fa0: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
5fb0: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
5fc0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
5fd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
5fe0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
5ff0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65  .  **     $db re
6000: 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a  key KEY.  **.  *
6010: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63  * Change the enc
6020: 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74  ryption key on t
6030: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
6040: 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  n database..  */
6050: 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59  .  case DB_REKEY
6060: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  : {.    int nKey
6070: 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  ;.    void *pKey
6080: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
6090: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
60a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
60b0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
60c0: 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
60d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
60e0: 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63   }.    pKey = Tc
60f0: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
6100: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
6110: 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  nKey);.#ifdef SQ
6120: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
6130: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f 72     rc = sqlite_r
6140: 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b  ekey(pDb->db, pK
6150: 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69  ey, nKey);.    i
6160: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
6170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6180: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
6190: 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
61a0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
61b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ROR;.    }.#endi
61c0: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
61d0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
61e0: 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c  $db timeout MILL
61f0: 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20  ESECONDS.  **.  
6200: 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65  ** Delay for the
6210: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
6220: 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65  seconds specifie
6230: 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73  d when a file is
6240: 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20   locked..  */.  
6250: 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a  case DB_TIMEOUT:
6260: 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20   {.    int ms;. 
6270: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
6280: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
6290: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
62a0: 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49   2, objv, "MILLI
62b0: 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20  SECONDS");.     
62c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
62d0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
62e0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
62f0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
6300: 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
6310: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6320: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
6330: 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d  meout(pDb->db, m
6340: 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  s);.    break;. 
6350: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
6360: 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
6370: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
6380: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
6390: 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
63a0: 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
63b0: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
63c0: 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
63d0: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
63e0: 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
63f0: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
6400: 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
6410: 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
6420: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
6430: 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
6440: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
6450: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
6460: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
6470: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
6480: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
6490: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
64a0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
64b0: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
64c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
64d0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61  nterp, pDb->zTra
64e0: 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ce, 0);.      }.
64f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6500: 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20   char *zTrace;. 
6510: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
6520: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
6530: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
6540: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
6550: 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ace);.      }.  
6560: 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c      zTrace = Tcl
6570: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6580: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
6590: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61  ;.      if( zTra
65a0: 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ce && len>0 ){. 
65b0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
65c0: 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ce = Tcl_Alloc( 
65d0: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
65e0: 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a     strcpy(pDb->z
65f0: 54 72 61 63 65 2c 20 7a 54 72 61 63 65 29 3b 0a  Trace, zTrace);.
6600: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6610: 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
6620: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6630: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
6640: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
6650: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
6660: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
6670: 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e  ite3_trace(pDb->
6680: 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c  db, DbTraceHandl
6690: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
66a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
66b0: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62  qlite3_trace(pDb
66c0: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
66d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
66e0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
66f0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
6700: 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54  late NAME SCRIPT
6710: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
6720: 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c  e a new SQL coll
6730: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63  ation function c
6740: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
6750: 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  never.  ** that 
6760: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6770: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
6780: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
6790: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
67a0: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41  .  case DB_COLLA
67b0: 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c  TE: {.    SqlCol
67c0: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a  late *pCollate;.
67d0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
67e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69  .    char *zScri
67f0: 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72  pt;.    int nScr
6800: 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ipt;.    if( obj
6810: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
6820: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6830: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
6840: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
6850: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6860: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6870: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
6880: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
6890: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
68a0: 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65  zScript = Tcl_Ge
68b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
68c0: 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74  bjv[3], &nScript
68d0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20  );.    pCollate 
68e0: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54  = (SqlCollate*)T
68f0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
6900: 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53  (*pCollate) + nS
6910: 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20  cript + 1 );.   
6920: 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30   if( pCollate==0
6930: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
6940: 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ROR;.    pCollat
6950: 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  e->interp = inte
6960: 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  rp;.    pCollate
6970: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
6980: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f  Collate;.    pCo
6990: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d  llate->zScript =
69a0: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74   (char*)&pCollat
69b0: 65 5b 31 5d 3b 0a 20 20 20 20 73 74 72 63 70 79  e[1];.    strcpy
69c0: 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69  (pCollate->zScri
69d0: 70 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20  pt, zScript);.  
69e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72    if( sqlite3_cr
69f0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70  eate_collation(p
6a00: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53  Db->db, zName, S
6a10: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
6a20: 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74       pCollate, t
6a30: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b  clSqlCollate) ){
6a40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
6a50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6a60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6a70: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
6a80: 20 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20   collate_needed 
6a90: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
6aa0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
6ab0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
6ac0: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
6ad0: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
6ae0: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
6af0: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
6b00: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
6b10: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
6b20: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
6b30: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
6b40: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
6b50: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
6b60: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6b70: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
6b80: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
6b90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6ba0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
6bb0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
6bc0: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
6bd0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
6be0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
6bf0: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
6c00: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
6c10: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
6c20: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
6c30: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
6c40: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
6c50: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
6c60: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
6c70: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
6c80: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
6c90: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
6ca0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
6cb0: 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c  **     $db total
6cc0: 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20  _changes.  **.  
6cd0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
6ce0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
6cf0: 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
6d00: 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
6d10: 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63  leted .  ** sinc
6d20: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  e the database h
6d30: 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65  andle was create
6d40: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
6d50: 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a  B_TOTAL_CHANGES:
6d60: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
6d70: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28  pResult;.    if(
6d80: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
6d90: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6da0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
6db0: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
6dc0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75  .    }.    pResu
6de0: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
6df0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
6e00: 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
6e10: 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65  (pResult, sqlite
6e20: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
6e30: 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62  pDb->db));.    b
6e40: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 7d 20 2f  reak;.  }..  } /
6e50: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49  * End of the SWI
6e60: 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  TCH statement */
6e70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6e80: 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 20  ./*.**   sqlite 
6e90: 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20  DBNAME FILENAME 
6ea0: 3f 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59  ?MODE? ?-key KEY
6eb0: 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ?.**.** This is 
6ec0: 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d  the main Tcl com
6ed0: 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20  mand.  When the 
6ee0: 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d  "sqlite" Tcl com
6ef0: 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  mand is.** invok
6f00: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
6f10: 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73   runs to process
6f20: 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a   that command..*
6f30: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
6f40: 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c  rgument, DBNAME,
6f50: 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
6f60: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a   name for a new.
6f70: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
6f80: 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f  ection.  This co
6f90: 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20  mmand creates a 
6fa0: 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  new command name
6fb0: 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74  d.** DBNAME that
6fc0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74   is used to cont
6fd0: 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  rol that connect
6fe0: 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61  ion.  The databa
6ff0: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
7000: 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e   is deleted when
7010: 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d   the DBNAME comm
7020: 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  and is deleted..
7030: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
7040: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
7050: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   name of the dir
7060: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
7070: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69  ains.** the sqli
7080: 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  te database that
7090: 20 69 73 20 74 6f 20 62 65 20 61 63 63 65 73 73   is to be access
70a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  ed..**.** For te
70b0: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20  sting purposes, 
70c0: 77 65 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20  we also support 
70d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
70e0: 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 20 2d 65 6e  *.**  sqlite -en
70f0: 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20  coding.**.**    
7100: 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e     Return the en
7110: 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c  coding used by L
7120: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65  IKE and GLOB ope
7130: 72 61 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73  rators.  Choices
7140: 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 55 54  .**       are UT
7150: 46 2d 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e  F-8 and iso8859.
7160: 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 20 2d  .**.**  sqlite -
7170: 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  version.**.**   
7180: 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 76      Return the v
7190: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66  ersion number of
71a0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
71b0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  ary..**.**  sqli
71c0: 74 65 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66  te -tcl-uses-utf
71d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74  .**.**       Ret
71e0: 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d 70 69  urn "1" if compi
71f0: 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c 20 75  led with a Tcl u
7200: 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65 74 75  ses UTF-8.  Retu
7210: 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20 20 20  rn "0" if.**    
7220: 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20 62 79     not.  Used by
7230: 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65 20 73   tests to make s
7240: 75 72 65 20 74 68 65 20 6c 69 62 72 61 72 79 20  ure the library 
7250: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a  was compiled .**
7260: 20 20 20 20 20 20 20 63 6f 72 72 65 63 74 6c 79         correctly
7270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7280: 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c  DbMain(void *cd,
7290: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
72a0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
72b0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
72c0: 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
72d0: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  p;.  void *pKey 
72e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  = 0;.  int nKey 
72f0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
7300: 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20  r *zArg;.  char 
7310: 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e 73  *zErrMsg;.  cons
7320: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
7330: 20 63 68 61 72 20 7a 42 75 66 5b 38 30 5d 3b 0a   char zBuf[80];.
7340: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
7350: 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
7360: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
7370: 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
7380: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
7390: 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30  g,"-version")==0
73a0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
73b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
73c0: 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  p,sqlite3_versio
73d0: 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n,0);.      retu
73e0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
73f0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
7400: 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63  zArg,"-has-codec
7410: 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
7420: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
7430: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
7440: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
7450: 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1",0);.#else.   
7460: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7470: 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30  ult(interp,"0",0
7480: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
7490: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
74a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
74b0: 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d 75  cmp(zArg,"-tcl-u
74c0: 73 65 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b 0a  ses-utf")==0 ){.
74d0: 23 69 66 64 65 66 20 54 43 4c 5f 55 54 46 5f 4d  #ifdef TCL_UTF_M
74e0: 41 58 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  AX.      Tcl_App
74f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7500: 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20  ,"1",0);.#else. 
7510: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
7520: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22  esult(interp,"0"
7530: 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ,0);.#endif.    
7540: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
7550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
7560: 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63   objc==5 || objc
7570: 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72 67 20  ==6 ){.    zArg 
7580: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
7590: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63  romObj(objv[objc
75a0: 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  -2], 0);.    if(
75b0: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b   strcmp(zArg,"-k
75c0: 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
75d0: 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
75e0: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
75f0: 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e  objv[objc-1], &n
7600: 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a 63  Key);.      objc
7610: 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   -= 2;.    }.  }
7620: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
7630: 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
7640: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
7650: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
7660: 76 2c 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  v, .#ifdef SQLIT
7670: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
7680: 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
7690: 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d 4b  ME ?-key CODEC-K
76a0: 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20 20  EY?".#else.     
76b0: 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d   "HANDLE FILENAM
76c0: 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69 66  E ?MODE?".#endif
76d0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
76e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
76f0: 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b  }.  zErrMsg = 0;
7700: 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62  .  p = (SqliteDb
7710: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
7720: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
7730: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c   p==0 ){.    Tcl
7740: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
7750: 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  p, "malloc faile
7760: 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  d", TCL_STATIC);
7770: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7780: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d  ERROR;.  }.  mem
7790: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
77a0: 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  (*p));.  zFile =
77b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
77c0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
77d0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
77e0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 70 2d 3e  _HAS_CODEC.  p->
77f0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  db = sqlite3_ope
7800: 6e 5f 65 6e 63 72 79 70 74 65 64 28 7a 46 69 6c  n_encrypted(zFil
7810: 65 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 30  e, pKey, nKey, 0
7820: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 23 65 6c  , &zErrMsg);.#el
7830: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  se.  sqlite3_ope
7840: 6e 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 29  n(zFile, &p->db)
7850: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
7860: 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
7870: 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
7880: 20 7a 45 72 72 4d 73 67 20 3d 20 73 74 72 64 75   zErrMsg = strdu
7890: 70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  p(sqlite3_errmsg
78a0: 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71  (p->db));.    sq
78b0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
78c0: 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
78d0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
78e0: 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
78f0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
7900: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73  t(interp, zErrMs
7910: 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  g, TCL_VOLATILE)
7920: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
7930: 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 66 72  char*)p);.    fr
7940: 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
7950: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7960: 52 3b 0a 20 20 7d 0a 20 20 7a 41 72 67 20 3d 20  R;.  }.  zArg = 
7970: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7980: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
7990: 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
79a0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
79b0: 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c   zArg, DbObjCmd,
79c0: 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c   (char*)p, DbDel
79d0: 65 74 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 54  eteCmd);..  /* T
79e0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
79f0: 69 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  is the value of 
7a00: 74 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e  the sqlite* poin
7a10: 74 65 72 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e  ter.  */.  sprin
7a20: 74 66 28 7a 42 75 66 2c 20 22 25 70 22 2c 20 70  tf(zBuf, "%p", p
7a30: 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20 73 74 72  ->db);.  if( str
7a40: 6e 63 6d 70 28 7a 42 75 66 2c 22 30 78 22 2c 32  ncmp(zBuf,"0x",2
7a50: 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  ) ){.    sprintf
7a60: 28 7a 42 75 66 2c 20 22 30 78 25 70 22 2c 20 70  (zBuf, "0x%p", p
7a70: 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  ->db);.  }.  Tcl
7a80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7a90: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
7aa0: 0a 20 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65  .  /* If compile
7ab0: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45  d with SQLITE_TE
7ac0: 53 54 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68  ST turned on, th
7ad0: 65 6e 20 72 65 67 69 73 74 65 72 20 74 68 65 20  en register the 
7ae0: 22 6d 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51  "md5sum".  ** SQ
7af0: 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  L function..  */
7b00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
7b10: 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65  EST.  {.    exte
7b20: 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69  rn void Md5_Regi
7b30: 73 74 65 72 28 73 71 6c 69 74 65 2a 29 3b 0a 20  ster(sqlite*);. 
7b40: 20 20 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28     Md5_Register(
7b50: 70 2d 3e 64 62 29 3b 0a 20 20 20 7d 0a 23 65 6e  p->db);.   }.#en
7b60: 64 69 66 20 20 0a 20 20 70 2d 3e 69 6e 74 65 72  dif  .  p->inter
7b70: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 72 65  p = interp;.  re
7b80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
7b90: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20  /*.** Provide a 
7ba0: 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74  dummy Tcl_InitSt
7bb0: 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73  ubs if we are us
7bc0: 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74  ing this as a st
7bd0: 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e  atic.** library.
7be0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f  .*/.#ifndef USE_
7bf0: 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65  TCL_STUBS.# unde
7c00: 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f  Tcl_InitStubs
7c10: 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e  .# define Tcl_In
7c20: 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23  itStubs(a,b,c).#
7c30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  endif../*.** Ini
7c40: 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64  tialize this mod
7c50: 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ule..**.** This 
7c60: 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61  Tcl module conta
7c70: 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ins only a singl
7c80: 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  e new Tcl comman
7c90: 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22  d named "sqlite"
7ca0: 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72  ..** (Hence ther
7cb0: 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63  e is no namespac
7cc0: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  e.  There is no 
7cd0: 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61  point in using a
7ce0: 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66   namespace.** if
7cf0: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f   the extension o
7d00: 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65  nly supplies one
7d10: 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65   new name!)  The
7d20: 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
7d30: 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  d is.** used to 
7d40: 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74  open a new SQLit
7d50: 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65  e database.  See
7d60: 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f   the DbMain() ro
7d70: 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66  utine above.** f
7d80: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
7d90: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  formation..*/.in
7da0: 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  t Sqlite3_Init(T
7db0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7dc0: 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74  p){.  Tcl_InitSt
7dd0: 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 30  ubs(interp, "8.0
7de0: 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ", 0);.  Tcl_Cre
7df0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
7e00: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
7e10: 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
7e20: 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
7e30: 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
7e40: 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
7e50: 65 33 22 2c 20 22 33 2e 30 22 29 3b 0a 20 20 72  e3", "3.0");.  r
7e60: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
7e70: 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49  int Tclsqlite3_I
7e80: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
7e90: 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49  interp){.  Tcl_I
7ea0: 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
7eb0: 20 22 38 2e 30 22 2c 20 30 29 3b 0a 20 20 54 63   "8.0", 0);.  Tc
7ec0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
7ed0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
7ee0: 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d  te3", (Tcl_ObjCm
7ef0: 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30  dProc*)DbMain, 0
7f00: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50  , 0);.  Tcl_PkgP
7f10: 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
7f20: 73 71 6c 69 74 65 33 22 2c 20 22 33 2e 30 22 29  sqlite3", "3.0")
7f30: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
7f40: 4b 3b 0a 7d 0a 69 6e 74 20 53 71 6c 69 74 65 33  K;.}.int Sqlite3
7f50: 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
7f60: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
7f70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7f80: 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  }.int Tclsqlite3
7f90: 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
7fa0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
7fb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7fc0: 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 49  }..#if 0./*.** I
7fd0: 66 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67  f compiled using
7fe0: 20 6d 6b 74 63 6c 61 70 70 2c 20 74 68 69 73 20   mktclapp, this 
7ff0: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20  routine runs to 
8000: 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 65 76  initialize.** ev
8010: 65 72 79 74 68 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  erything..*/.int
8020: 20 45 74 5f 41 70 70 49 6e 69 74 28 54 63 6c 5f   Et_AppInit(Tcl_
8030: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
8040: 0a 20 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  .  return Sqlite
8050: 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
8060: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8070: 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
8080: 53 48 20 69 73 20 64 65 66 69 6e 65 64 20 61 6e  SH is defined an
8090: 64 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70  d is one, then p
80a0: 75 74 20 69 6e 20 63 6f 64 65 20 66 6f 72 20 74  ut in code for t
80b0: 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75  he.** "main" rou
80c0: 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69  tine that will i
80d0: 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 2e 0a 2a  nitialize Tcl..*
80e0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 43  /.#if defined(TC
80f0: 4c 53 48 29 20 26 26 20 54 43 4c 53 48 3d 3d 31  LSH) && TCLSH==1
8100: 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
8110: 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65  inloop[] =.  "se
8120: 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22  t line {}\n".  "
8130: 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64  while {![eof std
8140: 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69  in]} {\n".    "i
8150: 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20  f {$line!=\"\"} 
8160: 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73  {\n".      "puts
8170: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20   -nonewline \"> 
8180: 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73  \"\n".    "} els
8190: 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75  e {\n".      "pu
81a0: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
81b0: 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e  % \"\n".    "}\n
81c0: 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74 64  ".    "flush std
81d0: 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65  out\n".    "appe
81e0: 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74  nd line [gets st
81f0: 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20  din]\n".    "if 
8200: 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20  {[info complete 
8210: 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20  $line]} {\n".   
8220: 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b     "if {[catch {
8230: 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65  uplevel #0 $line
8240: 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a  } result]} {\n".
8250: 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74          "puts st
8260: 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72  derr \"Error: $r
8270: 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20  esult\"\n".     
8280: 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73   "} elseif {$res
8290: 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ult!=\"\"} {\n".
82a0: 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72          "puts $r
82b0: 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22  esult\n".      "
82c0: 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20  }\n".      "set 
82d0: 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22  line {}\n".    "
82e0: 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
82f0: 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c    "append line \
8300: 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  \n\n".    "}\n".
8310: 20 20 22 7d 5c 6e 22 0a 3b 0a 0a 23 64 65 66 69    "}\n".;..#defi
8320: 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
8330: 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
8340: 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
8350: 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
8360: 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
8370: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
8380: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8390: 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  rp;.  Tcl_FindEx
83a0: 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
83b0: 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63  );.  interp = Tc
83c0: 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
83d0: 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  ;.  Sqlite3_Init
83e0: 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66  (interp);.#ifdef
83f0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
8400: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
8410: 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
8420: 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
8430: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
8440: 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54  litetest2_Init(T
8450: 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
8460: 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
8470: 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c  tetest3_Init(Tcl
8480: 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
8490: 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
84a0: 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49  test4_Init(Tcl_I
84b0: 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
84c0: 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
84d0: 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st5_Init(Tcl_Int
84e0: 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
84f0: 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54  n int Md5_Init(T
8500: 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
8510: 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
8520: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
8530: 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28  qlitetest2_Init(
8540: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
8550: 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e  itetest3_Init(in
8560: 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
8570: 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65  etest4_Init(inte
8580: 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
8590: 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70  est5_Init(interp
85a0: 29 3b 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74 28  );.    Md5_Init(
85b0: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 23 65 6e  interp);.  }.#en
85c0: 64 69 66 0a 20 20 69 66 28 20 61 72 67 63 3e 3d  dif.  if( argc>=
85d0: 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
85e0: 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
85f0: 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72  nterp,"argv0",ar
8600: 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c  gv[1],TCL_GLOBAL
8610: 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f  _ONLY);.    Tcl_
8620: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
8630: 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c  rgv", "", TCL_GL
8640: 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
8650: 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b  for(i=2; i<argc;
8660: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c   i++){.      Tcl
8670: 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _SetVar(interp, 
8680: 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c  "argv", argv[i],
8690: 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47  .          TCL_G
86a0: 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c  LOBAL_ONLY | TCL
86b0: 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20  _LIST_ELEMENT | 
86c0: 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45  TCL_APPEND_VALUE
86d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
86e0: 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e   Tcl_EvalFile(in
86f0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d  terp, argv[1])!=
8700: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
8710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66  const char *zInf
8720: 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69  o = Tcl_GetVar(i
8730: 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66  nterp, "errorInf
8740: 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  o", TCL_GLOBAL_O
8750: 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NLY);.      if( 
8760: 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f  zInfo==0 ) zInfo
8770: 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c   = interp->resul
8780: 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  t;.      fprintf
8790: 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c  (stderr,"%s: %s\
87a0: 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f  n", *argv, zInfo
87b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
87c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
87d0: 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c  {.    Tcl_Global
87e0: 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61  Eval(interp, zMa
87f0: 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72  inloop);.  }.  r
8800: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
8810: 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23  f /* TCLSH */..#
8820: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
8830: 64 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a           d(NO_TCL) */.