/ Hex Artifact Content
Login

Artifact f72288553ca3cdaf686baab4b1797dd98140c501:


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: 33 20 32 30 30 34 2f 30 36 2f 32 39 20 31 33 3a  3 2004/06/29 13:
01c0: 34 31 3a 32 31 20 64 61 6e 69 65 6c 6b 31 39 37  41:21 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 22 63 68 61 6e 67 65           "change
31f0: 73 22 2c 0a 20 20 20 20 22 63 6c 6f 73 65 22 2c  s",.    "close",
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
3210: 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20  ollate",        
3220: 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65     "collation_ne
3230: 65 64 65 64 22 2c 0a 20 20 20 20 22 63 6f 6d 6d  eded",.    "comm
3240: 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20  it_hook",       
3250: 20 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20 20 20   "complete",    
3260: 20 20 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65        "errorcode
3270: 22 2c 0a 20 20 20 20 22 65 76 61 6c 22 2c 20 20  ",.    "eval",  
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 75               "fu
3290: 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  nction",        
32a0: 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72    "last_insert_r
32b0: 6f 77 69 64 22 2c 0a 20 20 20 20 22 6f 6e 65 63  owid",.    "onec
32c0: 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20  olumn",         
32d0: 20 22 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20   "progress",    
32e0: 20 20 20 20 20 20 22 72 65 6b 65 79 22 2c 0a 20        "rekey",. 
32f0: 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20     "timeout",   
3300: 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f           "total_
3310: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22 74  changes",     "t
3320: 72 61 63 65 22 2c 0a 20 20 20 20 30 20 20 20 20  race",.    0    
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f  .  };.  enum DB_
3350: 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55  enum {.    DB_AU
3360: 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20  THORIZER,       
3370: 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20 20   DB_BUSY,       
3380: 20 20 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53        DB_CHANGES
3390: 2c 0a 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20  ,.    DB_CLOSE, 
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
33b0: 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20  OLLATE,         
33c0: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
33d0: 45 44 45 44 2c 0a 20 20 20 20 44 42 5f 43 4f 4d  EDED,.    DB_COM
33e0: 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20  MIT_HOOK,       
33f0: 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20  DB_COMPLETE,    
3400: 20 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44       DB_ERRORCOD
3410: 45 2c 0a 20 20 20 20 44 42 5f 45 56 41 4c 2c 20  E,.    DB_EVAL, 
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
3430: 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20 20  FUNCTION,       
3440: 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54    DB_LAST_INSERT
3450: 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44 42 5f 4f  _ROWID,.    DB_O
3460: 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20  NECOLUMN,       
3470: 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20    DB_PROGRESS,  
3480: 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c         DB_REKEY,
3490: 0a 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c  .    DB_TIMEOUT,
34a0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f             DB_TO
34b0: 54 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20 20  TAL_CHANGES,    
34c0: 44 42 5f 54 52 41 43 45 2c 0a 20 20 7d 3b 0a 0a  DB_TRACE,.  };..
34d0: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
34e0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
34f0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
3500: 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e  objv, "SUBCOMMAN
3510: 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74  D ...");.    ret
3520: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3530: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
3540: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
3550: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42  erp, objv[1], DB
3560: 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  _strs, "option",
3570: 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a   0, &choice) ){.
3580: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3590: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  RROR;.  }..  swi
35a0: 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e  tch( (enum DB_en
35b0: 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20  um)choice ){..  
35c0: 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72  /*    $db author
35d0: 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  izer ?CALLBACK?.
35e0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
35f0: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
3600: 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65  ack to authorize
3610: 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74   each SQL operat
3620: 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a  ion as it is.  *
3630: 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61  * compiled.  5 a
3640: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70  rguments are app
3650: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c  ended to the cal
3660: 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20  lback before it 
3670: 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a  is.  ** invoked:
3680: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29  .  **.  **   (1)
3690: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
36a0: 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c  on type (ex: SQL
36b0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
36c0: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
36d0: 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29   ...).  **   (2)
36e0: 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69   First descripti
36f0: 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73  ve name (depends
3700: 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   on authorizatio
3710: 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28  n type).  **   (
3720: 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69  3) Second descri
3730: 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20  ptive name.  ** 
3740: 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68    (4) Name of th
3750: 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20  e database (ex: 
3760: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a  "main", "temp").
3770: 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20    **   (5) Name 
3780: 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20  of trigger that 
3790: 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63  is doing the acc
37a0: 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ess.  **.  ** Th
37b0: 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c  e callback shoul
37c0: 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74  d return on of t
37d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
37e0: 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c  ings: SQLITE_OK,
37f0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e  .  ** SQLITE_IGN
3800: 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44  ORE, or SQLITE_D
3810: 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ENY.  Any other 
3820: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
3830: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20  an error..  **. 
3840: 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68   ** If this meth
3850: 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  od is invoked wi
3860: 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c  th no arguments,
3870: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74   the current aut
3880: 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  horization.  ** 
3890: 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20  callback string 
38a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
38b0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48  /.  case DB_AUTH
38c0: 4f 52 49 5a 45 52 3a 20 7b 0a 20 20 20 20 69 66  ORIZER: {.    if
38d0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
38e0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
38f0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
3900: 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
3910: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
3920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
3930: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
3940: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
3950: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
3960: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3970: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
3980: 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20 20  ->zAuth, 0);.   
3990: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
39a0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74        char *zAut
39b0: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  h;.      int len
39c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
39d0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
39e0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
39f0: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zAuth);.      }.
3a00: 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63        zAuth = Tc
3a10: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3a20: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
3a30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  );.      if( zAu
3a40: 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  th && len>0 ){. 
3a50: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74         pDb->zAut
3a60: 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  h = Tcl_Alloc( l
3a70: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
3a80: 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 41    strcpy(pDb->zA
3a90: 75 74 68 2c 20 7a 41 75 74 68 29 3b 0a 20 20 20  uth, zAuth);.   
3aa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3ab0: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30    pDb->zAuth = 0
3ac0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
3ad0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
3ae0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
3af0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
3b00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
3b10: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
3b20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3b30: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
3b40: 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63  (pDb->db, auth_c
3b50: 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20  allback, pDb);. 
3b60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3b70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
3b80: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
3b90: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
3ba0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
3bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
3bc0: 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79    /*    $db busy
3bd0: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
3be0: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
3bf0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
3c00: 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  if an SQL statem
3c10: 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ent attempts to 
3c20: 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  open.  ** a lock
3c30: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
3c40: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
3c50: 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28  _BUSY: {.    if(
3c60: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
3c70: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
3c80: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
3c90: 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a  v, "CALLBACK");.
3ca0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
3cb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
3cc0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
3cd0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
3ce0: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
3cf0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3d00: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
3d10: 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  Busy, 0);.      
3d20: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
3d30: 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a     char *zBusy;.
3d40: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
3d50: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
3d60: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
3d70: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
3d80: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
3d90: 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47     zBusy = Tcl_G
3da0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
3db0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
3dc0: 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20        if( zBusy 
3dd0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
3de0: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
3df0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
3e00: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
3e10: 74 72 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79  trcpy(pDb->zBusy
3e20: 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20  , zBusy);.      
3e30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
3e40: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20  Db->zBusy = 0;. 
3e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3e60: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
3e70: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
3e80: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
3e90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
3ea0: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
3eb0: 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  b, DbBusyHandler
3ec0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
3ed0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3ee0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
3ef0: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
3f00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3f10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
3f20: 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67    /*    $db prog
3f30: 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b  ress ?N CALLBACK
3f40: 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76  ?.  ** .  ** Inv
3f50: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
3f60: 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76  llback every N v
3f70: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f  irtual machine o
3f80: 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65  pcodes while exe
3f90: 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72  cuting.  ** quer
3fa0: 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ies..  */.  case
3fb0: 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a   DB_PROGRESS: {.
3fc0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20      if( objc==2 
3fd0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
3fe0: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->zProgress ){. 
3ff0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
4000: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4010: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20  pDb->zProgress, 
4020: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
4030: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
4040: 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  4 ){.      char 
4050: 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20  *zProgress;.    
4060: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
4070: 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66   int N;.      if
4080: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
4090: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
40a0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29  rp, objv[2], &N)
40b0: 20 29 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f   ){..return TCL_
40c0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a  ERROR;.      };.
40d0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
40e0: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
40f0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
4100: 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->zProgress);.  
4110: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
4120: 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53  gress = Tcl_GetS
4130: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
4140: 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[3], &len);.   
4150: 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73     if( zProgress
4160: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
4170: 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
4180: 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ess = Tcl_Alloc(
4190: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
41a0: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
41b0: 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67  zProgress, zProg
41c0: 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ress);.      }el
41d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
41e0: 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >zProgress = 0;.
41f0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
4200: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
4210: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20  RESS_CALLBACK.  
4220: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
4230: 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
4240: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
4250: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
4260: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
4270: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
4280: 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48  , N, DbProgressH
4290: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
42a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
42b0: 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72     sqlite3_progr
42c0: 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  ess_handler(pDb-
42d0: 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  >db, 0, 0, 0);. 
42e0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
42f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
4300: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
4310: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
4320: 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a   "N CALLBACK");.
4330: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
4340: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
4350: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4360: 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e 67  /*     $db chang
4370: 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
4380: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
4390: 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
43a0: 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
43b0: 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
43c0: 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74  by.  ** the most
43d0: 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20   recent INSERT, 
43e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
43f0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20   statement, not 
4400: 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20  including .  ** 
4410: 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
4420: 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67   by trigger prog
4430: 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  rams..  */.  cas
4440: 65 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a  e DB_CHANGES: {.
4450: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
4460: 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  sult;.    if( ob
4470: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
4480: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
4490: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
44a0: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
44b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
44c0: 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20    }.    pResult 
44d0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
44e0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
44f0: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
4500: 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63  esult, sqlite3_c
4510: 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29  hanges(pDb->db))
4520: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
4530: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c  ..  /*    $db cl
4540: 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68  ose.  **.  ** Sh
4550: 75 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62  utdown the datab
4560: 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ase.  */.  case 
4570: 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20  DB_CLOSE: {.    
4580: 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e  Tcl_DeleteComman
4590: 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  d(interp, Tcl_Ge
45a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
45b0: 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20  bjv[0], 0));.   
45c0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
45d0: 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f  *    $db commit_
45e0: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  hook ?CALLBACK?.
45f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
4600: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
4610: 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ack just before 
4620: 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79  committing every
4630: 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   SQL transaction
4640: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
4650: 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e  llback throws an
4660: 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65   exception or re
4670: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
4680: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72  then the.  ** tr
4690: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f  ansaction is abo
46a0: 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41  rted.  If CALLBA
46b0: 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  CK is an empty s
46c0: 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62  tring, the callb
46d0: 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ack.  ** is disa
46e0: 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  bled..  */.  cas
46f0: 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b  e DB_COMMIT_HOOK
4700: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
4710: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
4720: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
4730: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
4740: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
4750: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4760: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
4770: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
4780: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
4790: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
47a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
47b0: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  (interp, pDb->zC
47c0: 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  ommit, 0);.     
47d0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
47e0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
47f0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
4800: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
4810: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
4820: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
4830: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
4840: 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
4850: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
4860: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
4870: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
4880: 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
4890: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
48a0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
48b0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
48c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
48d0: 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
48e0: 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   zCommit);.     
48f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4900: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
4910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4920: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
4930: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
4940: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
4950: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4960: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
4970: 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
4980: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
4990: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
49a0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
49b0: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
49c0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
49d0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
49e0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
49f0: 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e     $db collate N
4a00: 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  AME SCRIPT.  **.
4a10: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
4a20: 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
4a30: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
4a40: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
4a50: 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
4a60: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
4a70: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
4a80: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
4a90: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
4aa0: 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a  e DB_COLLATE: {.
4ab0: 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a      SqlCollate *
4ac0: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68  pCollate;.    ch
4ad0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  ar *zName;.    c
4ae0: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20  har *zScript;.  
4af0: 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20    int nScript;. 
4b00: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
4b10: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
4b20: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
4b30: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
4b40: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
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 7a 4e 61 6d  ;.    }.    zNam
4b70: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
4b80: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
4b90: 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70  , 0);.    zScrip
4ba0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
4bb0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
4bc0: 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20  , &nScript);.   
4bd0: 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c   pCollate = (Sql
4be0: 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c  Collate*)Tcl_All
4bf0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  oc( sizeof(*pCol
4c00: 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20  late) + nScript 
4c10: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
4c20: 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74  Collate==0 ) ret
4c30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4c40: 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74     pCollate->int
4c50: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
4c60: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78    pCollate->pNex
4c70: 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  t = pDb->pCollat
4c80: 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  e;.    pCollate-
4c90: 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72  >zScript = (char
4ca0: 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a  *)&pCollate[1];.
4cb0: 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
4cc0: 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  e = pCollate;.  
4cd0: 20 20 73 74 72 63 70 79 28 70 43 6f 6c 6c 61 74    strcpy(pCollat
4ce0: 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72  e->zScript, zScr
4cf0: 69 70 74 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ipt);.    if( sq
4d00: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
4d10: 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  lation(pDb->db, 
4d20: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  zName, SQLITE_UT
4d30: 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f  F8, .        pCo
4d40: 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c  llate, tclSqlCol
4d50: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 72  late) ){.      r
4d60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4d70: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
4d80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
4d90: 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 69       $db collati
4da0: 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50 54  on_needed SCRIPT
4db0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
4dc0: 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c  e a new SQL coll
4dd0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63  ation function c
4de0: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
4df0: 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  never.  ** that 
4e00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4e10: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
4e20: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
4e30: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
4e40: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41  .  case DB_COLLA
4e50: 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20  TION_NEEDED: {. 
4e60: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
4e70: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
4e80: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
4e90: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50   2, objv, "SCRIP
4ea0: 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
4eb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
4ec0: 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e   }.    if( pDb->
4ed0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29  pCollateNeeded )
4ee0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  {.      Tcl_Decr
4ef0: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
4f00: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
4f10: 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43     }.    pDb->pC
4f20: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d 20 54  ollateNeeded = T
4f30: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
4f40: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63  objv[2]);.    Tc
4f50: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
4f60: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
4f70: 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
4f80: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
4f90: 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20  d(pDb->db, pDb, 
4fa0: 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  tclCollateNeeded
4fb0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4fc0: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
4fd0: 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a  omplete SQL.  **
4fe0: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  .  ** Return TRU
4ff0: 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f  E if SQL is a co
5000: 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
5010: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41  ment.  Return FA
5020: 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69  LSE if.  ** addi
5030: 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20  tional lines of 
5040: 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65 64  input are needed
5050: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
5060: 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62  ar to the.  ** b
5070: 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f  uilt-in "info co
5080: 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20  mplete" command 
5090: 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63  of Tcl..  */.  c
50a0: 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a  ase DB_COMPLETE:
50b0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
50c0: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
50d0: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20   isComplete;.   
50e0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
50f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
5100: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
5110: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
5120: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
5130: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
5140: 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73    isComplete = s
5150: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
5160: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
5170: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
5180: 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  ) );.    pResult
5190: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
51a0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
51b0: 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f   Tcl_SetBooleanO
51c0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f  bj(pResult, isCo
51d0: 6d 70 6c 65 74 65 29 3b 0a 20 20 20 20 62 72 65  mplete);.    bre
51e0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
51f0: 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63  **    $db errorc
5200: 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ode.  **.  ** Re
5210: 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63  turn the numeric
5220: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
5230: 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79   was returned by
5240: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5250: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
5260: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20  lite3_exec()..  
5270: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52  */.  case DB_ERR
5280: 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63  ORCODE: {.    Tc
5290: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
52a0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
52b0: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  tObj(sqlite3_err
52c0: 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b  code(pDb->db)));
52d0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
52e0: 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20     .  /*.  **   
52f0: 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f   $db eval $sql ?
5300: 61 72 72 61 79 20 7b 20 20 2e 2e 2e 63 6f 64 65  array {  ...code
5310: 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  ... }?.  **.  **
5320: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
5330: 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
5340: 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
5350: 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
5360: 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
5370: 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
5380: 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
5390: 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
53a0: 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
53b0: 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
53c0: 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
53d0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
53e0: 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
53f0: 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
5400: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
5410: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
5420: 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
5430: 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
5440: 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
5450: 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
5460: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
5470: 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
5480: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
5490: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
54a0: 56 41 4c 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  VAL: {.    char 
54b0: 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b 0a 20 20 20  const *zSql;.   
54c0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4c 65   char const *zLe
54d0: 66 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ft;.    sqlite3_
54e0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
54f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20    Tcl_Obj *pRet 
5500: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
5510: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5520: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 0a 20 20 20  ount(pRet);..   
5530: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
5540: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
5550: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
5560: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
5570: 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e  v, "SQL ?ARRAY-N
5580: 41 4d 45 20 43 4f 44 45 3f 22 29 3b 0a 20 20 20  AME CODE?");.   
5590: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
55a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
55b0: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
55c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
55d0: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 77 68 69  [2], 0);.    whi
55e0: 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20  le( zSql[0] ){. 
55f0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 0a 20       int i;.  . 
5600: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
5610: 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70  OK!=sqlite3_prep
5620: 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71  are(pDb->db, zSq
5630: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26  l, -1, &pStmt, &
5640: 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  zLeft) ){.      
5650: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
5660: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
5670: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  tToObj(sqlite3_e
5680: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29  rrmsg(pDb->db)))
5690: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
56a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
56b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
56c0: 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 70 53  .  .      if( pS
56d0: 74 6d 74 20 26 26 20 6f 62 6a 63 3d 3d 35 20 29  tmt && objc==5 )
56e0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  {.        Tcl_Ob
56f0: 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63  j *pColList = Tc
5700: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
5710: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5720: 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a  ount(pColList);.
5730: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
5740: 3b 20 69 3c 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ; i<sqlite3_colu
5750: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
5760: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5770: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5780: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5790: 2c 20 70 43 6f 6c 4c 69 73 74 2c 0a 20 20 20 20  , pColList,.    
57a0: 20 20 20 20 20 20 20 20 20 20 64 62 54 65 78 74            dbText
57b0: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ToObj(sqlite3_co
57c0: 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
57d0: 20 69 29 29 0a 20 20 20 20 20 20 20 20 20 20 29   i)).          )
57e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
57f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
5800: 72 32 28 69 6e 74 65 72 70 2c 6f 62 6a 76 5b 33  r2(interp,objv[3
5810: 5d 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ],Tcl_NewStringO
5820: 62 6a 28 22 2a 22 2c 2d 31 29 2c 70 43 6f 6c 4c  bj("*",-1),pColL
5830: 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ist,0);.      }.
5840: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
5850: 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  tmt && SQLITE_RO
5860: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
5870: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
5880: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c    for(i=0; i<sql
5890: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
58a0: 74 28 70 53 74 6d 74 29 3b 20 69 2b 2b 29 7b 0a  t(pStmt); i++){.
58b0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
58c0: 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20  j *pVal;.       
58d0: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a     .          /*
58e0: 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e   Set pVal to con
58f0: 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f  tain the i'th co
5900: 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77  lumn of this row
5910: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
5920: 66 28 20 53 51 4c 49 54 45 5f 42 4c 4f 42 21 3d  f( SQLITE_BLOB!=
5930: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
5940: 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20 29 7b  ype(pStmt, i) ){
5950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61  .            pVa
5960: 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  l = dbTextToObj(
5970: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
5980: 65 78 74 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a  ext(pStmt, i));.
5990: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
59a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
59b0: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
59c0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
59d0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
59e0: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
59f0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
5a00: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
5a10: 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 62  lob(pStmt, i), b
5a20: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
5a30: 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
5a40: 69 66 28 20 6f 62 6a 63 3d 3d 35 20 29 7b 0a 20  if( objc==5 ){. 
5a50: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f             Tcl_O
5a60: 62 6a 20 2a 70 4e 61 6d 65 20 3d 20 64 62 54 65  bj *pName = dbTe
5a70: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
5a80: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
5a90: 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20  t, i));.        
5aa0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5ab0: 6f 75 6e 74 28 70 4e 61 6d 65 29 3b 0a 20 20 20  ount(pName);.   
5ac0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 74           if( !st
5ad0: 72 63 6d 70 28 22 22 2c 20 54 63 6c 5f 47 65 74  rcmp("", Tcl_Get
5ae0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 29  String(objv[3]))
5af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5b00: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
5b10: 28 69 6e 74 65 72 70 2c 20 70 4e 61 6d 65 2c 20  (interp, pName, 
5b20: 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  0, pVal, 0);.   
5b30: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
5b50: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
5b60: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 70 4e  erp, objv[3], pN
5b70: 61 6d 65 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20  ame, pVal, 0);. 
5b80: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5b90: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63           Tcl_Dec
5ba0: 72 52 65 66 43 6f 75 6e 74 28 70 4e 61 6d 65 29  rRefCount(pName)
5bb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
5bc0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  e{.            T
5bd0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5be0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5bf0: 70 52 65 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20  pRet, pVal);.   
5c00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5c10: 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66   }.  .        if
5c20: 28 20 6f 62 6a 63 3d 3d 35 20 29 7b 0a 20 20 20  ( objc==5 ){.   
5c30: 20 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f         rc = Tcl_
5c40: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
5c50: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20  , objv[4], 0);. 
5c60: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
5c70: 3d 54 43 4c 5f 45 52 52 4f 52 20 29 20 72 63 20  =TCL_ERROR ) rc 
5c80: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20  = TCL_OK;.      
5c90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5ca0: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 70 53     .      if( pS
5cb0: 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 53 43  tmt && SQLITE_SC
5cc0: 48 45 4d 41 3d 3d 73 71 6c 69 74 65 33 5f 66 69  HEMA==sqlite3_fi
5cd0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 20 29 7b  nalize(pStmt) ){
5ce0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
5cf0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  e;.      }.  .  
5d00: 20 20 20 20 69 66 28 20 70 53 74 6d 74 20 26 26      if( pStmt &&
5d10: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5d20: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
5d30: 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >db) ){.        
5d40: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
5d50: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
5d60: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  oObj(sqlite3_err
5d70: 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  msg(pDb->db)));.
5d80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
5d90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
5da0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
5db0: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
5dc0: 66 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ft;.    }..    i
5dd0: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
5de0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
5df0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
5e00: 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pRet);.    }.   
5e10: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5e20: 74 28 70 52 65 74 29 3b 0a 0a 20 20 20 20 62 72  t(pRet);..    br
5e30: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
5e40: 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63   **     $db func
5e50: 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50 54  tion NAME SCRIPT
5e60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
5e70: 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63  e a new SQL func
5e80: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
5e90: 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61 74  .  Whenever that
5ea0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a   function is.  *
5eb0: 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  * called, invoke
5ec0: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
5ed0: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
5ee0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
5ef0: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
5f00: 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b   SqlFunc *pFunc;
5f10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
5f20: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72  ;.    char *zScr
5f30: 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63  ipt;.    int nSc
5f40: 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  ript;.    if( ob
5f50: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
5f60: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
5f70: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
5f80: 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b   "NAME SCRIPT");
5f90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
5fa0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
5fb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
5fc0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5fd0: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
5fe0: 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47   zScript = Tcl_G
5ff0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6000: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70  objv[3], &nScrip
6010: 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20  t);.    pFunc = 
6020: 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c  (SqlFunc*)Tcl_Al
6030: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 46 75  loc( sizeof(*pFu
6040: 6e 63 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20  nc) + nScript + 
6050: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  1 );.    if( pFu
6060: 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54  nc==0 ) return T
6070: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 46  CL_ERROR;.    pF
6080: 75 6e 63 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  unc->interp = in
6090: 74 65 72 70 3b 0a 20 20 20 20 70 46 75 6e 63 2d  terp;.    pFunc-
60a0: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46  >pNext = pDb->pF
60b0: 75 6e 63 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e  unc;.    pFunc->
60c0: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a  zScript = (char*
60d0: 29 26 70 46 75 6e 63 5b 31 5d 3b 0a 20 20 20 20  )&pFunc[1];.    
60e0: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  pDb->pFunc = pFu
60f0: 6e 63 3b 0a 20 20 20 20 73 74 72 63 70 79 28 70  nc;.    strcpy(p
6100: 46 75 6e 63 2d 3e 7a 53 63 72 69 70 74 2c 20 7a  Func->zScript, z
6110: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20  Script);.    rc 
6120: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6130: 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64  _function(pDb->d
6140: 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
6150: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
6160: 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c     pFunc, tclSql
6170: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Func, 0, 0);.   
6180: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6190: 4f 4b 20 29 20 72 63 20 3d 20 54 43 4c 5f 45 52  OK ) rc = TCL_ER
61a0: 52 4f 52 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ROR;.    break;.
61b0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
61c0: 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65     $db last_inse
61d0: 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20  rt_rowid .  **. 
61e0: 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e   ** Return an in
61f0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
6200: 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65  he ROWID for the
6210: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
6220: 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ert..  */.  case
6230: 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f   DB_LAST_INSERT_
6240: 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c  ROWID: {.    Tcl
6250: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
6260: 20 20 20 69 6e 74 20 72 6f 77 69 64 3b 0a 20 20     int rowid;.  
6270: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
6280: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
6290: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
62a0: 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
62b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
62c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
62d0: 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
62e0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
62f0: 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  d(pDb->db);.    
6300: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
6310: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
6320: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
6330: 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72  ntObj(pResult, r
6340: 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  owid);.    break
6350: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6360: 20 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75       $db onecolu
6370: 6d 6e 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a  mn SQL.  **.  **
6380: 20 52 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   Return a single
6390: 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 73   column from a s
63a0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
63b0: 20 67 69 76 65 6e 20 53 51 4c 20 71 75 65 72 79   given SQL query
63c0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
63d0: 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  _ONECOLUMN: {.  
63e0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
63f0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
6400: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  = 0;.    if( obj
6410: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
6420: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6430: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
6440: 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
6450: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6460: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
6470: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
6480: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
6490: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
64a0: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
64b0: 2c 20 7a 53 71 6c 2c 20 44 62 45 76 61 6c 43 61  , zSql, DbEvalCa
64c0: 6c 6c 62 61 63 6b 33 2c 20 69 6e 74 65 72 70 2c  llback3, interp,
64d0: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
64e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41  if( rc==SQLITE_A
64f0: 42 4f 52 54 20 29 7b 0a 20 20 20 20 20 20 72 63  BORT ){.      rc
6500: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6510: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 45 72 72    }else if( zErr
6520: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  Msg ){.      Tcl
6530: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
6540: 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
6550: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20  VOLATILE);.     
6560: 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a   free(zErrMsg);.
6570: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
6580: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
6590: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
65a0: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  K ){.      Tcl_A
65b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
65c0: 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  rp, sqlite3ErrSt
65d0: 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20  r(rc), 0);.     
65e0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
65f0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6600: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6610: 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b       $db rekey K
6620: 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  EY.  **.  ** Cha
6630: 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74 69  nge the encrypti
6640: 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75  on key on the cu
6650: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74  rrently open dat
6660: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
6670: 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20  se DB_REKEY: {. 
6680: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
6690: 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20   void *pKey;.   
66a0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
66b0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
66c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
66d0: 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a  , objv, "KEY");.
66e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
66f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6700: 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
6710: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
6720: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29  (objv[2], &nKey)
6730: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6740: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72 63  HAS_CODEC.    rc
6750: 20 3d 20 73 71 6c 69 74 65 5f 72 65 6b 65 79 28   = sqlite_rekey(
6760: 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e  pDb->db, pKey, n
6770: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Key);.    if( rc
6780: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
6790: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
67a0: 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  p, sqlite3ErrStr
67b0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  (rc), 0);.      
67c0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
67d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
67e0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
67f0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74  *.  **     $db t
6800: 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f  imeout MILLESECO
6810: 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65  NDS.  **.  ** De
6820: 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  lay for the numb
6830: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
6840: 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65  ds specified whe
6850: 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b  n a file is lock
6860: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
6870: 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20  DB_TIMEOUT: {.  
6880: 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66    int ms;.    if
6890: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
68a0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
68b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
68c0: 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e  bjv, "MILLISECON
68d0: 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  DS");.      retu
68e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
68f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
6900: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
6910: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
6920: 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ms) ) return TCL
6930: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
6940: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
6950: 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20  (pDb->db, ms);. 
6960: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6970: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
6980: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20   total_changes. 
6990: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
69a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
69b0: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
69c0: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
69d0: 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a   or deleted .  *
69e0: 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61  * since the data
69f0: 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20  base handle was 
6a00: 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  created..  */.  
6a10: 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48  case DB_TOTAL_CH
6a20: 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
6a30: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
6a40: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
6a50: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
6a60: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6a70: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
6a80: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6a90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6aa0: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
6ab0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
6ac0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
6ad0: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
6ae0: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
6af0: 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
6b00: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6b10: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
6b20: 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ce ?CALLBACK?.  
6b30: 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
6b40: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
6b50: 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
6b60: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63   routine for eac
6b70: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
6b80: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65    ** that is exe
6b90: 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74  cuted.  The text
6ba0: 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61   of the SQL is a
6bb0: 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
6bc0: 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  ACK before.  ** 
6bd0: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
6be0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
6bf0: 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  RACE: {.    if( 
6c00: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
6c10: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6c20: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
6c30: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
6c40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
6c50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
6c60: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
6c70: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
6c80: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
6c90: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6ca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
6cb0: 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20  >zTrace, 0);.   
6cc0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
6cd0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61        char *zTra
6ce0: 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ce;.      int le
6cf0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
6d00: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
6d10: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
6d20: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20  ->zTrace);.     
6d30: 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20   }.      zTrace 
6d40: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6d50: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
6d60: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
6d70: 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30   zTrace && len>0
6d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
6d90: 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c  >zTrace = Tcl_Al
6da0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
6db0: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
6dc0: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61  Db->zTrace, zTra
6dd0: 63 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ce);.      }else
6de0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
6df0: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
6e00: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
6e10: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
6e20: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
6e30: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
6e40: 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
6e50: 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65  pDb->db, DbTrace
6e60: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
6e70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6e80: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
6e90: 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  e(pDb->db, 0, 0)
6ea0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6eb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6ec0: 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
6ed0: 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d 65  e SWITCH stateme
6ee0: 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  nt */.  return r
6ef0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71  c;.}../*.**   sq
6f00: 6c 69 74 65 20 44 42 4e 41 4d 45 20 46 49 4c 45  lite DBNAME FILE
6f10: 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65  NAME ?MODE? ?-ke
6f20: 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69  y KEY?.**.** Thi
6f30: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63  s is the main Tc
6f40: 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e  l command.  When
6f50: 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54 63   the "sqlite" Tc
6f60: 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20  l command is.** 
6f70: 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f  invoked, this ro
6f80: 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72  utine runs to pr
6f90: 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61  ocess that comma
6fa0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  nd..**.** The fi
6fb0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42  rst argument, DB
6fc0: 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69  NAME, is an arbi
6fd0: 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61  trary name for a
6fe0: 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65   new.** database
6ff0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
7000: 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74  is command creat
7010: 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64  es a new command
7020: 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45   named.** DBNAME
7030: 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
7040: 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f   control that co
7050: 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64  nnection.  The d
7060: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
7070: 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64  ction is deleted
7080: 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45   when the DBNAME
7090: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65   command is dele
70a0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
70b0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
70c0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
70d0: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
70e0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
70f0: 20 73 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   sqlite database
7100: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 61   that is to be a
7110: 63 63 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  ccessed..**.** F
7120: 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
7130: 73 65 73 2c 20 77 65 20 61 6c 73 6f 20 73 75 70  ses, we also sup
7140: 70 6f 72 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  port the followi
7150: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  ng:.**.**  sqlit
7160: 65 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a 2a  e -encoding.**.*
7170: 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74  *       Return t
7180: 68 65 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  he encoding used
7190: 20 62 79 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f   by LIKE and GLO
71a0: 42 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 43 68  B operators.  Ch
71b0: 6f 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 61  oices.**       a
71c0: 72 65 20 55 54 46 2d 38 20 61 6e 64 20 69 73 6f  re UTF-8 and iso
71d0: 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c  8859..**.**  sql
71e0: 69 74 65 20 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a  ite -version.**.
71f0: 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20  **       Return 
7200: 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
7210: 65 72 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  er of the SQLite
7220: 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20   library..**.** 
7230: 20 73 71 6c 69 74 65 20 2d 74 63 6c 2d 75 73 65   sqlite -tcl-use
7240: 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20  s-utf.**.**     
7250: 20 20 52 65 74 75 72 6e 20 22 31 22 20 69 66 20    Return "1" if 
7260: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61 20  compiled with a 
7270: 54 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e 20  Tcl uses UTF-8. 
7280: 20 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a 2a   Return "0" if.*
7290: 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55 73  *       not.  Us
72a0: 65 64 20 62 79 20 74 65 73 74 73 20 74 6f 20 6d  ed by tests to m
72b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69 62  ake sure the lib
72c0: 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
72d0: 64 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72 72  d .**       corr
72e0: 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
72f0: 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64   int DbMain(void
7300: 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70   *cd, Tcl_Interp
7310: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
7320: 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  jc,Tcl_Obj *cons
7330: 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74  t*objv){.  Sqlit
7340: 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a  eDb *p;.  void *
7350: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pKey = 0;.  int 
7360: 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  nKey = 0;.  cons
7370: 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
7380: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
7390: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
73a0: 6c 65 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  le;.  char zBuf[
73b0: 38 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d  80];.  if( objc=
73c0: 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  =2 ){.    zArg =
73d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
73e0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
73f0: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
7400: 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e  p(zArg,"-version
7410: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
7420: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7430: 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76  interp,sqlite3_v
7440: 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20  ersion,0);.     
7450: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7460: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
7470: 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d  rcmp(zArg,"-has-
7480: 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69  codec")==0 ){.#i
7490: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
74a0: 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f  CODEC.      Tcl_
74b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
74c0: 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73  erp,"1",0);.#els
74d0: 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  e.      Tcl_Appe
74e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
74f0: 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20  "0",0);.#endif. 
7500: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
7510: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
7520: 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
7530: 74 63 6c 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d  tcl-uses-utf")==
7540: 30 20 29 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f  0 ){.#ifdef TCL_
7550: 55 54 46 5f 4d 41 58 0a 20 20 20 20 20 20 54 63  UTF_MAX.      Tc
7560: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7570: 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65  nterp,"1",0);.#e
7580: 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  lse.      Tcl_Ap
7590: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
75a0: 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66  p,"0",0);.#endif
75b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
75c0: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  L_OK;.    }.  }.
75d0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c    if( objc==5 ||
75e0: 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20   objc==6 ){.    
75f0: 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
7600: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
7610: 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b 0a 20 20  [objc-2], 0);.  
7620: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
7630: 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a  g,"-key")==0 ){.
7640: 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c        pKey = Tcl
7650: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
7660: 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31  mObj(objv[objc-1
7670: 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20  ], &nKey);.     
7680: 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20 20 20 20   objc -= 2;.    
7690: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  }.  }.  if( objc
76a0: 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=3 && objc!=4 )
76b0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
76c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
76d0: 2c 20 6f 62 6a 76 2c 20 0a 23 69 66 64 65 66 20  , objv, .#ifdef 
76e0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
76f0: 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46  .      "HANDLE F
7700: 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79 20 43 4f  ILENAME ?-key CO
7710: 44 45 43 2d 4b 45 59 3f 22 0a 23 65 6c 73 65 0a  DEC-KEY?".#else.
7720: 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49        "HANDLE FI
7730: 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23  LENAME ?MODE?".#
7740: 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20  endif.    );.   
7750: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7760: 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67  R;.  }.  zErrMsg
7770: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c   = 0;.  p = (Sql
7780: 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63  iteDb*)Tcl_Alloc
7790: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
77a0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
77b0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
77c0: 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20  interp, "malloc 
77d0: 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41  failed", TCL_STA
77e0: 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
77f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
7800: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
7810: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46  izeof(*p));.  zF
7820: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
7830: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
7840: 32 5d 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  2], 0);.#ifdef S
7850: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
7860: 20 20 70 2d 3e 64 62 20 3d 20 73 71 6c 69 74 65    p->db = sqlite
7870: 33 5f 6f 70 65 6e 5f 65 6e 63 72 79 70 74 65 64  3_open_encrypted
7880: 28 7a 46 69 6c 65 2c 20 70 4b 65 79 2c 20 6e 4b  (zFile, pKey, nK
7890: 65 79 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29  ey, 0, &zErrMsg)
78a0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
78b0: 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 26 70  3_open(zFile, &p
78c0: 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20 53 51 4c  ->db);.  if( SQL
78d0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
78e0: 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29  errcode(p->db) )
78f0: 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  {.    zErrMsg = 
7900: 73 74 72 64 75 70 28 73 71 6c 69 74 65 33 5f 65  strdup(sqlite3_e
7910: 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
7920: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
7930: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e  (p->db);.    p->
7940: 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  db = 0;.  }.#end
7950: 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
7960: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
7970: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
7980: 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
7990: 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
79a0: 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
79b0: 20 20 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29     free(zErrMsg)
79c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
79d0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 41  _ERROR;.  }.  zA
79e0: 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
79f0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
7a00: 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ], 0);.  Tcl_Cre
7a10: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
7a20: 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
7a30: 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20  jCmd, (char*)p, 
7a40: 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 0a 20  DbDeleteCmd);.. 
7a50: 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76   /* The return v
7a60: 61 6c 75 65 20 69 73 20 74 68 65 20 76 61 6c 75  alue is the valu
7a70: 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 2a  e of the sqlite*
7a80: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2f 0a 20 20   pointer.  */.  
7a90: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
7aa0: 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 69 66  p", p->db);.  if
7ab0: 28 20 73 74 72 6e 63 6d 70 28 7a 42 75 66 2c 22  ( strncmp(zBuf,"
7ac0: 30 78 22 2c 32 29 20 29 7b 0a 20 20 20 20 73 70  0x",2) ){.    sp
7ad0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 30 78 25  rintf(zBuf, "0x%
7ae0: 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 7d 0a  p", p->db);.  }.
7af0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7b00: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
7b10: 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 6f   0);..  /* If co
7b20: 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
7b30: 54 45 5f 54 45 53 54 20 74 75 72 6e 65 64 20 6f  TE_TEST turned o
7b40: 6e 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  n, then register
7b50: 20 74 68 65 20 22 6d 64 35 73 75 6d 22 0a 20 20   the "md5sum".  
7b60: 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  ** SQL function.
7b70: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
7b80: 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20  ITE_TEST.  {.   
7b90: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 4d 64 35   extern void Md5
7ba0: 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65  _Register(sqlite
7bb0: 2a 29 3b 0a 20 20 20 20 4d 64 35 5f 52 65 67 69  *);.    Md5_Regi
7bc0: 73 74 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  ster(p->db);.   
7bd0: 7d 0a 23 65 6e 64 69 66 20 20 0a 20 20 70 2d 3e  }.#endif  .  p->
7be0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
7bf0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
7c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  ;.}../*.** Provi
7c10: 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49  de a dummy Tcl_I
7c20: 6e 69 74 53 74 75 62 73 20 69 66 20 77 65 20 61  nitStubs if we a
7c30: 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 61 73  re using this as
7c40: 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62   a static.** lib
7c50: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rary..*/.#ifndef
7c60: 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23   USE_TCL_STUBS.#
7c70: 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74   undef  Tcl_Init
7c80: 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54  Stubs.# define T
7c90: 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62  cl_InitStubs(a,b
7ca0: 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
7cb0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
7cc0: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20  s module..**.** 
7cd0: 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20  This Tcl module 
7ce0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20  contains only a 
7cf0: 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63  single new Tcl c
7d00: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71  ommand named "sq
7d10: 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65  lite"..** (Hence
7d20: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d   there is no nam
7d30: 65 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69  espace.  There i
7d40: 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73  s no point in us
7d50: 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a  ing a namespace.
7d60: 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73  ** if the extens
7d70: 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65  ion only supplie
7d80: 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29  s one new name!)
7d90: 20 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63    The "sqlite" c
7da0: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65  ommand is.** use
7db0: 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  d to open a new 
7dc0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
7dd0: 20 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e    See the DbMain
7de0: 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65  () routine above
7df0: 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
7e00: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
7e10: 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 33 5f 49  */.int Sqlite3_I
7e20: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
7e30: 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49  interp){.  Tcl_I
7e40: 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
7e50: 20 22 38 2e 30 22 2c 20 30 29 3b 0a 20 20 54 63   "8.0", 0);.  Tc
7e60: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
7e70: 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
7e80: 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d  te3", (Tcl_ObjCm
7e90: 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30  dProc*)DbMain, 0
7ea0: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50  , 0);.  Tcl_PkgP
7eb0: 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
7ec0: 73 71 6c 69 74 65 33 22 2c 20 22 33 2e 30 22 29  sqlite3", "3.0")
7ed0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
7ee0: 4b 3b 0a 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69  K;.}.int Tclsqli
7ef0: 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
7f00: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
7f10: 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
7f20: 74 65 72 70 2c 20 22 38 2e 30 22 2c 20 30 29 3b  terp, "8.0", 0);
7f30: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
7f40: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
7f50: 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f  "sqlite3", (Tcl_
7f60: 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
7f70: 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
7f80: 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
7f90: 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 22  rp, "sqlite3", "
7fa0: 33 2e 30 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  3.0");.  return 
7fb0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 53 71  TCL_OK;.}.int Sq
7fc0: 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54  lite3_SafeInit(T
7fd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7fe0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p){.  return TCL
7ff0: 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 54 63 6c 73 71  _OK;.}.int Tclsq
8000: 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54  lite3_SafeInit(T
8010: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8020: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p){.  return TCL
8030: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a  _OK;.}..#if 0./*
8040: 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  .** If compiled 
8050: 75 73 69 6e 67 20 6d 6b 74 63 6c 61 70 70 2c 20  using mktclapp, 
8060: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
8070: 73 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  s to initialize.
8080: 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 2a  ** everything..*
8090: 2f 0a 69 6e 74 20 45 74 5f 41 70 70 49 6e 69 74  /.int Et_AppInit
80a0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
80b0: 65 72 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  erp){.  return S
80c0: 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
80d0: 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  rp);.}.#endif../
80e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
80f0: 6f 20 54 43 4c 53 48 20 69 73 20 64 65 66 69 6e  o TCLSH is defin
8100: 65 64 20 61 6e 64 20 69 73 20 6f 6e 65 2c 20 74  ed and is one, t
8110: 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20  hen put in code 
8120: 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e  for the.** "main
8130: 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  " routine that w
8140: 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54  ill initialize T
8150: 63 6c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  cl..*/.#if defin
8160: 65 64 28 54 43 4c 53 48 29 20 26 26 20 54 43 4c  ed(TCLSH) && TCL
8170: 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61  SH==1.static cha
8180: 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a  r zMainloop[] =.
8190: 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
81a0: 22 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f  ".  "while {![eo
81b0: 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20  f stdin]} {\n". 
81c0: 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c     "if {$line!=\
81d0: 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
81e0: 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
81f0: 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"> \"\n".    "
8200: 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
8210: 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
8220: 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20  ne \"% \"\n".   
8230: 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73   "}\n".    "flus
8240: 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20  h stdout\n".    
8250: 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
8260: 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
8270: 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70   "if {[info comp
8280: 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e  lete $line]} {\n
8290: 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61  ".      "if {[ca
82a0: 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20  tch {uplevel #0 
82b0: 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20  $line} result]} 
82c0: 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
82d0: 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f  ts stderr \"Erro
82e0: 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a  r: $result\"\n".
82f0: 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20        "} elseif 
8300: 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20  {$result!=\"\"} 
8310: 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
8320: 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20  ts $result\n".  
8330: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
8340: 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
8350: 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
8360: 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c  .      "append l
8370: 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22  ine \\n\n".    "
8380: 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 0a  }\n".  "}\n".;..
8390: 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41  #define TCLSH_MA
83a0: 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65  IN main   /* Nee
83b0: 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20  ded to fake out 
83c0: 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20  mktclapp */.int 
83d0: 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61  TCLSH_MAIN(int a
83e0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
83f0: 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
8400: 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46  *interp;.  Tcl_F
8410: 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61 72  indExecutable(ar
8420: 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70  gv[0]);.  interp
8430: 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74   = Tcl_CreateInt
8440: 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74 65 33  erp();.  Sqlite3
8450: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
8460: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8470: 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  T.  {.    extern
8480: 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
8490: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
84a0: 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
84b0: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_I
84c0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
84d0: 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
84e0: 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
84f0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
8500: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
8510: 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
8520: 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
8530: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
8540: 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
8550: 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
8560: 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49  extern int Md5_I
8570: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
8580: 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
8590: 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
85a0: 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
85b0: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
85c0: 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
85d0: 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
85e0: 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
85f0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
8600: 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
8610: 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d 64 35 5f  nterp);.    Md5_
8620: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
8630: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61  }.#endif.  if( a
8640: 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e  rgc>=2 ){.    in
8650: 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  t i;.    Tcl_Set
8660: 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
8670: 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
8680: 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
8690: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
86a0: 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
86b0: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
86c0: 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  .    for(i=2; i<
86d0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
86e0: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
86f0: 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67  erp, "argv", arg
8700: 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[i],.          
8710: 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20  TCL_GLOBAL_ONLY 
8720: 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  | TCL_LIST_ELEME
8730: 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f  NT | TCL_APPEND_
8740: 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20  VALUE);.    }.  
8750: 20 20 69 66 28 20 54 63 6c 5f 45 76 61 6c 46 69    if( Tcl_EvalFi
8760: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
8770: 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  1])!=TCL_OK ){. 
8780: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8790: 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74  *zInfo = Tcl_Get
87a0: 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72  Var(interp, "err
87b0: 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f  orInfo", TCL_GLO
87c0: 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BAL_ONLY);.     
87d0: 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20   if( zInfo==0 ) 
87e0: 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e  zInfo = interp->
87f0: 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70  result;.      fp
8800: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
8810: 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20  : %s\n", *argv, 
8820: 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65  zInfo);.      re
8830: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
8840: 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 47  }else{.    Tcl_G
8850: 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70  lobalEval(interp
8860: 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20  , zMainloop);.  
8870: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
8880: 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20  #endif /* TCLSH 
8890: 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  */..#endif /* !d
88a0: 65 66 69 6e 65 64 28 4e 4f 5f 54 43 4c 29 20 2a  efined(NO_TCL) *
88b0: 2f 0a                                            /.