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

Artifact b7dd8b3531b70188d03354db530de0f2ffcac697:


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 31  clsqlite.c,v 1.1
01b0: 30 33 20 32 30 30 34 2f 30 38 2f 32 36 20 30 30  03 2004/08/26 00
01c0: 3a 35 36 3a 30 35 20 64 72 68 20 45 78 70 20 24  :56:05 drh Exp $
01d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54  .*/.#ifndef NO_T
01e0: 43 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74  CL     /* Omit t
01f0: 68 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69  his whole file i
0200: 66 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c  f TCL is unavail
0210: 61 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  able */..#includ
0220: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0230: 23 69 6e 63 6c 75 64 65 20 22 68 61 73 68 2e 68  #include "hash.h
0240: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
0250: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0260: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0270: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0280: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a  ude <assert.h>..
0290: 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c 20 75 73 65  /*.** If TCL use
02a0: 73 20 55 54 46 2d 38 20 61 6e 64 20 53 51 4c 69  s UTF-8 and SQLi
02b0: 74 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  te is configured
02c0: 20 74 6f 20 75 73 65 20 69 73 6f 38 38 35 39 2c   to use iso8859,
02d0: 20 74 68 65 6e 20 77 65 0a 2a 2a 20 68 61 76 65   then we.** have
02e0: 20 74 6f 20 64 6f 20 61 20 74 72 61 6e 73 6c 61   to do a transla
02f0: 74 69 6f 6e 20 77 68 65 6e 20 67 6f 69 6e 67 20  tion when going 
0300: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 2e  between the two.
0310: 20 20 53 65 74 20 74 68 65 20 0a 2a 2a 20 55 54    Set the .** UT
0320: 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45  F_TRANSLATION_NE
0330: 45 44 45 44 20 6d 61 63 72 6f 20 74 6f 20 69 6e  EDED macro to in
0340: 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20 6e  dicate that we n
0350: 65 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74 68 69  eed to do.** thi
0360: 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 20 20  s translation.  
0370: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
0380: 54 43 4c 5f 55 54 46 5f 4d 41 58 29 20 26 26 20  TCL_UTF_MAX) && 
0390: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
03a0: 55 54 46 38 29 0a 23 20 64 65 66 69 6e 65 20 55  UTF8).# define U
03b0: 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e  TF_TRANSLATION_N
03c0: 45 45 44 45 44 20 31 0a 23 65 6e 64 69 66 0a 0a  EEDED 1.#endif..
03d0: 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c 20 66 75  /*.** New SQL fu
03e0: 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 63  nctions can be c
03f0: 72 65 61 74 65 64 20 61 73 20 54 43 4c 20 73 63  reated as TCL sc
0400: 72 69 70 74 73 2e 20 20 45 61 63 68 20 73 75 63  ripts.  Each suc
0410: 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  h function.** is
0420: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61 6e   described by an
0430: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0440: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
0450: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ture..*/.typedef
0460: 20 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20   struct SqlFunc 
0470: 53 71 6c 46 75 6e 63 3b 0a 73 74 72 75 63 74 20  SqlFunc;.struct 
0480: 53 71 6c 46 75 6e 63 20 7b 0a 20 20 54 63 6c 5f  SqlFunc {.  Tcl_
0490: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
04a0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
04b0: 65 72 70 72 65 74 20 74 6f 20 65 78 65 63 75 74  erpret to execut
04c0: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  e the function *
04d0: 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70  /.  char *zScrip
04e0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
04f0: 20 73 63 72 69 70 74 20 74 6f 20 62 65 20 72 75   script to be ru
0500: 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a  n */.  SqlFunc *
0510: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  pNext;       /* 
0520: 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  Next function on
0530: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65   the list of the
0540: 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  m all */.};../*.
0550: 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e  ** New collation
0560: 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74   sequences funct
0570: 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74  ion can be creat
0580: 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74  ed as TCL script
0590: 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a  s.  Each such.**
05a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73   function is des
05b0: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
05c0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
05d0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
05e0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
05f0: 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53  uct SqlCollate S
0600: 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63  qlCollate;.struc
0610: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20  t SqlCollate {. 
0620: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0630: 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43  erp;   /* The TC
0640: 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65  L interpret to e
0650: 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74  xecute the funct
0660: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
0670: 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f  Script;        /
0680: 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20  * The script to 
0690: 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43  be run */.  SqlC
06a0: 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20  ollate *pNext;  
06b0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e       /* Next fun
06c0: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73  ction on the lis
06d0: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
06e0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65  .};../*.** There
06f0: 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
0700: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
0710: 72 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 69  re for each SQLi
0720: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  te database.** t
0730: 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65  hat has been ope
0740: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  ned by the SQLit
0750: 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e  e TCL interface.
0760: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0770: 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c 69  ct SqliteDb Sqli
0780: 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53 71 6c  teDb;.struct Sql
0790: 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65  iteDb {.  sqlite
07a0: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
07b0: 2f 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64 61  /* The "real" da
07c0: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
07d0: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
07e0: 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54   *interp;   /* T
07f0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 75  he interpreter u
0800: 73 65 64 20 66 6f 72 20 74 68 69 73 20 64 61 74  sed for this dat
0810: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
0820: 2a 7a 42 75 73 79 3b 20 20 20 20 20 20 20 20 20  *zBusy;         
0830: 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c   /* The busy cal
0840: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0850: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74  .  char *zCommit
0860: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
0870: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c  commit hook call
0880: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
0890: 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 20    char *zTrace; 
08a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
08b0: 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  race callback ro
08c0: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
08d0: 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20  *zProgress;     
08e0: 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73   /* The progress
08f0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0900: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75  e */.  char *zAu
0910: 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  th;          /* 
0920: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
0930: 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  n callback routi
0940: 6e 65 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20  ne */.  SqlFunc 
0950: 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20 2f 2a  *pFunc;       /*
0960: 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 66 75 6e   List of SQL fun
0970: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 53 71 6c 43  ctions */.  SqlC
0980: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
0990: 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c  ; /* List of SQL
09a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
09b0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ions */.  int rc
09c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
09d0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f  /* Return code o
09e0: 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  f most recent sq
09f0: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a  lite3_exec() */.
0a00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c    Tcl_Obj *pColl
0a10: 61 74 65 4e 65 65 64 65 64 3b 20 20 2f 2a 20 43  ateNeeded;  /* C
0a20: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
0a30: 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  script */.};../*
0a40: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 65  .** This is a se
0a50: 63 6f 6e 64 20 61 6c 74 65 72 6e 61 74 69 76 65  cond alternative
0a60: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 64 61   callback for da
0a70: 74 61 62 61 73 65 20 71 75 65 72 69 65 73 2e 20  tabase queries. 
0a80: 20 41 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20   A the.** first 
0a90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69  column of the fi
0aa0: 72 73 74 20 72 6f 77 20 6f 66 20 74 68 65 20 72  rst row of the r
0ab0: 65 73 75 6c 74 20 69 73 20 6d 61 64 65 20 74 68  esult is made th
0ac0: 65 20 54 43 4c 20 72 65 73 75 6c 74 2e 0a 2a 2f  e TCL result..*/
0ad0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 45 76  .static int DbEv
0ae0: 61 6c 43 61 6c 6c 62 61 63 6b 33 28 0a 20 20 76  alCallback3(.  v
0af0: 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
0b00: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 73 74        /* An inst
0b10: 61 6e 63 65 20 6f 66 20 43 61 6c 6c 62 61 63 6b  ance of Callback
0b20: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  Data */.  int nC
0b30: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
0b40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
0b50: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
0b60: 75 6c 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ult */.  char **
0b70: 20 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 20   azCol,         
0b80: 2f 2a 20 44 61 74 61 20 66 6f 72 20 65 61 63 68  /* Data for each
0b90: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
0ba0: 72 20 2a 2a 20 61 7a 4e 20 20 20 20 20 20 20 20  r ** azN        
0bb0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 66 6f 72 20      /* Name for 
0bc0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29  each column */.)
0bd0: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
0be0: 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e  interp = (Tcl_In
0bf0: 74 65 72 70 2a 29 63 6c 69 65 6e 74 44 61 74 61  terp*)clientData
0c00: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 6c  ;.  Tcl_Obj *pEl
0c10: 65 6d 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d  em;.  if( azCol=
0c20: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
0c30: 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72   if( nCol==0 ) r
0c40: 65 74 75 72 6e 20 31 3b 0a 23 69 66 64 65 66 20  eturn 1;.#ifdef 
0c50: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
0c60: 4e 45 45 44 45 44 0a 20 20 7b 0a 20 20 20 20 54  NEEDED.  {.    T
0c70: 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b  cl_DString dCol;
0c80: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
0c90: 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 20  Init(&dCol);.   
0ca0: 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55   Tcl_ExternalToU
0cb0: 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20  tfDString(NULL, 
0cc0: 61 7a 43 6f 6c 5b 30 5d 2c 20 2d 31 2c 20 26 64  azCol[0], -1, &d
0cd0: 43 6f 6c 29 3b 0a 20 20 20 20 70 45 6c 65 6d 20  Col);.    pElem 
0ce0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
0cf0: 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  bj(Tcl_DStringVa
0d00: 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b  lue(&dCol), -1);
0d10: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
0d20: 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 20 20 7d  Free(&dCol);.  }
0d30: 0a 23 65 6c 73 65 0a 20 20 70 45 6c 65 6d 20 3d  .#else.  pElem =
0d40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
0d50: 6a 28 61 7a 43 6f 6c 5b 30 5d 2c 20 2d 31 29 3b  j(azCol[0], -1);
0d60: 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 53 65  .#endif.  Tcl_Se
0d70: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
0d80: 70 2c 20 70 45 6c 65 6d 29 3b 0a 20 20 72 65 74  p, pElem);.  ret
0d90: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
0da0: 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70  TCL calls this p
0db0: 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e  rocedure when an
0dc0: 20 73 71 6c 69 74 65 33 20 64 61 74 61 62 61 73   sqlite3 databas
0dd0: 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20  e command is.** 
0de0: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
0df0: 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65  ic void DbDelete
0e00: 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20  Cmd(void *db){. 
0e10: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
0e20: 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a   (SqliteDb*)db;.
0e30: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
0e40: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c  pDb->db);.  whil
0e50: 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b  e( pDb->pFunc ){
0e60: 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
0e70: 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63  unc = pDb->pFunc
0e80: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63  ;.    pDb->pFunc
0e90: 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b   = pFunc->pNext;
0ea0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
0eb0: 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d  har*)pFunc);.  }
0ec0: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
0ed0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53  Collate ){.    S
0ee0: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
0ef0: 61 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c  ate = pDb->pColl
0f00: 61 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  ate;.    pDb->pC
0f10: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
0f20: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  e->pNext;.    Tc
0f30: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43  l_Free((char*)pC
0f40: 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69  ollate);.  }.  i
0f50: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
0f60: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
0f70: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20  b->zBusy);.  }. 
0f80: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
0f90: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
0fa0: 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
0fb0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41   }.  if( pDb->zA
0fc0: 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  uth ){.    Tcl_F
0fd0: 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b  ree(pDb->zAuth);
0fe0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28  .  }.  Tcl_Free(
0ff0: 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a  (char*)pDb);.}..
1000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1010: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
1020: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
1030: 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c  e is locked whil
1040: 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65  e trying.** to e
1050: 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73  xecute SQL..*/.s
1060: 74 61 74 69 63 20 69 6e 74 20 44 62 42 75 73 79  tatic int DbBusy
1070: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
1080: 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20  , int nTries){. 
1090: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
10a0: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
10b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
10c0: 20 7a 56 61 6c 5b 33 30 5d 3b 0a 20 20 63 68 61   zVal[30];.  cha
10d0: 72 20 2a 7a 43 6d 64 3b 0a 20 20 54 63 6c 5f 44  r *zCmd;.  Tcl_D
10e0: 53 74 72 69 6e 67 20 63 6d 64 3b 0a 0a 20 20 54  String cmd;..  T
10f0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
1100: 63 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  cmd);.  Tcl_DStr
1110: 69 6e 67 41 70 70 65 6e 64 28 26 63 6d 64 2c 20  ingAppend(&cmd, 
1120: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 2d 31 29 3b  pDb->zBusy, -1);
1130: 0a 20 20 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c  .  sprintf(zVal,
1140: 20 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a   "%d", nTries);.
1150: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
1160: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64 2c  endElement(&cmd,
1170: 20 7a 56 61 6c 29 3b 0a 20 20 7a 43 6d 64 20 3d   zVal);.  zCmd =
1180: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
1190: 65 28 26 63 6d 64 29 3b 0a 20 20 72 63 20 3d 20  e(&cmd);.  rc = 
11a0: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
11b0: 74 65 72 70 2c 20 7a 43 6d 64 29 3b 0a 20 20 54  terp, zCmd);.  T
11c0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
11d0: 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  cmd);.  if( rc!=
11e0: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
11f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1200: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
1210: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1220: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
1230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1240: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
1250: 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72  ed as the 'progr
1260: 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f  ess callback' fo
1270: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  r the database..
1280: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
1290: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  ProgressHandler(
12a0: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
12b0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
12c0: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
12d0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
12e0: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
12f0: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  );.  rc = Tcl_Ev
1300: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
1310: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b  pDb->zProgress);
1320: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
1330: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
1340: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
1350: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
1360: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1370: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1380: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1390: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
13a0: 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63 65  the SQLite trace
13b0: 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65   handler wheneve
13c0: 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b  r a new.** block
13d0: 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63 75   of SQL is execu
13e0: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
13f0: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72  ript in pDb->zTr
1400: 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64 2e  ace is executed.
1410: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1420: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76  DbTraceHandler(v
1430: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
1440: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71  har *zSql){.  Sq
1450: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
1460: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
1470: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
1480: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
1490: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
14a0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
14b0: 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  tr, pDb->zTrace,
14c0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
14d0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
14e0: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
14f0: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
1500: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
1510: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
1520: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
1530: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
1540: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
1550: 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nterp);.}../*.**
1560: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1570: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
1580: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
1590: 6d 6d 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a  mmitted.  The.**
15a0: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
15b0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65  Db->zCommit is e
15c0: 78 65 63 75 74 65 64 2e 20 20 49 66 20 69 74 20  xecuted.  If it 
15d0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
15e0: 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72   or.** if it thr
15f0: 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
1600: 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1610: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1620: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62   instead.** of b
1630: 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  eing committed..
1640: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
1650: 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f  CommitHandler(vo
1660: 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74  id *cd){.  Sqlit
1670: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
1680: 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20  teDb*)cd;.  int 
1690: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f  rc;..  rc = Tcl_
16a0: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
16b0: 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b  , pDb->zCommit);
16c0: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
16d0: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
16e0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
16f0: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
1700: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1710: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1720: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43  static void tclC
1730: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20  ollateNeeded(.  
1740: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71  void *pCtx,.  sq
1750: 6c 69 74 65 20 2a 64 62 2c 0a 20 20 69 6e 74 20  lite *db,.  int 
1760: 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  enc,.  const cha
1770: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71  r *zName.){.  Sq
1780: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
1790: 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a  qliteDb *)pCtx;.
17a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
17b0: 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  pt = Tcl_Duplica
17c0: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c  teObj(pDb->pColl
17d0: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63  ateNeeded);.  Tc
17e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
17f0: 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c  Script);.  Tcl_L
1800: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1810: 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20  ent(0, pScript, 
1820: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1830: 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  (zName, -1));.  
1840: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
1850: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69  b->interp, pScri
1860: 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pt, 0);.  Tcl_De
1870: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
1880: 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pt);.}../*.** Th
1890: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
18a0: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
18b0: 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f   an SQL collatio
18c0: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  n function imple
18d0: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
18e0: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
18f0: 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c  tatic int tclSql
1900: 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  Collate(.  void 
1910: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c  *pCtx,.  int nA,
1920: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1930: 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63  A,.  int nB,.  c
1940: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
1950: 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70  .  SqlCollate *p
1960: 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a   = (SqlCollate *
1970: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
1980: 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20   *pCmd;..  pCmd 
1990: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
19a0: 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d  bj(p->zScript, -
19b0: 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
19c0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
19d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
19e0: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
19f0: 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  rp, pCmd, Tcl_Ne
1a00: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e  wStringObj(zA, n
1a10: 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  A));.  Tcl_ListO
1a20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1a30: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
1a40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1a50: 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63  j(zB, nB));.  Tc
1a60: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
1a70: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b  nterp, pCmd, 0);
1a80: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
1a90: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74  unt(pCmd);.  ret
1aa0: 75 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65  urn (atoi(Tcl_Ge
1ab0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
1ac0: 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f  >interp)));.}../
1ad0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ae0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  e is called to e
1af0: 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66  valuate an SQL f
1b00: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
1b10: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c  ted.** using TCL
1b20: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
1b30: 69 63 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75  ic void tclSqlFu
1b40: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
1b50: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
1b60: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
1b70: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
1b80: 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c  SqlFunc *p = sql
1b90: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
1ba0: 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f 44  ontext);.  Tcl_D
1bb0: 53 74 72 69 6e 67 20 63 6d 64 3b 0a 20 20 69 6e  String cmd;.  in
1bc0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
1bd0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
1be0: 74 28 26 63 6d 64 29 3b 0a 20 20 54 63 6c 5f 44  t(&cmd);.  Tcl_D
1bf0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 63 6d  StringAppend(&cm
1c00: 64 2c 20 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d  d, p->zScript, -
1c10: 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1);.  for(i=0; i
1c20: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1c30: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   if( SQLITE_NULL
1c40: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
1c50: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29 7b  type(argv[i]) ){
1c60: 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69  .      Tcl_DStri
1c70: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
1c80: 26 63 6d 64 2c 20 22 22 29 3b 0a 20 20 20 20 7d  &cmd, "");.    }
1c90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
1ca0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
1cb0: 6d 65 6e 74 28 26 63 6d 64 2c 20 73 71 6c 69 74  ment(&cmd, sqlit
1cc0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1cd0: 67 76 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  gv[i]));.    }. 
1ce0: 20 7d 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76   }.  rc = Tcl_Ev
1cf0: 61 6c 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63  al(p->interp, Tc
1d00: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
1d10: 63 6d 64 29 29 3b 0a 20 20 69 66 28 20 72 63 20  cmd));.  if( rc 
1d20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
1d30: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
1d40: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
1d50: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
1d60: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c  rp), -1); .  }el
1d70: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
1d80: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
1d90: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
1da0: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
1db0: 72 70 29 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  rp), -1, .      
1dc0: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
1dd0: 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  NT);.  }.}..#ifn
1de0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1df0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a  AUTHORIZATION./*
1e00: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
1e10: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
1e20: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70  unction.  It app
1e30: 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e 74  ends the authent
1e40: 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20  ication.** type 
1e50: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f  code and the two
1e60: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43   arguments to zC
1e70: 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65  md[] then invoke
1e80: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
1e90: 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  on the interpret
1ea0: 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69  er.  The reply i
1eb0: 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65  s examined to de
1ec0: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a  termine if the.*
1ed0: 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  * authentication
1ee0: 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65   fails or succee
1ef0: 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
1f00: 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28  t auth_callback(
1f10: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20  .  void *pArg,. 
1f20: 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e   int code,.  con
1f30: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a  st char *zArg1,.
1f40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
1f50: 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg2,.  const cha
1f60: 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73  r *zArg3,.  cons
1f70: 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b  t char *zArg4.){
1f80: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a  .  char *zCode;.
1f90: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
1fa0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  r;.  int rc;.  c
1fb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c  onst char *zRepl
1fc0: 79 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  y;.  SqliteDb *p
1fd0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1fe0: 70 41 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28  pArg;..  switch(
1ff0: 20 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73   code ){.    cas
2000: 65 20 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20  e SQLITE_COPY   
2010: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
2020: 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22  de="SQLITE_COPY"
2030: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
2040: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
2050: 49 4e 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f  INDEX      : zCo
2060: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
2070: 45 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  E_INDEX"; break;
2080: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2090: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20  _CREATE_TABLE   
20a0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
20b0: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22  TE_CREATE_TABLE"
20c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
20d0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
20e0: 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f  TEMP_INDEX : zCo
20f0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
2100: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62  E_TEMP_INDEX"; b
2110: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2120: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
2130: 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d  P_TABLE : zCode=
2140: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
2150: 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  EMP_TABLE"; brea
2160: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2170: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
2180: 52 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53  RIGGER: zCode="S
2190: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
21a0: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
21b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
21c0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
21d0: 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  IEW  : zCode="SQ
21e0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
21f0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
2200: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2210: 52 45 41 54 45 5f 54 52 49 47 47 45 52 20 20 20  REATE_TRIGGER   
2220: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
2230: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 22  _CREATE_TRIGGER"
2240: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
2250: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
2260: 56 49 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f  VIEW       : zCo
2270: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
2280: 45 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  E_VIEW"; break;.
2290: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22a0: 44 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20  DELETE          
22b0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
22c0: 45 5f 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b  E_DELETE"; break
22d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
22e0: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20  E_DROP_INDEX    
22f0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
2300: 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b  ITE_DROP_INDEX";
2310: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2320: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
2330: 4c 45 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  LE        : zCod
2340: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
2350: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
2360: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
2370: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  OP_TEMP_INDEX   
2380: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
2390: 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22  DROP_TEMP_INDEX"
23a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
23b0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
23c0: 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f  MP_TABLE   : zCo
23d0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
23e0: 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  TEMP_TABLE"; bre
23f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2400: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
2410: 49 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53  IGGER : zCode="S
2420: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
2430: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
2440: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2450: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20  _DROP_TEMP_VIEW 
2460: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
2470: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
2480: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
2490: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
24a0: 54 52 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a  TRIGGER      : z
24b0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
24c0: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
24d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
24e0: 54 45 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20  TE_DROP_VIEW    
24f0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
2500: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b  LITE_DROP_VIEW";
2510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2520: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20   SQLITE_INSERT  
2530: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
2540: 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e="SQLITE_INSERT
2550: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
2560: 73 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  se SQLITE_PRAGMA
2570: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
2580: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47  ode="SQLITE_PRAG
2590: 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  MA"; break;.    
25a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
25c0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
25d0: 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  AD"; break;.    
25e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45  case SQLITE_SELE
25f0: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CT            : 
2600: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45  zCode="SQLITE_SE
2610: 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LECT"; break;.  
2620: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
2630: 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20  ANSACTION       
2640: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
2650: 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72  TRANSACTION"; br
2660: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2670: 4c 49 54 45 5f 55 50 44 41 54 45 20 20 20 20 20  LITE_UPDATE     
2680: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
2690: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20  SQLITE_UPDATE"; 
26a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
26b0: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20  SQLITE_ATTACH   
26c0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
26d0: 3d 22 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22  ="SQLITE_ATTACH"
26e0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
26f0: 65 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20  e SQLITE_DETACH 
2700: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
2710: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43  de="SQLITE_DETAC
2720: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  H"; break;.    d
2730: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20  efault          
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a               : z
2750: 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65  Code="????"; bre
2760: 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53  ak;.  }.  Tcl_DS
2770: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
2780: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
2790: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
27a0: 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63  zAuth, -1);.  Tc
27b0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
27c0: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f  lement(&str, zCo
27d0: 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  de);.  Tcl_DStri
27e0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
27f0: 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41  &str, zArg1 ? zA
2800: 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg1 : "");.  Tcl
2810: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
2820: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
2830: 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b  2 ? zArg2 : "");
2840: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
2850: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
2860: 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20  , zArg3 ? zArg3 
2870: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
2880: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
2890: 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20  t(&str, zArg4 ? 
28a0: 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20 72  zArg4 : "");.  r
28b0: 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76  c = Tcl_GlobalEv
28c0: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
28d0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
28e0: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
28f0: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
2900: 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c  ;.  zReply = Tcl
2910: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
2920: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  (pDb->interp);. 
2930: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
2940: 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d  ly,"SQLITE_OK")=
2950: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
2960: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2970: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
2980: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59  ply,"SQLITE_DENY
2990: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
29a0: 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20  = SQLITE_DENY;. 
29b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
29c0: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
29d0: 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a  _IGNORE")==0 ){.
29e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29f0: 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b  IGNORE;.  }else{
2a00: 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20  .    rc = 999;. 
2a10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2a30: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
2a40: 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ATION */../*.** 
2a50: 7a 54 65 78 74 20 69 73 20 61 20 70 6f 69 6e 74  zText is a point
2a60: 65 72 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  er to text obtai
2a70: 6e 65 64 20 76 69 61 20 61 6e 20 73 71 6c 69 74  ned via an sqlit
2a80: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 29  e3_result_text()
2a90: 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72 20 69  .** or similar i
2aa0: 6e 74 65 72 66 61 63 65 2e 20 54 68 69 73 20 72  nterface. This r
2ab0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
2ac0: 20 54 63 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65   Tcl string obje
2ad0: 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ct, .** referenc
2ae0: 65 20 63 6f 75 6e 74 20 73 65 74 20 74 6f 20 30  e count set to 0
2af0: 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  , containing the
2b00: 20 74 65 78 74 2e 20 49 66 20 61 20 74 72 61 6e   text. If a tran
2b10: 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65  slation.** betwe
2b20: 65 6e 20 69 73 6f 38 38 35 39 20 61 6e 64 20 55  en iso8859 and U
2b30: 54 46 2d 38 20 69 73 20 72 65 71 75 69 72 65 64  TF-8 is required
2b40: 2c 20 69 74 20 69 73 20 70 72 65 66 6f 72 6d 65  , it is preforme
2b50: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c  d..*/.static Tcl
2b60: 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62  _Obj *dbTextToOb
2b70: 6a 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  j(char const *zT
2b80: 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ext){.  Tcl_Obj 
2b90: 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66 20 55 54  *pVal;.#ifdef UT
2ba0: 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45  F_TRANSLATION_NE
2bb0: 45 44 45 44 0a 20 20 54 63 6c 5f 44 53 74 72 69  EDED.  Tcl_DStri
2bc0: 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44  ng dCol;.  Tcl_D
2bd0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c  StringInit(&dCol
2be0: 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72 6e 61  );.  Tcl_Externa
2bf0: 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55  lToUtfDString(NU
2c00: 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26  LL, zText, -1, &
2c10: 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20  dCol);.  pVal = 
2c20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2c30: 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75  (Tcl_DStringValu
2c40: 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20  e(&dCol), -1);. 
2c50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
2c60: 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20  (&dCol);.#else. 
2c70: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
2c80: 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20  tringObj(zText, 
2c90: 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  -1);.#endif.  re
2ca0: 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a  turn pVal;.}../*
2cb0: 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22  .** The "sqlite"
2cc0: 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63   command below c
2cd0: 72 65 61 74 65 73 20 61 20 6e 65 77 20 54 63 6c  reates a new Tcl
2ce0: 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63   command for eac
2cf0: 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  h.** connection 
2d00: 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53  it opens to an S
2d10: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
2d20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2d30: 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e   invoked.** when
2d40: 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73  ever one of thos
2d50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65  e connection-spe
2d60: 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69  cific commands i
2d70: 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e  s executed.** in
2d80: 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70   Tcl.  For examp
2d90: 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20 54  le, if you run T
2da0: 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69  cl code like thi
2db0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73  s:.**.**       s
2dc0: 71 6c 69 74 65 20 64 62 31 20 20 22 6d 79 5f 64  qlite db1  "my_d
2dd0: 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20  atabase".**     
2de0: 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a    db1 close.**.*
2df0: 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d  * The first comm
2e00: 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e  and opens a conn
2e10: 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d  ection to the "m
2e20: 79 5f 64 61 74 61 62 61 73 65 22 20 64 61 74 61  y_database" data
2e30: 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c  base.** and call
2e40: 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  s that connectio
2e50: 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20 73 65  n "db1".  The se
2e60: 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75  cond command cau
2e70: 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72  ses this.** subr
2e80: 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76  outine to be inv
2e90: 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oked..*/.static 
2ea0: 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69  int DbObjCmd(voi
2eb0: 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
2ec0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
2ed0: 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  bjc,Tcl_Obj *con
2ee0: 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69  st*objv){.  Sqli
2ef0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
2f00: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
2f10: 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72   choice;.  int r
2f20: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74  c = TCL_OK;.  st
2f30: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2f40: 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  *DB_strs[] = {. 
2f50: 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72 22 2c     "authorizer",
2f60: 20 20 20 20 20 20 20 20 20 22 62 75 73 79 22 2c           "busy",
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
2f80: 68 61 6e 67 65 73 22 2c 0a 20 20 20 20 22 63 6c  hanges",.    "cl
2f90: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
2fa0: 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20 20     "collate",   
2fb0: 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 69          "collati
2fc0: 6f 6e 5f 6e 65 65 64 65 64 22 2c 0a 20 20 20 20  on_needed",.    
2fd0: 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20  "commit_hook",  
2fe0: 20 20 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22        "complete"
2ff0: 2c 20 20 20 20 20 20 20 20 20 20 22 65 72 72 6f  ,          "erro
3000: 72 63 6f 64 65 22 2c 0a 20 20 20 20 22 65 76 61  rcode",.    "eva
3010: 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
3020: 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20    "function",   
3030: 20 20 20 20 20 20 20 22 6c 61 73 74 5f 69 6e 73         "last_ins
3040: 65 72 74 5f 72 6f 77 69 64 22 2c 0a 20 20 20 20  ert_rowid",.    
3050: 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20 20 20 20  "onecolumn",    
3060: 20 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22        "progress"
3070: 2c 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65  ,          "reke
3080: 79 22 2c 0a 20 20 20 20 22 74 69 6d 65 6f 75 74  y",.    "timeout
3090: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 74  ",            "t
30a0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20  otal_changes",  
30b0: 20 20 20 22 74 72 61 63 65 22 2c 0a 20 20 20 20     "trace",.    
30c0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
30d0: 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75       .  };.  enu
30e0: 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20  m DB_enum {.    
30f0: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20  DB_AUTHORIZER,  
3100: 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 20 20        DB_BUSY,  
3110: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 48             DB_CH
3120: 41 4e 47 45 53 2c 0a 20 20 20 20 44 42 5f 43 4c  ANGES,.    DB_CL
3130: 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
3140: 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20   DB_COLLATE,    
3150: 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49        DB_COLLATI
3160: 4f 4e 5f 4e 45 45 44 45 44 2c 0a 20 20 20 20 44  ON_NEEDED,.    D
3170: 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20  B_COMMIT_HOOK,  
3180: 20 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45       DB_COMPLETE
3190: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45 52 52  ,         DB_ERR
31a0: 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44 42 5f 45  ORCODE,.    DB_E
31b0: 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20  VAL,            
31c0: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20    DB_FUNCTION,  
31d0: 20 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49         DB_LAST_I
31e0: 4e 53 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20  NSERT_ROWID,.   
31f0: 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20   DB_ONECOLUMN,  
3200: 20 20 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45         DB_PROGRE
3210: 53 53 2c 20 20 20 20 20 20 20 20 20 44 42 5f 52  SS,         DB_R
3220: 45 4b 45 59 2c 0a 20 20 20 20 44 42 5f 54 49 4d  EKEY,.    DB_TIM
3230: 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 20  EOUT,           
3240: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
3250: 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a 20  ,    DB_TRACE,. 
3260: 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c   };..  if( objc<
3270: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
3280: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
3290: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43  , 1, objv, "SUBC
32a0: 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20  OMMAND ...");.  
32b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
32c0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
32d0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
32e0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
32f0: 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70 74  ], DB_strs, "opt
3300: 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65  ion", 0, &choice
3310: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3320: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
3330: 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
3340: 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20 29  DB_enum)choice )
3350: 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 61  {..  /*    $db a
3360: 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42  uthorizer ?CALLB
3370: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
3380: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
3390: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 68  callback to auth
33a0: 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20 6f  orize each SQL o
33b0: 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20 69  peration as it i
33c0: 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e  s.  ** compiled.
33d0: 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72    5 arguments ar
33e0: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
33f0: 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72  e callback befor
3400: 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76  e it is.  ** inv
3410: 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oked:.  **.  ** 
3420: 20 20 28 31 29 20 54 68 65 20 61 75 74 68 6f 72    (1) The author
3430: 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65 78  ization type (ex
3440: 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  : SQLITE_CREATE_
3450: 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e  TABLE, SQLITE_IN
3460: 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20  SERT, ...).  ** 
3470: 20 20 28 32 29 20 46 69 72 73 74 20 64 65 73 63    (2) First desc
3480: 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64 65  riptive name (de
3490: 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72 69  pends on authori
34a0: 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a  zation type).  *
34b0: 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20 64  *   (3) Second d
34c0: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 0a  escriptive name.
34d0: 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65 20    **   (4) Name 
34e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
34f0: 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65  (ex: "main", "te
3500: 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29 20  mp").  **   (5) 
3510: 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20  Name of trigger 
3520: 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74 68  that is doing th
3530: 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20  e access.  **.  
3540: 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  ** The callback 
3550: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e  should return on
3560: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3570: 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49 54  g strings: SQLIT
3580: 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  E_OK,.  ** SQLIT
3590: 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c  E_IGNORE, or SQL
35a0: 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f  ITE_DENY.  Any o
35b0: 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
35c0: 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20  e is an error.. 
35d0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
35e0: 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b   method is invok
35f0: 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d  ed with no argum
3600: 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65 6e  ents, the curren
3610: 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a  t authorization.
3620: 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74    ** callback st
3630: 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64  ring is returned
3640: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
3650: 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23  _AUTHORIZER: {.#
3660: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
3670: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
3680: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 75  sult(interp, "au
36a0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20  thorization not 
36b0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69  available in thi
36c0: 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20  s build", 0);.  
36d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
36e0: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  OR;.#else.    if
36f0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
3700: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
3710: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
3720: 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
3730: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
3740: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
3750: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
3760: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
3770: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
3780: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3790: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
37a0: 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20 20  ->zAuth, 0);.   
37b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
37c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74        char *zAut
37d0: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  h;.      int len
37e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
37f0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
3800: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3810: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zAuth);.      }.
3820: 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63        zAuth = Tc
3830: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3840: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
3850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  );.      if( zAu
3860: 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  th && len>0 ){. 
3870: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74         pDb->zAut
3880: 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  h = Tcl_Alloc( l
3890: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
38a0: 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 41    strcpy(pDb->zA
38b0: 75 74 68 2c 20 7a 41 75 74 68 29 3b 0a 20 20 20  uth, zAuth);.   
38c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
38d0: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30    pDb->zAuth = 0
38e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
38f0: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
3900: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
3910: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
3920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3930: 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
3940: 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63 61 6c  Db->db, auth_cal
3950: 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20 20 20  lback, pDb);.   
3960: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3970: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
3980: 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62  thorizer(pDb->db
3990: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
39a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
39b0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
39c0: 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79 20 3f  /*    $db busy ?
39d0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
39e0: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
39f0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66  iven callback if
3a00: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
3a10: 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  t attempts to op
3a20: 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64  en.  ** a locked
3a30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
3a40: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42    */.  case DB_B
3a50: 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  USY: {.    if( o
3a60: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
3a70: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
3a80: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
3a90: 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20   "CALLBACK");.  
3aa0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3ab0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
3ac0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
3ad0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
3ae0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
3af0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3b00: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75  interp, pDb->zBu
3b10: 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  sy, 0);.      }.
3b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3b30: 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20   char *zBusy;.  
3b40: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
3b50: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
3b60: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
3b70: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79  _Free(pDb->zBusy
3b80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3b90: 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74   zBusy = Tcl_Get
3ba0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
3bb0: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
3bc0: 20 20 20 20 69 66 28 20 7a 42 75 73 79 20 26 26      if( zBusy &&
3bd0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
3be0: 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54    pDb->zBusy = T
3bf0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
3c00: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
3c10: 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20  cpy(pDb->zBusy, 
3c20: 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 65  zBusy);.      }e
3c30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
3c40: 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20  ->zBusy = 0;.   
3c50: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
3c60: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
3c70: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
3c80: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
3c90: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
3ca0: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
3cb0: 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20   DbBusyHandler, 
3cc0: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
3cd0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
3ce0: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
3cf0: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
3d00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3d10: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
3d20: 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65  /*    $db progre
3d30: 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a  ss ?N CALLBACK?.
3d40: 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b    ** .  ** Invok
3d50: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
3d60: 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72  back every N vir
3d70: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63  tual machine opc
3d80: 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75  odes while execu
3d90: 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65  ting.  ** querie
3da0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
3db0: 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20  B_PROGRESS: {.  
3dc0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
3dd0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
3de0: 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
3df0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
3e00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
3e10: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29  b->zProgress, 0)
3e20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
3e30: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
3e40: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
3e50: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20  Progress;.      
3e60: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
3e70: 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt N;.      if( 
3e80: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
3e90: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
3ea0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29  , objv[2], &N) )
3eb0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
3ec0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ROR;.      };.  
3ed0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
3ee0: 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
3ef0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3f00: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20  zProgress);.    
3f10: 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72    }.      zProgr
3f20: 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ess = Tcl_GetStr
3f30: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
3f40: 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  3], &len);.     
3f50: 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26   if( zProgress &
3f60: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
3f70: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
3f80: 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  s = Tcl_Alloc( l
3f90: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
3fa0: 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50    strcpy(pDb->zP
3fb0: 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65  rogress, zProgre
3fc0: 73 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ss);.      }else
3fd0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
3fe0: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
3ff0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
4000: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
4010: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20  SS_CALLBACK.    
4020: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
4030: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
4040: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
4050: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
4060: 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68  lite3_progress_h
4070: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
4080: 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e  N, DbProgressHan
4090: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
40a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
40b0: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
40c0: 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  s_handler(pDb->d
40d0: 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
40e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
40f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
4100: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
4110: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
4120: 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20  N CALLBACK");.  
4130: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4140: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
4150: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
4160: 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73       $db changes
4170: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
4180: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
4190: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
41a0: 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
41b0: 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79  d, or deleted by
41c0: 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72  .  ** the most r
41d0: 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50  ecent INSERT, UP
41e0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
41f0: 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e  tatement, not in
4200: 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e  cluding .  ** an
4210: 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  y changes made b
4220: 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
4230: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ms..  */.  case 
4240: 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  DB_CHANGES: {.  
4250: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
4260: 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
4270: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
4280: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
4290: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
42a0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
42b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
42c0: 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
42d0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
42e0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
42f0: 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
4300: 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ult, sqlite3_cha
4310: 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
4320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4330: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73    /*    $db clos
4340: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74  e.  **.  ** Shut
4350: 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73  down the databas
4360: 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  e.  */.  case DB
4370: 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63  _CLOSE: {.    Tc
4380: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28  l_DeleteCommand(
4390: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
43a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
43b0: 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62  v[0], 0));.    b
43c0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
43d0: 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f     $db commit_ho
43e0: 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ok ?CALLBACK?.  
43f0: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
4400: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
4410: 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f  k just before co
4420: 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20 53  mmitting every S
4430: 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  QL transaction..
4440: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
4450: 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65  back throws an e
4460: 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75  xception or retu
4470: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
4480: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  en the.  ** tran
4490: 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74  saction is abort
44a0: 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b  ed.  If CALLBACK
44b0: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
44c0: 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ing, the callbac
44d0: 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  k.  ** is disabl
44e0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
44f0: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20  DB_COMMIT_HOOK: 
4500: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
4510: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
4520: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
4530: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
4540: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
4550: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4560: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
4570: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
4580: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
4590: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
45a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
45b0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
45c0: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  mit, 0);.      }
45d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
45e0: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
45f0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
4600: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
4610: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
4620: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
4630: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  zCommit);.      
4640: 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20  }.      zCommit 
4650: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
4660: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
4670: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
4680: 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e   zCommit && len>
4690: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
46a0: 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f  ->zCommit = Tcl_
46b0: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
46c0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
46d0: 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a  (pDb->zCommit, z
46e0: 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  Commit);.      }
46f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
4700: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a  b->zCommit = 0;.
4710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4720: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
4730: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
4740: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
4750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4760: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
4770: 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e  >db, DbCommitHan
4780: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
4790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
47a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
47b0: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c  hook(pDb->db, 0,
47c0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
47d0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
47e0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
47f0: 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d   $db collate NAM
4800: 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
4810: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
4820: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
4830: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
4840: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
4850: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
4860: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
4870: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
4880: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
4890: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
48a0: 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  DB_COLLATE: {.  
48b0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
48c0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72  ollate;.    char
48d0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
48e0: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
48f0: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
4900: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
4910: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
4920: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
4930: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
4940: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
4950: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4960: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
4970: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
4980: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
4990: 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
49a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
49b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
49c0: 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
49d0: 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f  Collate = (SqlCo
49e0: 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63  llate*)Tcl_Alloc
49f0: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61  ( sizeof(*pColla
4a00: 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20  te) + nScript + 
4a10: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  1 );.    if( pCo
4a20: 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72  llate==0 ) retur
4a30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
4a40: 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72   pCollate->inter
4a50: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
4a60: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20  pCollate->pNext 
4a70: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
4a80: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a  .    pCollate->z
4a90: 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29  Script = (char*)
4aa0: 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20  &pCollate[1];.  
4ab0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
4ac0: 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  = pCollate;.    
4ad0: 73 74 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d  strcpy(pCollate-
4ae0: 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70  >zScript, zScrip
4af0: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  t);.    if( sqli
4b00: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
4b10: 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
4b20: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
4b30: 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  , .        pColl
4b40: 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61  ate, tclSqlColla
4b50: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  te) ){.      ret
4b60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4b70: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
4b80: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4b90: 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e     $db collation
4ba0: 5f 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20  _needed SCRIPT. 
4bb0: 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
4bc0: 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74  a new SQL collat
4bd0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ion function cal
4be0: 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65  led NAME.  Whene
4bf0: 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75  ver.  ** that fu
4c00: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4c10: 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20  , invoke SCRIPT 
4c20: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
4c30: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
4c40: 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49   case DB_COLLATI
4c50: 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20  ON_NEEDED: {.   
4c60: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
4c70: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
4c80: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
4c90: 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22  , objv, "SCRIPT"
4ca0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4cb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
4cc0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43  .    if( pDb->pC
4cd0: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a  ollateNeeded ){.
4ce0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
4cf0: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
4d00: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
4d10: 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c   }.    pDb->pCol
4d20: 6c 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c  lateNeeded = Tcl
4d30: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62  _DuplicateObj(ob
4d40: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f  jv[2]);.    Tcl_
4d50: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  IncrRefCount(pDb
4d60: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
4d70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
4d80: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
4d90: 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63  pDb->db, pDb, tc
4da0: 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  lCollateNeeded);
4db0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4dc0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d  .  /*    $db com
4dd0: 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20  plete SQL.  **. 
4de0: 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20   ** Return TRUE 
4df0: 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70  if SQL is a comp
4e00: 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
4e10: 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  nt.  Return FALS
4e20: 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69  E if.  ** additi
4e30: 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e  onal lines of in
4e40: 70 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20  put are needed. 
4e50: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
4e60: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69   to the.  ** bui
4e70: 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70  lt-in "info comp
4e80: 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66  lete" command of
4e90: 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   Tcl..  */.  cas
4ea0: 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b  e DB_COMPLETE: {
4eb0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
4ec0: 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69  esult;.    int i
4ed0: 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69  sComplete;.    i
4ee0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
4ef0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
4f00: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
4f10: 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20  objv, "SQL");.  
4f20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4f30: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
4f40: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c  isComplete = sql
4f50: 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54  ite3_complete( T
4f60: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
4f70: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20  Obj(objv[2], 0) 
4f80: 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
4f90: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
4fa0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
4fb0: 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_SetBooleanObj
4fc0: 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70  (pResult, isComp
4fd0: 6c 65 74 65 29 3b 0a 20 20 20 20 62 72 65 61 6b  lete);.    break
4fe0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
4ff0: 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64      $db errorcod
5000: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  e.  **.  ** Retu
5010: 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65  rn the numeric e
5020: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77  rror code that w
5030: 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  as returned by t
5040: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20  he most recent. 
5050: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
5060: 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f  te3_exec()..  */
5070: 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52  .  case DB_ERROR
5080: 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  CODE: {.    Tcl_
5090: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
50a0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
50b0: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  bj(sqlite3_errco
50c0: 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  de(pDb->db)));. 
50d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
50e0: 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24   .  /*.  **    $
50f0: 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72  db eval $sql ?ar
5100: 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65  ray? ?{  ...code
5110: 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  ... }?.  **.  **
5120: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
5130: 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
5140: 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
5150: 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
5160: 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
5170: 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
5180: 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
5190: 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
51a0: 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
51b0: 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
51c0: 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
51d0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
51e0: 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
51f0: 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
5200: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
5210: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
5220: 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
5230: 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
5240: 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
5250: 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
5260: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
5270: 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
5280: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
5290: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
52a0: 56 41 4c 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  VAL: {.    char 
52b0: 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20  const *zSql;    
52c0: 20 20 2f 2a 20 4e 65 78 74 20 53 51 4c 20 73 74    /* Next SQL st
52d0: 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
52e0: 74 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  te */.    char c
52f0: 6f 6e 73 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20  onst *zLeft;    
5300: 20 2f 2a 20 57 68 61 74 20 69 73 20 6c 65 66 74   /* What is left
5310: 20 61 66 74 65 72 20 66 69 72 73 74 20 73 74 6d   after first stm
5320: 74 20 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20  t in zSql */.   
5330: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
5340: 53 74 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69  Stmt;   /* Compi
5350: 6c 65 64 20 53 51 4c 20 73 74 61 74 6d 65 6e 74  led SQL statment
5360: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
5370: 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 2f  *pArray;       /
5380: 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20  * Name of array 
5390: 69 6e 74 6f 20 77 68 69 63 68 20 72 65 73 75 6c  into which resul
53a0: 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 2a  ts are written *
53b0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
53c0: 53 63 72 69 70 74 3b 20 20 20 20 20 20 2f 2a 20  Script;      /* 
53d0: 53 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f  Script to run fo
53e0: 72 20 65 61 63 68 20 72 65 73 75 6c 74 20 73 65  r each result se
53f0: 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  t */.    Tcl_Obj
5400: 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20 20 20   **apParm;      
5410: 2f 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 68  /* Parameters th
5420: 61 74 20 6e 65 65 64 20 61 20 54 63 6c 5f 44 65  at need a Tcl_De
5430: 63 72 52 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a  crRefCount() */.
5440: 20 20 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20      int nParm;  
5450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5460: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
5470: 75 73 65 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d  used in apParm[]
5480: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
5490: 2a 61 50 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f  *aParm[10];    /
54a0: 2a 20 53 74 61 74 69 63 20 73 70 61 63 65 20 66  * Static space f
54b0: 6f 72 20 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74  or apParm[] in t
54c0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
54d0: 2f 0a 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  /..    Tcl_Obj *
54e0: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
54f0: 6a 28 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  j();.    Tcl_Inc
5500: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
5510: 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33  ..    if( objc<3
5520: 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20   || objc>5 ){.  
5530: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
5540: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
5550: 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41  objv, "SQL ?ARRA
5560: 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f  Y-NAME? ?SCRIPT?
5570: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
5580: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5590: 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
55a0: 33 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61  3 ){.      pArra
55b0: 79 20 3d 20 70 53 63 72 69 70 74 20 3d 20 30 3b  y = pScript = 0;
55c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
55d0: 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
55e0: 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20  pArray = 0;.    
55f0: 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
5600: 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [3];.    }else{.
5610: 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f        pArray = o
5620: 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 69 66  bjv[3];.      if
5630: 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  ( Tcl_GetString(
5640: 70 41 72 72 61 79 29 5b 30 5d 3d 3d 30 20 29 20  pArray)[0]==0 ) 
5650: 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20  pArray = 0;.    
5660: 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
5670: 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  [4];.    }..    
5680: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5690: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7a  (objv[2]);.    z
56a0: 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
56b0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
56c0: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 77 68 69 6c  2], 0);.    whil
56d0: 65 28 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20  e( zSql[0] ){.  
56e0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
56f0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
5700: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61  */.      int nVa
5710: 72 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  r;   /* Number o
5720: 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74  f wildcards in t
5730: 68 65 20 53 51 4c 20 2a 2f 0a 20 20 20 20 20 20  he SQL */.      
5740: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 2f 2a 20 4e  int nCol;   /* N
5750: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5760: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5770: 65 74 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f  et */.      Tcl_
5780: 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20  Obj **apColName 
5790: 3d 20 30 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  = 0;   /* Array 
57a0: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
57b0: 2a 2f 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43  */.  .      /* C
57c0: 6f 6d 70 69 6c 65 20 61 20 73 69 6e 67 6c 65 20  ompile a single 
57d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
57e0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
57f0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72  E_OK!=sqlite3_pr
5800: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
5810: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5820: 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20 20   &zLeft) ){.    
5830: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
5840: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54  sult(interp, dbT
5850: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
5860: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
5870: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
5880: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5890: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
58a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53 74   }.      if( pSt
58b0: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt==0 ){.       
58c0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
58d0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
58e0: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
58f0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
5900: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
5910: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
5920: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
5930: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b)));.          
5940: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
5950: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5960: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
5970: 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d            zSql =
5980: 20 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20   zLeft;.        
5990: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
59a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
59b0: 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c       /* Bind val
59c0: 75 65 73 20 74 6f 20 77 69 6c 64 63 61 72 64 73  ues to wildcards
59d0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
59e0: 20 24 20 6f 72 20 3a 20 2a 2f 20 20 0a 20 20 20   $ or : */  .   
59f0: 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65     nVar = sqlite
5a00: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
5a10: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
5a20: 20 20 20 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a       nParm = 0;.
5a30: 20 20 20 20 20 20 69 66 28 20 6e 56 61 72 3e 73        if( nVar>s
5a40: 69 7a 65 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a  izeof(aParm)/siz
5a50: 65 6f 66 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b  eof(aParm[0]) ){
5a60: 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 20  .        apParm 
5a70: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c  = (Tcl_Obj**)Tcl
5a80: 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65  _Alloc(nVar*size
5a90: 6f 66 28 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a  of(apParm[0]));.
5aa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5ab0: 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 61 50       apParm = aP
5ac0: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  arm;.      }.   
5ad0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e     for(i=1; i<=n
5ae0: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
5af0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5b00: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
5b10: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
5b20: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
5b30: 20 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d       if( zVar[0]
5b40: 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d  =='$' || zVar[0]
5b50: 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20  ==':' ){.       
5b60: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72     Tcl_Obj *pVar
5b70: 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78   = Tcl_GetVar2Ex
5b80: 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31  (interp, &zVar[1
5b90: 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], 0, 0);.      
5ba0: 20 20 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a      if( pVar ){.
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
5bc0: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  n;.            u
5bd0: 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20  8 *data;.       
5be0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65       char *zType
5bf0: 20 3d 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   = pVar->typePtr
5c00: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
5c10: 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20  ->name : "";.   
5c20: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20           char c 
5c30: 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20  = zType[0];.    
5c40: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
5c50: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
5c60: 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d  pe,"bytearray")=
5c70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5c80: 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47      data = Tcl_G
5c90: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
5ca0: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5cc0: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
5cd0: 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c  tmt, i, data, n,
5ce0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
5d00: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5d10: 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pVar);.         
5d20: 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72       apParm[nPar
5d30: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
5d40: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
5d50: 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74  f( (c=='b' && st
5d60: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
5d70: 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  ean")==0) ||.   
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5d90: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
5da0: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
5db0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
5dc0: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
5dd0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
5de0: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
5df0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
5e00: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c  nd_int(pStmt, i,
5e10: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   n);.           
5e20: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64   }else if( c=='d
5e30: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
5e40: 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  e,"double")==0 )
5e50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5e60: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20  double r;.      
5e70: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
5e80: 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
5e90: 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  erp, pVar, &r);.
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
5eb0: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
5ec0: 65 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a  e(pStmt, i, r);.
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
5ee0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
5ef0: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 53   data = Tcl_GetS
5f00: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61  tringFromObj(pVa
5f10: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
5f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
5f30: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
5f40: 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  , data, n, SQLIT
5f50: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
5f60: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
5f70: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
5f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
5f90: 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d  pParm[nParm++] =
5fa0: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20   pVar;.         
5fb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
5fc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5fd0: 20 7d 0a 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a   }.   ..      /*
5fe0: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20   Compute column 
5ff0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e  names */.      n
6000: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
6010: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
6020: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 63  );.      if( pSc
6030: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
6040: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c  apColName = (Tcl
6050: 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63  _Obj**)Tcl_Alloc
6060: 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a  ( sizeof(Tcl_Obj
6070: 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  *)*nCol );.     
6080: 20 20 20 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65     if( apColName
6090: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
60a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
60b0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
60c0: 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b        apColName[
60d0: 69 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a  i] = dbTextToObj
60e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
60f0: 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  name(pStmt,i));.
6100: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
6110: 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c  crRefCount(apCol
6120: 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Name[i]);.      
6130: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
6140: 20 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73     /* If results
6150: 20 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65   are being store
6160: 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61  d in an array va
6170: 72 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65  riable, then cre
6180: 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ate.      ** the
6190: 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20   array(*) entry 
61a0: 66 6f 72 20 74 68 61 74 20 61 72 72 61 79 0a 20  for that array. 
61b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
61c0: 28 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20  ( pArray ){.    
61d0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f      Tcl_Obj *pCo
61e0: 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  lList = Tcl_NewO
61f0: 62 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63  bj();.        Tc
6200: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
6210: 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ColList);.      
6220: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
6230: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
6240: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
6250: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6260: 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70  rp, pColList, ap
6270: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
6280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
6290: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
62a0: 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 54 63  terp, pArray, Tc
62b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
62c0: 2a 22 2c 2d 31 29 2c 20 70 43 6f 6c 4c 69 73 74  *",-1), pColList
62d0: 2c 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ,0);.      }..  
62e0: 20 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74      /* Execute t
62f0: 68 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a  he SQL.      */.
6300: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 74        while( pSt
6310: 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  mt && SQLITE_ROW
6320: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
6330: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stmt) ){.       
6340: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
6350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6360: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
6370: 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
6380: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61        /* Set pVa
6390: 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  l to contain the
63a0: 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i'th column of 
63b0: 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20  this row. */.   
63c0: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
63d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
63e0: 70 65 28 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a  pe(pStmt, i) ){.
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
6400: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
6420: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
6430: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
6440: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
6450: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
6460: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
6470: 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
6480: 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29  n_blob(pStmt, i)
6490: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
64a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
64b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
64c0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
64d0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
64f0: 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73  lite_int64 v = s
6500: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
6510: 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  t64(pStmt, i);. 
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
6530: 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   v>=-2147483647 
6540: 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37  && v<=2147483647
6550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6560: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
6570: 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  ewIntObj(v);.   
6580: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
6590: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
65a0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
65b0: 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  WideIntObj(v);. 
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
65e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
65f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  }.            ca
6600: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
6610: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6620: 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69   double r = sqli
6630: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
6640: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
6650: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
6660: 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  = Tcl_NewDoubleO
6670: 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(r);.         
6680: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6690: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
66a0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
66b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
66c0: 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62  Val = dbTextToOb
66d0: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
66e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29 29  _text(pStmt, i))
66f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6700: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
6710: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
6720: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66  .  .          if
6730: 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20  ( pScript ){.   
6740: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72           if( pAr
6750: 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ray==0 ){.      
6760: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53          Tcl_ObjS
6770: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 61  etVar2(interp, a
6780: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20  pColName[i], 0, 
6790: 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pVal, 0);.      
67a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
67b0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f             Tcl_O
67c0: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
67d0: 2c 20 70 41 72 72 61 79 2c 20 61 70 43 6f 6c 4e  , pArray, apColN
67e0: 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20 30 29  ame[i], pVal, 0)
67f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6800: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
6810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
6820: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6830: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
6840: 65 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20  et, pVal);.     
6850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6860: 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  .  .        if( 
6870: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
6880: 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76       rc = Tcl_Ev
6890: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
68a0: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
68b0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 54         if( rc!=T
68c0: 43 4c 5f 45 52 52 4f 52 20 29 20 72 63 20 3d 20  CL_ERROR ) rc = 
68d0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  TCL_OK;.        
68e0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
68f0: 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6c   /* Free the col
6900: 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65 63 74 73  umn name objects
6910: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53   */.      if( pS
6920: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
6930: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
6940: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6950: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6960: 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  nt(apColName[i])
6970: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6980: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
6990: 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a  ar*)apColName);.
69a0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
69b0: 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64  * Free the bound
69c0: 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62   string and blob
69d0: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
69e0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
69f0: 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nParm; i++){.   
6a00: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
6a10: 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69 5d 29  Count(apParm[i])
6a20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6a30: 69 66 28 20 61 70 50 61 72 6d 21 3d 61 50 61 72  if( apParm!=aPar
6a40: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  m ){.        Tcl
6a50: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70 50  _Free((char*)apP
6a60: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  arm);.      }.. 
6a70: 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65       /* Finalize
6a80: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
6a90: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63   If the result c
6aa0: 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43  ode is SQLITE_SC
6ab0: 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20  HEMA, then.     
6ac0: 20 2a 2a 20 74 72 79 20 61 67 61 69 6e 20 74 6f   ** try again to
6ad0: 20 65 78 65 63 75 74 65 20 74 68 65 20 73 61 6d   execute the sam
6ae0: 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  e statement.    
6af0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53    */.      if( S
6b00: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 73 71  QLITE_SCHEMA==sq
6b10: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
6b20: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stmt) ){.       
6b30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6b40: 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
6b50: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6b60: 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e  e3_errcode(pDb->
6b70: 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 54  db) ){.        T
6b80: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
6b90: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
6ba0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
6bb0: 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  sg(pDb->db)));. 
6bc0: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
6bd0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 62  ERROR;.        b
6be0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6bf0: 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
6c00: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  t;.    }.    Tcl
6c10: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62  _DecrRefCount(ob
6c20: 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28  jv[2]);..    if(
6c30: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
6c40: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
6c50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
6c60: 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  et);.    }.    T
6c70: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6c80: 70 52 65 74 29 3b 0a 0a 20 20 20 20 62 72 65 61  pRet);..    brea
6c90: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
6ca0: 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63 74 69  *     $db functi
6cb0: 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20  on NAME SCRIPT. 
6cc0: 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
6cd0: 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69  a new SQL functi
6ce0: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
6cf0: 20 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66   Whenever that f
6d00: 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  unction is.  ** 
6d10: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
6d20: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
6d30: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
6d40: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46    */.  case DB_F
6d50: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53  UNCTION: {.    S
6d60: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  qlFunc *pFunc;. 
6d70: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
6d80: 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70      char *zScrip
6d90: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69  t;.    int nScri
6da0: 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  pt;.    if( objc
6db0: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
6dc0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6dd0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
6de0: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
6df0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6e00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6e10: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
6e20: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
6e30: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
6e40: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74  Script = Tcl_Get
6e50: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
6e60: 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29  jv[3], &nScript)
6e70: 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 28 53  ;.    pFunc = (S
6e80: 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f  qlFunc*)Tcl_Allo
6e90: 63 28 20 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  c( sizeof(*pFunc
6ea0: 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20  ) + nScript + 1 
6eb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
6ec0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
6ed0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 46 75 6e  _ERROR;.    pFun
6ee0: 63 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  c->interp = inte
6ef0: 72 70 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70  rp;.    pFunc->p
6f00: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Next = pDb->pFun
6f10: 63 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 7a 53  c;.    pFunc->zS
6f20: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
6f30: 70 46 75 6e 63 5b 31 5d 3b 0a 20 20 20 20 70 44  pFunc[1];.    pD
6f40: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  b->pFunc = pFunc
6f50: 3b 0a 20 20 20 20 73 74 72 63 70 79 28 70 46 75  ;.    strcpy(pFu
6f60: 6e 63 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63  nc->zScript, zSc
6f70: 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  ript);.    rc = 
6f80: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
6f90: 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  unction(pDb->db,
6fa0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
6fb0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
6fc0: 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75   pFunc, tclSqlFu
6fd0: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nc, 0, 0);.    i
6fe0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6ff0: 20 29 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f   ) rc = TCL_ERRO
7000: 52 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  R;.    break;.  
7010: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
7020: 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74   $db last_insert
7030: 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a  _rowid .  **.  *
7040: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
7050: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
7060: 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d   ROWID for the m
7070: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
7080: 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t..  */.  case D
7090: 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
70a0: 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  WID: {.    Tcl_O
70b0: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
70c0: 20 69 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20   int rowid;.    
70d0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
70e0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
70f0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
7100: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
7110: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7120: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f  OR;.    }.    ro
7130: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61  wid = sqlite3_la
7140: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
7150: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52  pDb->db);.    pR
7160: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
7170: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
7180: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
7190: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77  Obj(pResult, row
71a0: 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  id);.    break;.
71b0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
71c0: 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e     $db onecolumn
71d0: 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
71e0: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 63  eturn a single c
71f0: 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 73 69 6e  olumn from a sin
7200: 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 67  gle row of the g
7210: 69 76 65 6e 20 53 51 4c 20 71 75 65 72 79 2e 0a  iven SQL query..
7220: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4f    */.  case DB_O
7230: 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  NECOLUMN: {.    
7240: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
7250: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
7260: 30 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  0;.    if( objc!
7270: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
7280: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7290: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
72a0: 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  QL");.      retu
72b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
72c0: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54    }.    zSql = T
72d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
72e0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
72f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7300: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
7310: 7a 53 71 6c 2c 20 44 62 45 76 61 6c 43 61 6c 6c  zSql, DbEvalCall
7320: 62 61 63 6b 33 2c 20 69 6e 74 65 72 70 2c 20 26  back3, interp, &
7330: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
7340: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  ( rc==SQLITE_ABO
7350: 52 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  RT ){.      rc =
7360: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
7370: 7d 65 6c 73 65 20 69 66 28 20 7a 45 72 72 4d 73  }else if( zErrMs
7380: 67 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  g ){.      Tcl_S
7390: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
73a0: 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f   zErrMsg, TCL_VO
73b0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20 66  LATILE);.      f
73c0: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
73d0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
73e0: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
73f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7400: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
7410: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7420: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
7430: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  rc), 0);.      r
7440: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
7450: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
7460: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
7470: 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59     $db rekey KEY
7480: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67  .  **.  ** Chang
7490: 65 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e  e the encryption
74a0: 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72   key on the curr
74b0: 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62  ently open datab
74c0: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
74d0: 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20   DB_REKEY: {.   
74e0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76   int nKey;.    v
74f0: 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69  oid *pKey;.    i
7500: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
7510: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
7520: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
7530: 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20  objv, "KEY");.  
7540: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7550: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7560: 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
7570: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
7580: 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a  bjv[2], &nKey);.
7590: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
75a0: 53 5f 43 4f 44 45 43 0a 20 20 20 20 72 63 20 3d  S_CODEC.    rc =
75b0: 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70   sqlite3_rekey(p
75c0: 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b  Db->db, pKey, nK
75d0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ey);.    if( rc 
75e0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
75f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7600: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
7610: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  rc), 0);.      r
7620: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
7630: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7640: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
7650: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69  .  **     $db ti
7660: 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e  meout MILLESECON
7670: 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c  DS.  **.  ** Del
7680: 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  ay for the numbe
7690: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
76a0: 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  s specified when
76b0: 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65   a file is locke
76c0: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
76d0: 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20  B_TIMEOUT: {.   
76e0: 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28   int ms;.    if(
76f0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
7700: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
7710: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
7720: 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44  jv, "MILLISECOND
7730: 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  S");.      retur
7740: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7750: 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47   }.    if( Tcl_G
7760: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
7770: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d  erp, objv[2], &m
7780: 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
7790: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
77a0: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
77b0: 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20  pDb->db, ms);.  
77c0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
77d0: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
77e0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20  total_changes.  
77f0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
7800: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
7810: 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69  s that were modi
7820: 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20  fied, inserted, 
7830: 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a  or deleted .  **
7840: 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
7850: 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63  ase handle was c
7860: 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  reated..  */.  c
7870: 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41  ase DB_TOTAL_CHA
7880: 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  NGES: {.    Tcl_
7890: 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
78a0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
78b0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
78c0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
78d0: 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
78e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
78f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7900: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
7910: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
7920: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
7930: 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73  ntObj(pResult, s
7940: 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
7950: 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
7960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
7970: 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63    /*    $db trac
7980: 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  e ?CALLBACK?.  *
7990: 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61  *.  ** Make arra
79a0: 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f  ngements to invo
79b0: 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20  ke the CALLBACK 
79c0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68  routine for each
79d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20   SQL statement. 
79e0: 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65 63   ** that is exec
79f0: 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74 20  uted.  The text 
7a00: 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 70  of the SQL is ap
7a10: 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41  pended to CALLBA
7a20: 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69  CK before.  ** i
7a30: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  t is executed.. 
7a40: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52   */.  case DB_TR
7a50: 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ACE: {.    if( o
7a60: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
7a70: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
7a80: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
7a90: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
7aa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
7ab0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
7ac0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
7ad0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
7ae0: 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  zTrace ){.      
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 70 44 62 2d 3e  lt(interp, pDb->
7b10: 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20  zTrace, 0);.    
7b20: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7b30: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63       char *zTrac
7b40: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e;.      int len
7b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
7b60: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
7b70: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
7b80: 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20  >zTrace);.      
7b90: 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d  }.      zTrace =
7ba0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
7bb0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
7bc0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
7bd0: 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20  zTrace && len>0 
7be0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
7bf0: 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c  zTrace = Tcl_All
7c00: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
7c10: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44         strcpy(pD
7c20: 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63  b->zTrace, zTrac
7c30: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
7c40: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
7c50: 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  race = 0;.      
7c60: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
7c70: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
7c80: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
7c90: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
7ca0: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70   sqlite3_trace(p
7cb0: 44 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65 48  Db->db, DbTraceH
7cc0: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
7cd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7ce0: 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
7cf0: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
7d00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
7d20: 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65   } /* End of the
7d30: 20 53 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e   SWITCH statemen
7d40: 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  t */.  return rc
7d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c  ;.}../*.**   sql
7d60: 69 74 65 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e  ite DBNAME FILEN
7d70: 41 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65 79  AME ?MODE? ?-key
7d80: 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73   KEY?.**.** This
7d90: 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c   is the main Tcl
7da0: 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20   command.  When 
7db0: 74 68 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c  the "sqlite" Tcl
7dc0: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69   command is.** i
7dd0: 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75  nvoked, this rou
7de0: 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f  tine runs to pro
7df0: 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e  cess that comman
7e00: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  d..**.** The fir
7e10: 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e  st argument, DBN
7e20: 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74  AME, is an arbit
7e30: 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20  rary name for a 
7e40: 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  new.** database 
7e50: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69  connection.  Thi
7e60: 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65  s command create
7e70: 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20  s a new command 
7e80: 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20  named.** DBNAME 
7e90: 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20  that is used to 
7ea0: 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e  control that con
7eb0: 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61  nection.  The da
7ec0: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
7ed0: 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20  tion is deleted 
7ee0: 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20  when the DBNAME 
7ef0: 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74  command is delet
7f00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ed..**.** The se
7f10: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
7f20: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7f30: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
7f40: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
7f50: 73 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  sqlite database 
7f60: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 63  that is to be ac
7f70: 63 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cessed..**.** Fo
7f80: 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
7f90: 65 73 2c 20 77 65 20 61 6c 73 6f 20 73 75 70 70  es, we also supp
7fa0: 6f 72 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ort the followin
7fb0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  g:.**.**  sqlite
7fc0: 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a   -encoding.**.**
7fd0: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74 68         Return th
7fe0: 65 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  e encoding used 
7ff0: 62 79 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  by LIKE and GLOB
8000: 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 43 68 6f   operators.  Cho
8010: 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 61 72  ices.**       ar
8020: 65 20 55 54 46 2d 38 20 61 6e 64 20 69 73 6f 38  e UTF-8 and iso8
8030: 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  859..**.**  sqli
8040: 74 65 20 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a  te -version.**.*
8050: 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74  *       Return t
8060: 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
8070: 72 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  r of the SQLite 
8080: 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  library..**.**  
8090: 73 71 6c 69 74 65 20 2d 74 63 6c 2d 75 73 65 73  sqlite -tcl-uses
80a0: 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  -utf.**.**      
80b0: 20 52 65 74 75 72 6e 20 22 31 22 20 69 66 20 63   Return "1" if c
80c0: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61 20 54  ompiled with a T
80d0: 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e 20 20  cl uses UTF-8.  
80e0: 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a 2a 2a  Return "0" if.**
80f0: 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55 73 65         not.  Use
8100: 64 20 62 79 20 74 65 73 74 73 20 74 6f 20 6d 61  d by tests to ma
8110: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69 62 72  ke sure the libr
8120: 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
8130: 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72 72 65   .**       corre
8140: 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
8150: 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20  int DbMain(void 
8160: 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  *cd, Tcl_Interp 
8170: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
8180: 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  c,Tcl_Obj *const
8190: 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65  *objv){.  Sqlite
81a0: 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70  Db *p;.  void *p
81b0: 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Key = 0;.  int n
81c0: 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  Key = 0;.  const
81d0: 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63   char *zArg;.  c
81e0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
81f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
8200: 65 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 38  e;.  char zBuf[8
8210: 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  0];.  if( objc==
8220: 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  2 ){.    zArg = 
8230: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8240: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
8250: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
8260: 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22  (zArg,"-version"
8270: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
8280: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8290: 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65  nterp,sqlite3_ve
82a0: 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20  rsion,0);.      
82b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
82c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
82d0: 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63  cmp(zArg,"-has-c
82e0: 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66  odec")==0 ){.#if
82f0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
8300: 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41  ODEC.      Tcl_A
8310: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8320: 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65  rp,"1",0);.#else
8330: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
8340: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
8350: 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0",0);.#endif.  
8360: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
8370: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
8380: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 74   strcmp(zArg,"-t
8390: 63 6c 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d 30  cl-uses-utf")==0
83a0: 20 29 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f 55   ){.#ifdef TCL_U
83b0: 54 46 5f 4d 41 58 0a 20 20 20 20 20 20 54 63 6c  TF_MAX.      Tcl
83c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
83d0: 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c  terp,"1",0);.#el
83e0: 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  se.      Tcl_App
83f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8400: 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a  ,"0",0);.#endif.
8410: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8420: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
8430: 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20   if( objc==5 || 
8440: 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 7a  objc==6 ){.    z
8450: 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
8460: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8470: 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b 0a 20 20 20  objc-2], 0);.   
8480: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
8490: 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20  ,"-key")==0 ){. 
84a0: 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f       pKey = Tcl_
84b0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
84c0: 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d  Obj(objv[objc-1]
84d0: 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  , &nKey);.      
84e0: 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20 20 20 20 7d  objc -= 2;.    }
84f0: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 21  .  }.  if( objc!
8500: 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =3 && objc!=4 ){
8510: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
8520: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
8530: 20 6f 62 6a 76 2c 20 0a 23 69 66 64 65 66 20 53   objv, .#ifdef S
8540: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
8550: 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49        "HANDLE FI
8560: 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79 20 43 4f 44  LENAME ?-key COD
8570: 45 43 2d 4b 45 59 3f 22 0a 23 65 6c 73 65 0a 20  EC-KEY?".#else. 
8580: 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c       "HANDLE FIL
8590: 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23 65  ENAME ?MODE?".#e
85a0: 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  ndif.    );.    
85b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
85c0: 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20  ;.  }.  zErrMsg 
85d0: 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69  = 0;.  p = (Sqli
85e0: 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  teDb*)Tcl_Alloc(
85f0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
8600: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
8610: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
8620: 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66  nterp, "malloc f
8630: 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54  ailed", TCL_STAT
8640: 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
8650: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8660: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
8670: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69  zeof(*p));.  zFi
8680: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
8690: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
86a0: 5d 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ], 0);.  sqlite3
86b0: 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 26 70 2d  _open(zFile, &p-
86c0: 3e 64 62 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  >db);.  if( SQLI
86d0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
86e0: 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
86f0: 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
8700: 74 72 64 75 70 28 73 71 6c 69 74 65 33 5f 65 72  trdup(sqlite3_er
8710: 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
8720: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
8730: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  p->db);.    p->d
8740: 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  b = 0;.  }.#ifde
8750: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
8760: 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  EC.  sqlite3_key
8770: 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b  (p->db, pKey, nK
8780: 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ey);.#endif.  if
8790: 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
87a0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
87b0: 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c  interp, zErrMsg,
87c0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
87d0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
87e0: 61 72 2a 29 70 29 3b 0a 20 20 20 20 66 72 65 65  ar*)p);.    free
87f0: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72  (zErrMsg);.    r
8800: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8810: 0a 20 20 7d 0a 20 20 7a 41 72 67 20 3d 20 54 63  .  }.  zArg = Tc
8820: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
8830: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
8840: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
8850: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
8860: 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28  Arg, DbObjCmd, (
8870: 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
8880: 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eCmd);..  /* The
8890: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
88a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
88b0: 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65  e sqlite* pointe
88c0: 72 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e 74 66  r.  */.  sprintf
88d0: 28 7a 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e  (zBuf, "%p", p->
88e0: 64 62 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63  db);.  if( strnc
88f0: 6d 70 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20  mp(zBuf,"0x",2) 
8900: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
8910: 42 75 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e  Buf, "0x%p", p->
8920: 64 62 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  db);.  }.  Tcl_A
8930: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8940: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 0a 20  rp, zBuf, 0);.. 
8950: 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20   /* If compiled 
8960: 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
8970: 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 6e   turned on, then
8980: 20 72 65 67 69 73 74 65 72 20 74 68 65 20 22 6d   register the "m
8990: 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c 20  d5sum".  ** SQL 
89a0: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  function..  */.#
89b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
89c0: 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  T.  {.    extern
89d0: 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74   void Md5_Regist
89e0: 65 72 28 73 71 6c 69 74 65 2a 29 3b 0a 23 69 66  er(sqlite*);.#if
89f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8a00: 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 66  .    int mallocf
8a10: 61 69 6c 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d  ail = sqlite3_iM
8a20: 61 6c 6c 6f 63 46 61 69 6c 3b 0a 20 20 20 20 73  allocFail;.    s
8a30: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
8a40: 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  il = 0;.#endif. 
8a50: 20 20 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28     Md5_Register(
8a60: 70 2d 3e 64 62 29 3b 0a 23 69 66 64 65 66 20 53  p->db);.#ifdef S
8a70: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
8a80: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
8a90: 61 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66 61 69 6c  ail = mallocfail
8aa0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 7d 0a 23 65  ;.#endif.   }.#e
8ab0: 6e 64 69 66 20 20 0a 20 20 70 2d 3e 69 6e 74 65  ndif  .  p->inte
8ac0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 72  rp = interp;.  r
8ad0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8ae0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61  ./*.** Provide a
8af0: 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53   dummy Tcl_InitS
8b00: 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75  tubs if we are u
8b10: 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  sing this as a s
8b20: 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79  tatic.** library
8b30: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45  ..*/.#ifndef USE
8b40: 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64  _TCL_STUBS.# und
8b50: 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ef  Tcl_InitStub
8b60: 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49  s.# define Tcl_I
8b70: 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a  nitStubs(a,b,c).
8b80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
8b90: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
8ba0: 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
8bb0: 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
8bc0: 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
8bd0: 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
8be0: 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
8bf0: 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
8c00: 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
8c10: 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
8c20: 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
8c30: 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
8c40: 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
8c50: 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
8c60: 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
8c70: 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
8c80: 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
8c90: 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
8ca0: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
8cb0: 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
8cc0: 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
8cd0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
8ce0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 69  nformation..*/.i
8cf0: 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  nt Sqlite3_Init(
8d00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8d10: 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53  rp){.  Tcl_InitS
8d20: 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
8d30: 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  4", 0);.  Tcl_Cr
8d40: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
8d50: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
8d60: 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
8d70: 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
8d80: 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  ;.  Tcl_PkgProvi
8d90: 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
8da0: 74 65 33 22 2c 20 22 33 2e 30 22 29 3b 0a 20 20  te3", "3.0");.  
8db0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
8dc0: 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f  .int Tclsqlite3_
8dd0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
8de0: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f  *interp){.  Tcl_
8df0: 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
8e00: 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54  , "8.4", 0);.  T
8e10: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
8e20: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  and(interp, "sql
8e30: 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43  ite3", (Tcl_ObjC
8e40: 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20  mdProc*)DbMain, 
8e50: 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67  0, 0);.  Tcl_Pkg
8e60: 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20  Provide(interp, 
8e70: 22 73 71 6c 69 74 65 33 22 2c 20 22 33 2e 30 22  "sqlite3", "3.0"
8e80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8e90: 4f 4b 3b 0a 7d 0a 69 6e 74 20 53 71 6c 69 74 65  OK;.}.int Sqlite
8ea0: 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
8eb0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
8ec0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8ed0: 0a 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  .}.int Tclsqlite
8ee0: 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
8ef0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
8f00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8f10: 0a 7d 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48  .}..#ifdef TCLSH
8f20: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
8f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
8f70: 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
8f80: 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64   follows is used
8f90: 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61   to build standa
8fa0: 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72  lone TCL interpr
8fb0: 65 74 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eters.*/../*.** 
8fc0: 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
8fd0: 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20  SH is one, then 
8fe0: 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73  put in code this
8ff0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69   for the.** "mai
9000: 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  n" routine that 
9010: 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20  will initialize 
9020: 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70  Tcl and take inp
9030: 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64  ut from.** stand
9040: 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 23 69  ard input..*/.#i
9050: 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69  f TCLSH==1.stati
9060: 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
9070: 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65  [] =.  "set line
9080: 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20   {}\n".  "while 
9090: 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b  {![eof stdin]} {
90a0: 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69  \n".    "if {$li
90b0: 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  ne!=\"\"} {\n". 
90c0: 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
90d0: 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a  wline \"> \"\n".
90e0: 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
90f0: 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
9100: 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e  newline \"% \"\n
9110: 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20  ".    "}\n".    
9120: 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22  "flush stdout\n"
9130: 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e  .    "append lin
9140: 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
9150: 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f  ".    "if {[info
9160: 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d   complete $line]
9170: 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66  } {\n".      "if
9180: 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65   {[catch {upleve
9190: 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75  l #0 $line} resu
91a0: 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  lt]} {\n".      
91b0: 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c    "puts stderr \
91c0: 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c  "Error: $result\
91d0: 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c  "\n".      "} el
91e0: 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
91f0: 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
9200: 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c    "puts $result\
9210: 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  n".      "}\n". 
9220: 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b       "set line {
9230: 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65  }\n".    "} else
9240: 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70   {\n".      "app
9250: 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a  end line \\n\n".
9260: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e      "}\n".  "}\n
9270: 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ".;.#endif../*.*
9280: 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
9290: 43 4c 53 48 20 69 73 20 74 77 6f 2c 20 74 68 65  CLSH is two, the
92a0: 6e 20 67 65 74 20 74 68 65 20 6d 61 69 6e 20 6c  n get the main l
92b0: 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a  oop code out of.
92c0: 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ** the separate 
92d0: 66 69 6c 65 20 22 73 70 61 63 65 61 6e 61 6c 5f  file "spaceanal_
92e0: 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54  tcl.h"..*/.#if T
92f0: 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63  CLSH==2.static c
9300: 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20  har zMainloop[] 
9310: 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70 61  = .#include "spa
9320: 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a  ceanal_tcl.h".;.
9330: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
9340: 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20  TCLSH_MAIN main 
9350: 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66    /* Needed to f
9360: 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70  ake out mktclapp
9370: 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41   */.int TCLSH_MA
9380: 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  IN(int argc, cha
9390: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c  r **argv){.  Tcl
93a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
93b0: 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75  .  Tcl_FindExecu
93c0: 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a  table(argv[0]);.
93d0: 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43    interp = Tcl_C
93e0: 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20  reateInterp();. 
93f0: 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
9400: 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51  terp);.#ifdef SQ
9410: 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20  LITE_TEST.  {.  
9420: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
9430: 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
9440: 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
9450: 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
9460: 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f  etest2_Init(Tcl_
9470: 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
9480: 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
9490: 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est3_Init(Tcl_In
94a0: 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
94b0: 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
94c0: 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t4_Init(Tcl_Inte
94d0: 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
94e0: 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35   int Sqlitetest5
94f0: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
9500: 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
9510: 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f  nt Md5_Init(Tcl_
9520: 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 53 71  Interp*);.    Sq
9530: 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69  litetest1_Init(i
9540: 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
9550: 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74  tetest2_Init(int
9560: 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
9570: 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72  test3_Init(inter
9580: 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
9590: 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st4_Init(interp)
95a0: 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
95b0: 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
95c0: 20 20 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74      Md5_Init(int
95d0: 65 72 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erp);.  }.#endif
95e0: 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 7c  .  if( argc>=2 |
95f0: 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20  | TCLSH==2 ){.  
9600: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c    int i;.    Tcl
9610: 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
9620: 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
9630: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
9640: 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
9650: 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
9660: 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
9670: 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32  LY);.    for(i=2
9680: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
9690: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
96a0: 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
96b0: 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
96c0: 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
96d0: 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
96e0: 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
96f0: 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
9700: 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d  }.    if( TCLSH=
9710: 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69  =1 && Tcl_EvalFi
9720: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
9730: 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  1])!=TCL_OK ){. 
9740: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9750: 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74  *zInfo = Tcl_Get
9760: 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72  Var(interp, "err
9770: 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f  orInfo", TCL_GLO
9780: 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BAL_ONLY);.     
9790: 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20   if( zInfo==0 ) 
97a0: 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e  zInfo = interp->
97b0: 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70  result;.      fp
97c0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
97d0: 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20  : %s\n", *argv, 
97e0: 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65  zInfo);.      re
97f0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
9800: 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d 31 20  }.  if( argc<=1 
9810: 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20  || TCLSH==2 ){. 
9820: 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61     Tcl_GlobalEva
9830: 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c  l(interp, zMainl
9840: 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  oop);.  }.  retu
9850: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
9860: 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64  * TCLSH */..#end
9870: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e  if /* !defined(N
9880: 4f 5f 54 43 4c 29 20 2a 2f 0a                    O_TCL) */.