/ Hex Artifact Content
Login

Artifact 3a4044ef609565c8cc51e887d8b96933ba9f3b5c:


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: 31 31 20 32 30 30 34 2f 31 32 2f 31 37 20 32 30  11 2004/12/17 20
01c0: 3a 34 38 3a 30 36 20 64 72 68 20 45 78 70 20 24  :48:06 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 43 4c 20 63 61 6c 6c 73 20 74 68  .** TCL calls th
0a50: 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68 65  is procedure whe
0a60: 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74  n an sqlite3 dat
0a70: 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73  abase command is
0a80: 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a  .** deleted..*/.
0a90: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44 65  static void DbDe
0aa0: 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62  leteCmd(void *db
0ab0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
0ac0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
0ad0: 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  db;.  sqlite3_cl
0ae0: 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  ose(pDb->db);.  
0af0: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e  while( pDb->pFun
0b00: 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63  c ){.    SqlFunc
0b10: 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70   *pFunc = pDb->p
0b20: 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70  Func;.    pDb->p
0b30: 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e  Func = pFunc->pN
0b40: 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  ext;.    Tcl_Fre
0b50: 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b  e((char*)pFunc);
0b60: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44  .  }.  while( pD
0b70: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  b->pCollate ){. 
0b80: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
0b90: 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70  Collate = pDb->p
0ba0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62  Collate;.    pDb
0bb0: 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f  ->pCollate = pCo
0bc0: 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  llate->pNext;.  
0bd0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
0be0: 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d  *)pCollate);.  }
0bf0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73  .  if( pDb->zBus
0c00: 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  y ){.    Tcl_Fre
0c10: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
0c20: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54   }.  if( pDb->zT
0c30: 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f  race ){.    Tcl_
0c40: 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
0c50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
0c60: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
0c70: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
0c80: 74 68 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46  th);.  }.  Tcl_F
0c90: 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b  ree((char*)pDb);
0ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
0cb0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
0cc0: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
0cd0: 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20   file is locked 
0ce0: 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
0cf0: 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a  to execute SQL..
0d00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
0d10: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
0d20: 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73   *cd, int nTries
0d30: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
0d40: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
0d50: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  cd;.  int rc;.  
0d60: 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 20  char zVal[30];. 
0d70: 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 54   char *zCmd;.  T
0d80: 63 6c 5f 44 53 74 72 69 6e 67 20 63 6d 64 3b 0a  cl_DString cmd;.
0d90: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
0da0: 69 74 28 26 63 6d 64 29 3b 0a 20 20 54 63 6c 5f  it(&cmd);.  Tcl_
0db0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 63  DStringAppend(&c
0dc0: 6d 64 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20  md, pDb->zBusy, 
0dd0: 2d 31 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  -1);.  sprintf(z
0de0: 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65  Val, "%d", nTrie
0df0: 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  s);.  Tcl_DStrin
0e00: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
0e10: 63 6d 64 2c 20 7a 56 61 6c 29 3b 0a 20 20 7a 43  cmd, zVal);.  zC
0e20: 6d 64 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67  md = Tcl_DString
0e30: 56 61 6c 75 65 28 26 63 6d 64 29 3b 0a 20 20 72  Value(&cmd);.  r
0e40: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
0e50: 2d 3e 69 6e 74 65 72 70 2c 20 7a 43 6d 64 29 3b  ->interp, zCmd);
0e60: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
0e70: 65 65 28 26 63 6d 64 29 3b 0a 20 20 69 66 28 20  ee(&cmd);.  if( 
0e80: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
0e90: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
0ea0: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
0eb0: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
0ec0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
0ed0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 1;.}../*.** T
0ee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
0ef0: 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70  nvoked as the 'p
0f00: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
0f10: 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  ' for the databa
0f20: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
0f30: 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  t DbProgressHand
0f40: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
0f50: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
0f60: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
0f70: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
0f80: 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72  ert( pDb->zProgr
0f90: 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63  ess );.  rc = Tc
0fa0: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
0fb0: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
0fc0: 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  ss);.  if( rc!=T
0fd0: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
0fe0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
0ff0: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
1000: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1010: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1030: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1040: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 74   by the SQLite t
1050: 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65  race handler whe
1060: 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62  never a new.** b
1070: 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65  lock of SQL is e
1080: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43  xecuted.  The TC
1090: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
10a0: 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63 75  >zTrace is execu
10b0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
10c0: 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c  oid DbTraceHandl
10d0: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e  er(void *cd, con
10e0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
10f0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
1100: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
1110: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
1120: 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr;..  Tcl_DStri
1130: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
1140: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
1150: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72  d(&str, pDb->zTr
1160: 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ace, -1);.  Tcl_
1170: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
1180: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29  ment(&str, zSql)
1190: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  ;.  Tcl_Eval(pDb
11a0: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
11b0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
11c0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
11d0: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63  Free(&str);.  Tc
11e0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44  l_ResetResult(pD
11f0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f  b->interp);.}../
1200: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1210: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
1220: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1230: 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54 68  s committed.  Th
1240: 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74 20  e.** TCL script 
1250: 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  in pDb->zCommit 
1260: 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 49 66  is executed.  If
1270: 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d   it returns non-
1280: 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69 74  zero or.** if it
1290: 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
12a0: 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73 61  tion, the transa
12b0: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
12c0: 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a 20  back instead.** 
12d0: 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  of being committ
12e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
12f0: 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65  t DbCommitHandle
1300: 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53  r(void *cd){.  S
1310: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
1320: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
1330: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
1340: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
1350: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d  terp, pDb->zComm
1360: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  it);.  if( rc!=T
1370: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
1380: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1390: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
13a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
13b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
13c0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
13d0: 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  tclCollateNeeded
13e0: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
13f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
1400: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73   int enc,.  cons
1410: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
1420: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1430: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
1440: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
1450: 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75  pScript = Tcl_Du
1460: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
1470: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
1480: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
1490: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
14a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
14b0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
14c0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
14d0: 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29  ngObj(zName, -1)
14e0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
14f0: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
1500: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54  pScript, 0);.  T
1510: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1520: 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pScript);.}../*.
1530: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1540: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
1550: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c  luate an SQL col
1560: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
1570: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75  implemented.** u
1580: 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e  sing TCL script.
1590: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15a0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20  clSqlCollate(.  
15b0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
15c0: 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  t nA,.  const vo
15d0: 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
15e0: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
15f0: 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61  zB.){.  SqlColla
1600: 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c  te *p = (SqlColl
1610: 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  ate *)pCtx;.  Tc
1620: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
1630: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pCmd = Tcl_NewSt
1640: 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69  ringObj(p->zScri
1650: 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  pt, -1);.  Tcl_I
1660: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
1670: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
1680: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
1690: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
16a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
16b0: 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f  zA, nA));.  Tcl_
16c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
16d0: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
16e0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
16f0: 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b  ingObj(zB, nB));
1700: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
1710: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
1720: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
1730: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
1740: 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54    return (atoi(T
1750: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1760: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b  lt(p->interp)));
1770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1780: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1790: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
17a0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  SQL function imp
17b0: 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e  lemented.** usin
17c0: 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f  g TCL script..*/
17d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c  .static void tcl
17e0: 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  SqlFunc(sqlite3_
17f0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1800: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
1810: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1820: 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20  ){.  SqlFunc *p 
1830: 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
1840: 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ata(context);.  
1850: 54 63 6c 5f 44 53 74 72 69 6e 67 20 63 6d 64 3b  Tcl_DString cmd;
1860: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1870: 72 63 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69  rc;..  Tcl_DStri
1880: 6e 67 49 6e 69 74 28 26 63 6d 64 29 3b 0a 20 20  ngInit(&cmd);.  
1890: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
18a0: 64 28 26 63 6d 64 2c 20 70 2d 3e 7a 53 63 72 69  d(&cmd, p->zScri
18b0: 70 74 2c 20 2d 31 29 3b 0a 20 20 66 6f 72 28 69  pt, -1);.  for(i
18c0: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
18d0: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
18e0: 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76  _NULL==sqlite3_v
18f0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69  alue_type(argv[i
1900: 5d 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ]) ){.      Tcl_
1910: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
1920: 6d 65 6e 74 28 26 63 6d 64 2c 20 22 22 29 3b 0a  ment(&cmd, "");.
1930: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1940: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
1950: 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64 2c 20  ndElement(&cmd, 
1960: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1970: 78 74 28 61 72 67 76 5b 69 5d 29 29 3b 0a 20 20  xt(argv[i]));.  
1980: 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 54    }.  }.  rc = T
1990: 63 6c 5f 45 76 61 6c 28 70 2d 3e 69 6e 74 65 72  cl_Eval(p->inter
19a0: 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  p, Tcl_DStringVa
19b0: 6c 75 65 28 26 63 6d 64 29 29 3b 0a 20 20 69 66  lue(&cmd));.  if
19c0: 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
19d0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
19e0: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
19f0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
1a00: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
1a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1a20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
1a30: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
1a40: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
1a50: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 0a 20  >interp), -1, . 
1a60: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52         SQLITE_TR
1a70: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
1a80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a90: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1aa0: 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ON./*.** This is
1ab0: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
1ac0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  ion function.  I
1ad0: 74 20 61 70 70 65 6e 64 73 20 74 68 65 20 61 75  t appends the au
1ae0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20  thentication.** 
1af0: 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68  type code and th
1b00: 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  e two arguments 
1b10: 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69  to zCmd[] then i
1b20: 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c  nvokes the resul
1b30: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65  t.** on the inte
1b40: 72 70 72 65 74 65 72 2e 20 20 54 68 65 20 72 65  rpreter.  The re
1b50: 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20  ply is examined 
1b60: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
1b70: 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63  the.** authentic
1b80: 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73  ation fails or s
1b90: 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74  ucceeds..*/.stat
1ba0: 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c  ic int auth_call
1bb0: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41  back(.  void *pA
1bc0: 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a  rg,.  int code,.
1bd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
1be0: 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg1,.  const cha
1bf0: 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73  r *zArg2,.  cons
1c00: 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20  t char *zArg3,. 
1c10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
1c20: 67 34 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  g4.){.  char *zC
1c30: 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ode;.  Tcl_DStri
1c40: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
1c50: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1c60: 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65  zReply;.  Sqlite
1c70: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
1c80: 65 44 62 2a 29 70 41 72 67 3b 0a 0a 20 20 73 77  eDb*)pArg;..  sw
1c90: 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20  itch( code ){.  
1ca0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
1cb0: 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20 20  PY              
1cc0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
1cd0: 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20  COPY"; break;.  
1ce0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
1cf0: 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20  EATE_INDEX      
1d00: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
1d10: 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62  CREATE_INDEX"; b
1d20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1d30: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
1d40: 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  LE      : zCode=
1d50: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
1d60: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
1d70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
1d80: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20  EATE_TEMP_INDEX 
1d90: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
1da0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
1db0: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
1dc0: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
1dd0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a  E_TEMP_TABLE : z
1de0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
1df0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b  ATE_TEMP_TABLE";
1e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1e10: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
1e20: 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f  EMP_TRIGGER: zCo
1e30: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
1e40: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  E_TEMP_TRIGGER";
1e50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1e60: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
1e70: 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64  EMP_VIEW  : zCod
1e80: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
1e90: 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65  _TEMP_VIEW"; bre
1ea0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1eb0: 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47  ITE_CREATE_TRIGG
1ec0: 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  ER    : zCode="S
1ed0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
1ee0: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
1ef0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
1f00: 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20 20  EATE_VIEW       
1f10: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
1f20: 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72  CREATE_VIEW"; br
1f30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1f40: 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20  LITE_DELETE     
1f50: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
1f60: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20  SQLITE_DELETE"; 
1f70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1f80: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
1f90: 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  X        : zCode
1fa0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  ="SQLITE_DROP_IN
1fb0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
1fc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
1fd0: 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a  P_TABLE        :
1fe0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
1ff0: 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  ROP_TABLE"; brea
2000: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2010: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
2020: 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  EX   : zCode="SQ
2030: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
2040: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
2050: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
2060: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20  OP_TEMP_TABLE   
2070: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
2080: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22  DROP_TEMP_TABLE"
2090: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
20a0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
20b0: 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f  MP_TRIGGER : zCo
20c0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
20d0: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62  TEMP_TRIGGER"; b
20e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
20f0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
2100: 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d  VIEW    : zCode=
2110: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
2120: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
2130: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2140: 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20  DROP_TRIGGER    
2150: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
2160: 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b  E_DROP_TRIGGER";
2170: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2180: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
2190: 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  W         : zCod
21a0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
21b0: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
21c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53   case SQLITE_INS
21d0: 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20 3a  ERT            :
21e0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49   zCode="SQLITE_I
21f0: 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20  NSERT"; break;. 
2200: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
2210: 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20 20  RAGMA           
2220: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
2230: 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b  _PRAGMA"; break;
2240: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2250: 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
2260: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
2270: 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b  TE_READ"; break;
2280: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2290: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
22a0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
22b0: 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61  TE_SELECT"; brea
22c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
22d0: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20  TE_TRANSACTION  
22e0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
22f0: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
2300: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
2310: 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45  se SQLITE_UPDATE
2320: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
2330: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41  ode="SQLITE_UPDA
2340: 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TE"; break;.    
2350: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41  case SQLITE_ATTA
2360: 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CH            : 
2370: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54  zCode="SQLITE_AT
2380: 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TACH"; break;.  
2390: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
23a0: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
23b0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
23c0: 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  DETACH"; break;.
23d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23e0: 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20  ALTER_TABLE     
23f0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
2400: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20  E_ALTER_TABLE"; 
2410: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2420: 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20  SQLITE_REINDEX  
2430: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
2440: 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  ="SQLITE_REINDEX
2450: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  "; break;.    de
2460: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  fault           
2470: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
2480: 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61  ode="????"; brea
2490: 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74  k;.  }.  Tcl_DSt
24a0: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
24b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
24c0: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
24d0: 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Auth, -1);.  Tcl
24e0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
24f0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64  ement(&str, zCod
2500: 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  e);.  Tcl_DStrin
2510: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
2520: 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72  str, zArg1 ? zAr
2530: 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g1 : "");.  Tcl_
2540: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
2550: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32  ment(&str, zArg2
2560: 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a   ? zArg2 : "");.
2570: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
2580: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
2590: 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a   zArg3 ? zArg3 :
25a0: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
25b0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
25c0: 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a  (&str, zArg4 ? z
25d0: 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63  Arg4 : "");.  rc
25e0: 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61   = Tcl_GlobalEva
25f0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
2600: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
2610: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
2620: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
2630: 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f  .  zReply = Tcl_
2640: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
2650: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  pDb->interp);.  
2660: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
2670: 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d  y,"SQLITE_OK")==
2680: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
2690: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
26a0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
26b0: 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22  ly,"SQLITE_DENY"
26c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
26d0: 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20   SQLITE_DENY;.  
26e0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
26f0: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
2700: 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20  IGNORE")==0 ){. 
2710: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2720: 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  GNORE;.  }else{.
2730: 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20      rc = 999;.  
2740: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2750: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2760: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
2770: 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a  TION */../*.** z
2780: 54 65 78 74 20 69 73 20 61 20 70 6f 69 6e 74 65  Text is a pointe
2790: 72 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  r to text obtain
27a0: 65 64 20 76 69 61 20 61 6e 20 73 71 6c 69 74 65  ed via an sqlite
27b0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 29 0a  3_result_text().
27c0: 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e  ** or similar in
27d0: 74 65 72 66 61 63 65 2e 20 54 68 69 73 20 72 6f  terface. This ro
27e0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20  utine returns a 
27f0: 54 63 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65 63  Tcl string objec
2800: 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  t, .** reference
2810: 20 63 6f 75 6e 74 20 73 65 74 20 74 6f 20 30 2c   count set to 0,
2820: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2830: 74 65 78 74 2e 20 49 66 20 61 20 74 72 61 6e 73  text. If a trans
2840: 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65  lation.** betwee
2850: 6e 20 69 73 6f 38 38 35 39 20 61 6e 64 20 55 54  n iso8859 and UT
2860: 46 2d 38 20 69 73 20 72 65 71 75 69 72 65 64 2c  F-8 is required,
2870: 20 69 74 20 69 73 20 70 72 65 66 6f 72 6d 65 64   it is preformed
2880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f  ..*/.static Tcl_
2890: 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a  Obj *dbTextToObj
28a0: 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65  (char const *zTe
28b0: 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  xt){.  Tcl_Obj *
28c0: 70 56 61 6c 3b 0a 23 69 66 64 65 66 20 55 54 46  pVal;.#ifdef UTF
28d0: 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45  _TRANSLATION_NEE
28e0: 44 45 44 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  DED.  Tcl_DStrin
28f0: 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53  g dCol;.  Tcl_DS
2900: 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29  tringInit(&dCol)
2910: 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c  ;.  Tcl_External
2920: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c  ToUtfDString(NUL
2930: 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64  L, zText, -1, &d
2940: 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54  Col);.  pVal = T
2950: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2960: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
2970: 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20  (&dCol), -1);.  
2980: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
2990: 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  &dCol);.#else.  
29a0: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
29b0: 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d  ringObj(zText, -
29c0: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  1);.#endif.  ret
29d0: 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  urn pVal;.}../*.
29e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29f0: 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20  reads a line of 
2a00: 74 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69  text from FILE i
2a10: 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65  n, stores.** the
2a20: 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20   text in memory 
2a30: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
2a40: 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72  lloc() and retur
2a50: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
2a60: 74 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55  to the text.  NU
2a70: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
2a80: 74 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f  t end of file, o
2a90: 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a  r if malloc().**
2aa0: 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   fails..**.** Th
2ab0: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c  e interface is l
2ac0: 69 6b 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62  ike "readline" b
2ad0: 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69  ut no command-li
2ae0: 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73  ne editing.** is
2af0: 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70   done..**.** cop
2b00: 69 65 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63  ied from shell.c
2b10: 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20   from '.import' 
2b20: 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69  command.*/.stati
2b30: 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65  c char *local_ge
2b40: 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f  tline(char *zPro
2b50: 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a  mpt, FILE *in){.
2b60: 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20    char *zLine;. 
2b70: 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e   int nLine;.  in
2b80: 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a  t n;.  int eol;.
2b90: 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a  .  nLine = 100;.
2ba0: 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63    zLine = malloc
2bb0: 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28  ( nLine );.  if(
2bc0: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
2bd0: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  rn 0;.  n = 0;. 
2be0: 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c   eol = 0;.  whil
2bf0: 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69  e( !eol ){.    i
2c00: 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29  f( n+100>nLine )
2c10: 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20  {.      nLine = 
2c20: 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20  nLine*2 + 100;. 
2c30: 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61       zLine = rea
2c40: 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e  lloc(zLine, nLin
2c50: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  e);.      if( zL
2c60: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
2c70: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2c80: 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d   fgets(&zLine[n]
2c90: 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29  , nLine - n, in)
2ca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2cb0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
2cc0: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
2cd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2ce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c        }.      zL
2cf0: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
2d00: 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20    eol = 1;.     
2d10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2d20: 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e    while( zLine[n
2d30: 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ] ){ n++; }.    
2d40: 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65  if( n>0 && zLine
2d50: 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  [n-1]=='\n' ){. 
2d60: 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
2d70: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
2d80: 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20      eol = 1;.   
2d90: 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d   }.  }.  zLine =
2da0: 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c   realloc( zLine,
2db0: 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e   n+1 );.  return
2dc0: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zLine;.}../*.**
2dd0: 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
2de0: 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61  mmand below crea
2df0: 74 65 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f  tes a new Tcl co
2e00: 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a  mmand for each.*
2e10: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20  * connection it 
2e20: 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69  opens to an SQLi
2e30: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  te database.  Th
2e40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
2e50: 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65  voked.** wheneve
2e60: 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63  r one of those c
2e70: 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66  onnection-specif
2e80: 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65  ic commands is e
2e90: 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63  xecuted.** in Tc
2ea0: 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
2eb0: 20 69 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20   if you run Tcl 
2ec0: 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a  code like this:.
2ed0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69  **.**       sqli
2ee0: 74 65 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74  te3 db1  "my_dat
2ef0: 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20  abase".**       
2f00: 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20  db1 close.**.** 
2f10: 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e  The first comman
2f20: 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63  d opens a connec
2f30: 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f  tion to the "my_
2f40: 64 61 74 61 62 61 73 65 22 20 64 61 74 61 62 61  database" databa
2f50: 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20  se.** and calls 
2f60: 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  that connection 
2f70: 22 64 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f  "db1".  The seco
2f80: 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65  nd command cause
2f90: 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75  s this.** subrou
2fa0: 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tine to be invok
2fb0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2fc0: 74 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20  t DbObjCmd(void 
2fd0: 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  *cd, Tcl_Interp 
2fe0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
2ff0: 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  c,Tcl_Obj *const
3000: 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65  *objv){.  Sqlite
3010: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
3020: 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63  eDb*)cd;.  int c
3030: 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20  hoice;.  int rc 
3040: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74  = TCL_OK;.  stat
3050: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44  ic const char *D
3060: 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  B_strs[] = {.   
3070: 20 22 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20   "authorizer",  
3080: 20 20 20 20 20 20 20 22 62 75 73 79 22 2c 20 20         "busy",  
3090: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68 61              "cha
30a0: 6e 67 65 73 22 2c 0a 20 20 20 20 22 63 6c 6f 73  nges",.    "clos
30b0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
30c0: 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20   "collate",     
30d0: 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e        "collation
30e0: 5f 6e 65 65 64 65 64 22 2c 0a 20 20 20 20 22 63  _needed",.    "c
30f0: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20  ommit_hook",    
3100: 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 20      "complete", 
3110: 20 20 20 20 20 20 20 20 20 22 63 6f 70 79 22 2c           "copy",
3120: 0a 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65 22  .    "errorcode"
3130: 2c 20 20 20 20 20 20 20 20 20 20 22 65 76 61 6c  ,          "eval
3140: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
3150: 22 66 75 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20  "function",.    
3160: 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  "last_insert_row
3170: 69 64 22 2c 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e  id",  "onecolumn
3180: 22 2c 20 20 20 20 20 20 20 20 20 22 70 72 6f 67  ",         "prog
3190: 72 65 73 73 22 2c 0a 20 20 20 20 22 72 65 6b 65  ress",.    "reke
31a0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
31b0: 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20   "timeout",     
31c0: 20 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61        "total_cha
31d0: 6e 67 65 73 22 2c 0a 20 20 20 20 22 74 72 61 63  nges",.    "trac
31e0: 65 22 2c 0a 20 20 20 20 30 20 20 20 20 20 20 20  e",.    0       
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
3200: 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75  };.  enum DB_enu
3210: 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54 48 4f  m {.    DB_AUTHO
3220: 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20 44 42  RIZER,        DB
3230: 5f 42 55 53 59 2c 20 20 20 20 20 20 20 20 20 20  _BUSY,          
3240: 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 0a 20     DB_CHANGES,. 
3250: 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20     DB_CLOSE,    
3260: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c           DB_COLL
3270: 41 54 45 2c 20 20 20 20 20 20 20 20 20 20 44 42  ATE,          DB
3280: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
3290: 44 2c 0a 20 20 20 20 44 42 5f 43 4f 4d 4d 49 54  D,.    DB_COMMIT
32a0: 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20 44 42 5f  _HOOK,       DB_
32b0: 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20  COMPLETE,       
32c0: 20 20 44 42 5f 43 4f 50 59 2c 0a 20 20 20 20 44    DB_COPY,.    D
32d0: 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20 20 20 20  B_ERRORCODE,    
32e0: 20 20 20 20 20 44 42 5f 45 56 41 4c 2c 20 20 20       DB_EVAL,   
32f0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e            DB_FUN
3300: 43 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 4c 41  CTION,.    DB_LA
3310: 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c  ST_INSERT_ROWID,
3320: 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20   DB_ONECOLUMN,  
3330: 20 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53        DB_PROGRES
3340: 53 2c 0a 20 20 20 20 44 42 5f 52 45 4b 45 59 2c  S,.    DB_REKEY,
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
3360: 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20  TIMEOUT,        
3370: 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47    DB_TOTAL_CHANG
3380: 45 53 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45  ES,.    DB_TRACE
3390: 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74  .  };.  /* don't
33a0: 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20   leave trailing 
33b0: 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75  commas on DB_enu
33c0: 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74  m, it confuses t
33d0: 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69  he AIX xlc compi
33e0: 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ler */..  if( ob
33f0: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
3400: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
3410: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
3420: 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b  UBCOMMAND ...");
3430: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3440: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
3450: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
3460: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
3470: 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22  v[1], DB_strs, "
3480: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f  option", 0, &cho
3490: 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ice) ){.    retu
34a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
34b0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e  }..  switch( (en
34c0: 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63  um DB_enum)choic
34d0: 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64  e ){..  /*    $d
34e0: 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41  b authorizer ?CA
34f0: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
3500: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
3510: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  en callback to a
3520: 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51  uthorize each SQ
3530: 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69  L operation as i
3540: 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c  t is.  ** compil
3550: 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73  ed.  5 arguments
3560: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
3570: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65   the callback be
3580: 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  fore it is.  ** 
3590: 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20  invoked:.  **.  
35a0: 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74  **   (1) The aut
35b0: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20  horization type 
35c0: 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41  (ex: SQLITE_CREA
35d0: 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45  TE_TABLE, SQLITE
35e0: 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20  _INSERT, ...).  
35f0: 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64  **   (2) First d
3600: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20  escriptive name 
3610: 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68  (depends on auth
3620: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a  orization type).
3630: 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e    **   (3) Secon
3640: 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  d descriptive na
3650: 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61  me.  **   (4) Na
3660: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3670: 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20  se (ex: "main", 
3680: 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28  "temp").  **   (
3690: 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  5) Name of trigg
36a0: 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67  er that is doing
36b0: 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a   the access.  **
36c0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  .  ** The callba
36d0: 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ck should return
36e0: 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f   on of the follo
36f0: 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51  wing strings: SQ
3700: 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51  LITE_OK,.  ** SQ
3710: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20  LITE_IGNORE, or 
3720: 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e  SQLITE_DENY.  An
3730: 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
3740: 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72  alue is an error
3750: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
3760: 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e  his method is in
3770: 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72  voked with no ar
3780: 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72  guments, the cur
3790: 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69  rent authorizati
37a0: 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  on.  ** callback
37b0: 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
37c0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
37d0: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20   DB_AUTHORIZER: 
37e0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
37f0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
3800: 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ON.    Tcl_Appen
3810: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3820: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e  "authorization n
3830: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
3840: 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b  this build", 0);
3850: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3860: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
3870: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
3880: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
3890: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
38a0: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
38b0: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
38c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
38d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
38e0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
38f0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
3900: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
3910: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3920: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a  pDb->zAuth, 0);.
3930: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3940: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
3950: 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20  Auth;.      int 
3960: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
3970: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
3980: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
3990: 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20  b->zAuth);.     
39a0: 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d   }.      zAuth =
39b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
39c0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
39d0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
39e0: 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29  zAuth && len>0 )
39f0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
3a00: 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Auth = Tcl_Alloc
3a10: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
3a20: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
3a30: 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 29 3b 0a  >zAuth, zAuth);.
3a40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3a50: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
3a60: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
3a70: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
3a80: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  h ){.        pDb
3a90: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
3aa0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
3ab0: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
3ac0: 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f  r(pDb->db, auth_
3ad0: 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a  callback, pDb);.
3ae0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3af0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
3b00: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
3b10: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
3b20: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
3b30: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
3b40: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73  .  /*    $db bus
3b50: 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  y ?CALLBACK?.  *
3b60: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
3b70: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
3b80: 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   if an SQL state
3b90: 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f  ment attempts to
3ba0: 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63   open.  ** a loc
3bb0: 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ked database fil
3bc0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
3bd0: 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66  B_BUSY: {.    if
3be0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
3bf0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
3c00: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
3c10: 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b  jv, "CALLBACK");
3c20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
3c30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
3c40: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
3c50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
3c60: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
3c70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
3c80: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
3c90: 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20  zBusy, 0);.     
3ca0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
3cb0: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b      char *zBusy;
3cc0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
3cd0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
3ce0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
3cf0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
3d00: 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  usy);.      }.  
3d10: 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f      zBusy = Tcl_
3d20: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
3d30: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
3d40: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79  .      if( zBusy
3d50: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
3d60: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
3d70: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
3d80: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
3d90: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 42 75 73  strcpy(pDb->zBus
3da0: 79 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  y, zBusy);.     
3db0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3dc0: 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a  pDb->zBusy = 0;.
3dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3de0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
3df0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
3e00: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
3e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
3e20: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
3e30: 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65  db, DbBusyHandle
3e40: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
3e50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3e60: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
3e70: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
3e80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3e90: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
3ea0: 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 68  .  /*     $db ch
3eb0: 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
3ec0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
3ed0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
3ee0: 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
3ef0: 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
3f00: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d  ed by.  ** the m
3f10: 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45 52  ost recent INSER
3f20: 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
3f30: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e  ETE statement, n
3f40: 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20  ot including .  
3f50: 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  ** any changes m
3f60: 61 64 65 20 62 79 20 74 72 69 67 67 65 72 20 70  ade by trigger p
3f70: 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20  rograms..  */.  
3f80: 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a  case DB_CHANGES:
3f90: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
3fa0: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28  pResult;.    if(
3fb0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
3fc0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
3fd0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
3fe0: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
3ff0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4000: 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75  .    }.    pResu
4010: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
4020: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
4030: 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
4040: 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65  (pResult, sqlite
4050: 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64  3_changes(pDb->d
4060: 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b));.    break;.
4070: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
4080: 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a   close.  **.  **
4090: 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61   Shutdown the da
40a0: 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61  tabase.  */.  ca
40b0: 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20  se DB_CLOSE: {. 
40c0: 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d     Tcl_DeleteCom
40d0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c  mand(interp, Tcl
40e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
40f0: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a  j(objv[0], 0));.
4100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4110: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
4120: 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
4130: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
4140: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
4150: 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
4160: 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
4170: 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
4180: 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
4190: 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
41a0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
41b0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
41c0: 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
41d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
41e0: 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
41f0: 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
4200: 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
4210: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
4220: 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
4230: 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
4240: 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
4250: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
4260: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
4270: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
4280: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
4290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
42a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
42b0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
42c0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
42d0: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
42e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
42f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
4300: 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20  >zCommit, 0);.  
4310: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4320: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
4330: 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  mmit;.      int 
4340: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
4350: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
4360: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
4370: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
4380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f       }.      zCo
4390: 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  mmit = Tcl_GetSt
43a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
43b0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
43c0: 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26    if( zCommit &&
43d0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
43e0: 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d    pDb->zCommit =
43f0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
4400: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
4410: 74 72 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d  trcpy(pDb->zComm
4420: 69 74 2c 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20  it, zCommit);.  
4430: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4440: 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
4450: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
4460: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
4470: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mit ){.        p
4480: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
4490: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
44a0: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
44b0: 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d  (pDb->db, DbComm
44c0: 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  itHandler, pDb);
44d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
44e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
44f0: 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  mmit_hook(pDb->d
4500: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
4510: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
4520: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
4530: 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
4540: 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20  e NAME SCRIPT.  
4550: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
4560: 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
4570: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
4580: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
4590: 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
45a0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
45b0: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
45c0: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
45d0: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
45e0: 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a  case DB_COLLATE:
45f0: 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74   {.    SqlCollat
4600: 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  e *pCollate;.   
4610: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
4620: 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b    char *zScript;
4630: 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74  .    int nScript
4640: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
4650: 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  4 ){.      Tcl_W
4660: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
4670: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41  rp, 2, objv, "NA
4680: 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20  ME SCRIPT");.   
4690: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
46a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
46b0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
46c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
46d0: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63  [2], 0);.    zSc
46e0: 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  ript = Tcl_GetSt
46f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
4700: 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a  [3], &nScript);.
4710: 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28      pCollate = (
4720: 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f  SqlCollate*)Tcl_
4730: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
4740: 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69  Collate) + nScri
4750: 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  pt + 1 );.    if
4760: 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20  ( pCollate==0 ) 
4770: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4780: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
4790: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
47a0: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  .    pCollate->p
47b0: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c  Next = pDb->pCol
47c0: 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  late;.    pColla
47d0: 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63  te->zScript = (c
47e0: 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31  har*)&pCollate[1
47f0: 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c  ];.    pDb->pCol
4800: 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b  late = pCollate;
4810: 0a 20 20 20 20 73 74 72 63 70 79 28 70 43 6f 6c  .    strcpy(pCol
4820: 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a  late->zScript, z
4830: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 69 66 28  Script);.    if(
4840: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
4850: 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64  collation(pDb->d
4860: 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  b, zName, SQLITE
4870: 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
4880: 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c  pCollate, tclSql
4890: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
48a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
48b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
48c0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
48d0: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
48e0: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52  ation_needed SCR
48f0: 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
4900: 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63  eate a new SQL c
4910: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
4920: 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
4930: 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68  Whenever.  ** th
4940: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  at function is c
4950: 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
4960: 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
4970: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
4980: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
4990: 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20  LLATION_NEEDED: 
49a0: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  {.    if( objc!=
49b0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
49c0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
49d0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 2, objv, "SC
49e0: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
49f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4a00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44      }.    if( pD
4a10: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
4a20: 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  d ){.      Tcl_D
4a30: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
4a40: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
4a50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
4a60: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
4a70: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
4a80: 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  bj(objv[2]);.   
4a90: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4aa0: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
4ab0: 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  eeded);.    sqli
4ac0: 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
4ad0: 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44  eded(pDb->db, pD
4ae0: 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65  b, tclCollateNee
4af0: 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ded);.    break;
4b00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
4b10: 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20  b complete SQL. 
4b20: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
4b30: 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61  TRUE if SQL is a
4b40: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
4b50: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
4b60: 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61   FALSE if.  ** a
4b70: 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20  dditional lines 
4b80: 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65  of input are nee
4b90: 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69  ded.  This is si
4ba0: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
4bb0: 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f  * built-in "info
4bc0: 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61   complete" comma
4bd0: 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a  nd of Tcl..  */.
4be0: 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45    case DB_COMPLE
4bf0: 54 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  TE: {.    Tcl_Ob
4c00: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
4c10: 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a  int isComplete;.
4c20: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
4c30: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
4c40: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
4c50: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22  , 2, objv, "SQL"
4c60: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4c70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
4c80: 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20  .    isComplete 
4c90: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  = sqlite3_comple
4ca0: 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  te( Tcl_GetStrin
4cb0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
4cc0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73  , 0) );.    pRes
4cd0: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
4ce0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
4cf0: 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65      Tcl_SetBoole
4d00: 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69  anObj(pResult, i
4d10: 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 20 20 20 20  sComplete);.    
4d20: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
4d30: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72  .  **    $db err
4d40: 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a  orcode.  **.  **
4d50: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65   Return the nume
4d60: 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74  ric error code t
4d70: 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64  hat was returned
4d80: 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
4d90: 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f  ent.  ** call to
4da0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
4db0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
4dc0: 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20  ERRORCODE: {.   
4dd0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
4de0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
4df0: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
4e00: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
4e10: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
4e20: 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   }.   .  /*.  **
4e30: 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73 71      $db eval $sq
4e40: 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e  l ?array? ?{  ..
4e50: 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a  .code... }?.  **
4e60: 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d      $db onecolum
4e70: 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a  n $sql.  **.  **
4e80: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
4e90: 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
4ea0: 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
4eb0: 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
4ec0: 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
4ed0: 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
4ee0: 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
4ef0: 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
4f00: 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
4f10: 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
4f20: 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
4f30: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
4f40: 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
4f50: 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
4f60: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
4f70: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
4f80: 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
4f90: 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
4fa0: 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
4fb0: 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
4fc0: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
4fd0: 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
4fe0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
4ff0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e    **.  ** The on
5000: 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69  ecolumn method i
5010: 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
5020: 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69   of:.  **     li
5030: 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24  ndex [$db eval $
5040: 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61  sql] 0.  */.  ca
5050: 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a  se DB_ONECOLUMN:
5060: 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a  .  case DB_EVAL:
5070: 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73   {.    char cons
5080: 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a  t *zSql;      /*
5090: 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   Next SQL statem
50a0: 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a  ent to execute *
50b0: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
50c0: 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *zLeft;     /* 
50d0: 57 68 61 74 20 69 73 20 6c 65 66 74 20 61 66 74  What is left aft
50e0: 65 72 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e  er first stmt in
50f0: 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c   zSql */.    sql
5100: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
5110: 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20  ;   /* Compiled 
5120: 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a  SQL statment */.
5130: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72      Tcl_Obj *pAr
5140: 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ray;       /* Na
5150: 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f  me of array into
5160: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61   which results a
5170: 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  re written */.  
5180: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
5190: 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69  pt;      /* Scri
51a0: 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61  pt to run for ea
51b0: 63 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ch result set */
51c0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
51d0: 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50  pParm;      /* P
51e0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e  arameters that n
51f0: 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65  eed a Tcl_DecrRe
5200: 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20  fCount() */.    
5210: 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20  int nParm;      
5220: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5230: 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65 64   of entries used
5240: 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a   in apParm[] */.
5250: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61      Tcl_Obj *aPa
5260: 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74  rm[10];    /* St
5270: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
5280: 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63  pParm[] in the c
5290: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
52a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
52b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
52c0: 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
52d0: 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 63 68 6f   */..    if( cho
52e0: 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d  ice==DB_ONECOLUM
52f0: 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  N ){.      if( o
5300: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
5310: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
5320: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
5330: 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20  jv, "SQL");.    
5340: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5350: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
5360: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
5370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
5380: 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a  f( objc<3 || obj
5390: 63 3e 35 20 29 7b 0a 20 20 20 20 20 20 20 20 54  c>5 ){.        T
53a0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
53b0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
53c0: 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d   "SQL ?ARRAY-NAM
53d0: 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  E? ?SCRIPT?");. 
53e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
53f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
5400: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63  .      pRet = Tc
5410: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
5420: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5430: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a  nt(pRet);.    }.
5440: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
5450: 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20  ){.      pArray 
5460: 3d 20 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  = pScript = 0;. 
5470: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
5480: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 70 41  c==4 ){.      pA
5490: 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  rray = 0;.      
54a0: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
54b0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
54c0: 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a      pArray = obj
54d0: 76 5b 33 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  v[3];.      if( 
54e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 41  Tcl_GetString(pA
54f0: 72 72 61 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41  rray)[0]==0 ) pA
5500: 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  rray = 0;.      
5510: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34  pScript = objv[4
5520: 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  ];.    }..    Tc
5530: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_IncrRefCount(o
5540: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71  bjv[2]);.    zSq
5550: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
5560: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
5570: 2c 20 30 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  , 0);.    while(
5580: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a   rc==TCL_OK && z
5590: 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Sql[0] ){.      
55a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 2f 2a 20 4c  int i;      /* L
55b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
55c0: 20 20 20 20 20 69 6e 74 20 6e 56 61 72 3b 20 20       int nVar;  
55d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69   /* Number of wi
55e0: 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65 20 53  ldcards in the S
55f0: 51 4c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  QL */.      int 
5600: 6e 43 6f 6c 3b 20 20 20 2f 2a 20 4e 75 6d 62 65  nCol;   /* Numbe
5610: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
5620: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
5630: 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  /.      Tcl_Obj 
5640: 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b  **apColName = 0;
5650: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
5660: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
5670: 20 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69   .      /* Compi
5680: 6c 65 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  le a single SQL 
5690: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
56a0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
56b0: 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  !=sqlite3_prepar
56c0: 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
56d0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c   -1, &pStmt, &zL
56e0: 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eft) ){.        
56f0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
5700: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
5710: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  oObj(sqlite3_err
5720: 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  msg(pDb->db)));.
5730: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
5740: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
5750: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5760: 20 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d       if( pStmt==
5770: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
5780: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5790: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
57a0: 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >db) ){.        
57b0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
57c0: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
57d0: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  tToObj(sqlite3_e
57e0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29  rrmsg(pDb->db)))
57f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
5800: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5820: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5830: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
5840: 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ft;.          co
5850: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5860: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
5870: 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20   /* Bind values 
5880: 74 6f 20 77 69 6c 64 63 61 72 64 73 20 74 68 61  to wildcards tha
5890: 74 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f  t begin with $ o
58a0: 72 20 3a 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e  r : */  .      n
58b0: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
58c0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
58d0: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  nt(pStmt);.     
58e0: 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20   nParm = 0;.    
58f0: 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f    if( nVar>sizeo
5900: 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28  f(aParm)/sizeof(
5910: 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20  aParm[0]) ){.   
5920: 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 28 54       apParm = (T
5930: 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c  cl_Obj**)Tcl_All
5940: 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61  oc(nVar*sizeof(a
5950: 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20  pParm[0]));.    
5960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5970: 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b   apParm = aParm;
5980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
5990: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b  or(i=1; i<=nVar;
59a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
59b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20  onst char *zVar 
59c0: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
59d0: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53  arameter_name(pS
59e0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
59f0: 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 24   if( zVar[0]=='$
5a00: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
5a10: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ' ){.          T
5a20: 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54  cl_Obj *pVar = T
5a30: 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74  cl_GetVar2Ex(int
5a40: 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30  erp, &zVar[1], 0
5a50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
5a60: 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20  if( pVar ){.    
5a70: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
5a80: 20 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 64             u8 *d
5a90: 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ata;.           
5aa0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70   char *zType = p
5ab0: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
5ac0: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
5ad0: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20  me : "";.       
5ae0: 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54       char c = zT
5af0: 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ype[0];.        
5b00: 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26      if( c=='b' &
5b10: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
5b20: 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 29  bytearray")==0 )
5b30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5b40: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79  data = Tcl_GetBy
5b50: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70  teArrayFromObj(p
5b60: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
5b70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5b80: 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
5b90: 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c   i, data, n, SQL
5ba0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
5bb0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
5bc0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72  ncrRefCount(pVar
5bd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
5be0: 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d   apParm[nParm++]
5bf0: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
5c00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
5c10: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
5c20: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
5c30: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
5c40: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
5c50: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
5c60: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
5c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
5c80: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
5c90: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26  (interp, pVar, &
5ca0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
5cb0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
5cc0: 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b  nt(pStmt, i, n);
5cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
5ce0: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
5cf0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
5d00: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
5d20: 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  le r;.          
5d30: 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c      Tcl_GetDoubl
5d40: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
5d50: 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20   pVar, &r);.    
5d60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5d70: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
5d80: 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20  tmt, i, r);.    
5d90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
5db0: 61 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  a = Tcl_GetStrin
5dc0: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
5dd0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
5de0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
5df0: 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 64 61  ext(pStmt, i, da
5e00: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54  ta, n, SQLITE_ST
5e10: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
5e20: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
5e30: 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20  Count(pVar);.   
5e40: 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61 72             apPar
5e50: 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61  m[nParm++] = pVa
5e60: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  r;.            }
5e70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
5e90: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65        /* Compute
5ea0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
5eb0: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71  .      nCol = sq
5ec0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
5ed0: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  nt(pStmt);.     
5ee0: 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a   if( pScript ){.
5ef0: 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d          apColNam
5f00: 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54  e = (Tcl_Obj**)T
5f10: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
5f20: 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20  (Tcl_Obj*)*nCol 
5f30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
5f40: 70 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62 72  pColName==0 ) br
5f50: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  eak;.        for
5f60: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
5f70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70  +){.          ap
5f80: 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54  ColName[i] = dbT
5f90: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
5fa0: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
5fb0: 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  mt,i));.        
5fc0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5fd0: 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  nt(apColName[i])
5fe0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5ff0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
6000: 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69   results are bei
6010: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20  ng stored in an 
6020: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20  array variable, 
6030: 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20  then create.    
6040: 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a    ** the array(*
6050: 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74  ) entry for that
6060: 20 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2f 0a   array.      */.
6070: 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79        if( pArray
6080: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
6090: 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20  Obj *pColList = 
60a0: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
60b0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
60c0: 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29  fCount(pColList)
60d0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
60e0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
60f0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  .          Tcl_L
6100: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6110: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
6120: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
6130: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
6140: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
6150: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41  tVar2(interp, pA
6160: 72 72 61 79 2c 20 54 63 6c 5f 4e 65 77 53 74 72  rray, Tcl_NewStr
6170: 69 6e 67 4f 62 6a 28 22 2a 22 2c 2d 31 29 2c 20  ingObj("*",-1), 
6180: 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20  pColList,0);.   
6190: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
61a0: 78 65 63 75 74 65 20 74 68 65 20 53 51 4c 0a 20  xecute the SQL. 
61b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68       */.      wh
61c0: 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20  ile( rc==TCL_OK 
61d0: 26 26 20 70 53 74 6d 74 20 26 26 20 53 51 4c 49  && pStmt && SQLI
61e0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
61f0: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
6200: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
6210: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
6220: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
6230: 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pVal;.         
6240: 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53   .          /* S
6250: 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61  et pVal to conta
6260: 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  in the i'th colu
6270: 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20  mn of this row. 
6280: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 77 69  */.          swi
6290: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
62a0: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
62b0: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i) ){.          
62c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
62d0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
62e0: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
62f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
6300: 79 74 65 73 28 70 53 74 6d 74 2c 20 69 29 3b 0a  ytes(pStmt, i);.
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
6320: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  al = Tcl_NewByte
6330: 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33  ArrayObj(sqlite3
6340: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
6350: 6d 74 2c 20 69 29 2c 20 62 79 74 65 73 29 3b 0a  mt, i), bytes);.
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
6370: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
6380: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
6390: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
63a0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
63b0: 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34      sqlite_int64
63c0: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   v = sqlite3_col
63d0: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
63e0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
63f0: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
6400: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
6410: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
6420: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
6430: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
6440: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
6450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6460: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
6470: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
6480: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
6490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
64a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
64b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
64c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
64d0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
64e0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
64f0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
6500: 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
6510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
6520: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44   pVal = Tcl_NewD
6530: 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20  oubleObj(r);.   
6540: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
6550: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6560: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
6570: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ult: {.         
6580: 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65       pVal = dbTe
6590: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
65a0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
65b0: 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20  t, i));.        
65c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
65d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
65e0: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
65f0: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
6600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
6610: 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a  f( pArray==0 ){.
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
6630: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
6640: 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  erp, apColName[i
6650: 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a  ], 0, pVal, 0);.
6660: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
6670: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
6680: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
6690: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
66a0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56  apColName[i], pV
66b0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
66c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
66d0: 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65  }else if( choice
66e0: 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
66f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
6700: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
6710: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20             pRet 
6720: 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  = pVal;.        
6730: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
6740: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
6750: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6760: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
6770: 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20  _BREAK;.        
6780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6790: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
67a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
67b0: 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c  terp, pRet, pVal
67c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
67d0: 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
67e0: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
67f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
6800: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
6810: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
6820: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
6830: 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49  f( rc==TCL_CONTI
6840: 4e 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NUE ){.         
6850: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
6860: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6870: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6880: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
6890: 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20  BREAK ){.       
68a0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
68b0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
68c0: 46 72 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Free the column 
68d0: 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  name objects */.
68e0: 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70        if( pScrip
68f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  t ){.        for
6900: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
6910: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
6920: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61  l_DecrRefCount(a
6930: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
6940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6950: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
6960: 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  apColName);.    
6970: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72    }..      /* Fr
6980: 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72  ee the bound str
6990: 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72  ing and blob par
69a0: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 20  ameters */.     
69b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72   for(i=0; i<nPar
69c0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; i++){.       
69d0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
69e0: 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20  t(apParm[i]);.  
69f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6a00: 61 70 50 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b  apParm!=aParm ){
6a10: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
6a20: 65 28 28 63 68 61 72 2a 29 61 70 50 61 72 6d 29  e((char*)apParm)
6a30: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6a40: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
6a50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
6a60: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  the result code 
6a70: 69 73 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  is SQLITE_SCHEMA
6a80: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
6a90: 74 72 79 20 61 67 61 69 6e 20 74 6f 20 65 78 65  try again to exe
6aa0: 63 75 74 65 20 74 68 65 20 73 61 6d 65 20 73 74  cute the same st
6ab0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
6ac0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
6ad0: 45 5f 53 43 48 45 4d 41 3d 3d 73 71 6c 69 74 65  E_SCHEMA==sqlite
6ae0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
6af0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ) ){.        con
6b00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6b10: 20 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49   .      if( SQLI
6b20: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
6b30: 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20  rrcode(pDb->db) 
6b40: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  ){.        Tcl_S
6b50: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
6b60: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
6b70: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
6b80: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20  Db->db)));.     
6b90: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
6ba0: 52 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  R;.        break
6bb0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6bc0: 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20   zSql = zLeft;. 
6bd0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
6be0: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32  rRefCount(objv[2
6bf0: 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65  ]);..    if( pRe
6c00: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  t ){.      if( r
6c10: 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
6c20: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
6c30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
6c40: 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
6c50: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
6c60: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d  unt(pRet);.    }
6c70: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6c80: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
6c90: 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45  db function NAME
6ca0: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
6cb0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
6cc0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  QL function call
6cd0: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
6ce0: 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  er that function
6cf0: 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c   is.  ** called,
6d00: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
6d10: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
6d20: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
6d30: 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e  case DB_FUNCTION
6d40: 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20  : {.    SqlFunc 
6d50: 2a 70 46 75 6e 63 3b 0a 20 20 20 20 63 68 61 72  *pFunc;.    char
6d60: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
6d70: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
6d80: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
6d90: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
6da0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6db0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6dc0: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
6dd0: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
6de0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6df0: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
6e00: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6e10: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
6e20: 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
6e30: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6e40: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
6e50: 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
6e60: 46 75 6e 63 20 3d 20 28 53 71 6c 46 75 6e 63 2a  Func = (SqlFunc*
6e70: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
6e80: 6f 66 28 2a 70 46 75 6e 63 29 20 2b 20 6e 53 63  of(*pFunc) + nSc
6e90: 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20  ript + 1 );.    
6ea0: 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72  if( pFunc==0 ) r
6eb0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6ec0: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 69 6e 74 65  .    pFunc->inte
6ed0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
6ee0: 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 20 3d 20   pFunc->pNext = 
6ef0: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  pDb->pFunc;.    
6f00: 70 46 75 6e 63 2d 3e 7a 53 63 72 69 70 74 20 3d  pFunc->zScript =
6f10: 20 28 63 68 61 72 2a 29 26 70 46 75 6e 63 5b 31   (char*)&pFunc[1
6f20: 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e  ];.    pDb->pFun
6f30: 63 20 3d 20 70 46 75 6e 63 3b 0a 20 20 20 20 73  c = pFunc;.    s
6f40: 74 72 63 70 79 28 70 46 75 6e 63 2d 3e 7a 53 63  trcpy(pFunc->zSc
6f50: 72 69 70 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a  ript, zScript);.
6f60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6f70: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
6f80: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
6f90: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
6fa0: 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c  ,.        pFunc,
6fb0: 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20   tclSqlFunc, 0, 
6fc0: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
6fd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
6fe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6ff0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
7000: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61  .  **     $db la
7010: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20  st_insert_rowid 
7020: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
7030: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
7040: 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  ch is the ROWID 
7050: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
7060: 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f  ent insert..  */
7070: 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f  .  case DB_LAST_
7080: 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a  INSERT_ROWID: {.
7090: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
70a0: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72 6f  sult;.    int ro
70b0: 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  wid;.    if( obj
70c0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
70d0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
70e0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
70f0: 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
7100: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7110: 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73   }.    rowid = s
7120: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7130: 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62  rt_rowid(pDb->db
7140: 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
7150: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
7160: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
7170: 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
7180: 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20  sult, rowid);.  
7190: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
71a0: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f  /*.  ** The DB_O
71b0: 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20  NECOLUMN method 
71c0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74  is implemented t
71d0: 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f  ogether with DB_
71e0: 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  EVAL..  */..  /*
71f0: 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73 73      $db progress
7200: 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20   ?N CALLBACK?.  
7210: 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  ** .  ** Invoke 
7220: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
7230: 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74 75  ck every N virtu
7240: 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64  al machine opcod
7250: 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74 69  es while executi
7260: 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ng.  ** queries.
7270: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
7280: 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20  PROGRESS: {.    
7290: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
72a0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
72b0: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
72c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
72d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
72e0: 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a  >zProgress, 0);.
72f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
7300: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
7310: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
7320: 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e  ogress;.      in
7330: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74  t len;.      int
7340: 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43   N;.      if( TC
7350: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
7360: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
7370: 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a  objv[2], &N) ){.
7380: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7390: 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  R;.      };.    
73a0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
73b0: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
73c0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
73d0: 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20  rogress);.      
73e0: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73  }.      zProgres
73f0: 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
7400: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
7410: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
7420: 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20  f( zProgress && 
7430: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
7440: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
7450: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
7460: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
7470: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  strcpy(pDb->zPro
7480: 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73  gress, zProgress
7490: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
74a0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
74b0: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
74c0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
74d0: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
74e0: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20  _CALLBACK.      
74f0: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
7500: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ss ){.        pD
7510: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
7520: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
7530: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
7540: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c  dler(pDb->db, N,
7550: 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
7560: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
7570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
7580: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
7590: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
75a0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
75b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
75c0: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
75d0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
75e0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20  rp, 2, objv, "N 
75f0: 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
7600: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7610: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
7620: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
7630: 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65   **     $db reke
7640: 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y KEY.  **.  ** 
7650: 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79  Change the encry
7660: 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65  ption key on the
7670: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
7680: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
7690: 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20   case DB_REKEY: 
76a0: 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  {.    int nKey;.
76b0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
76c0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
76d0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
76e0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
76f0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22  , 2, objv, "KEY"
7700: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7710: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7720: 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f  .    pKey = Tcl_
7730: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
7740: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b  Obj(objv[2], &nK
7750: 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ey);.#ifdef SQLI
7760: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
7770: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
7780: 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65  key(pDb->db, pKe
7790: 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66  y, nKey);.    if
77a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
77b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
77c0: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
77d0: 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20  rStr(rc), 0);.  
77e0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
77f0: 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OR;.    }.#endif
7800: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7810: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
7820: 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45  db timeout MILLE
7830: 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a  SECONDS.  **.  *
7840: 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20  * Delay for the 
7850: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
7860: 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64  econds specified
7870: 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20   when a file is 
7880: 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  locked..  */.  c
7890: 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20  ase DB_TIMEOUT: 
78a0: 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20  {.    int ms;.  
78b0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
78c0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
78d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
78e0: 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53  2, objv, "MILLIS
78f0: 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20  ECONDS");.      
7900: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7920: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
7930: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
7940: 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
7950: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7960: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
7970: 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73  eout(pDb->db, ms
7980: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
7990: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
79a0: 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67   $db total_chang
79b0: 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
79c0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
79d0: 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
79e0: 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
79f0: 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
7a00: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
7a10: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7a20: 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a  was created..  *
7a30: 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41  /.  case DB_TOTA
7a40: 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  L_CHANGES: {.   
7a50: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
7a60: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
7a70: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
7a80: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7a90: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
7aa0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7ab0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7ac0: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
7ad0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
7ae0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
7af0: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
7b00: 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  lt, sqlite3_tota
7b10: 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64  l_changes(pDb->d
7b20: 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b));.    break;.
7b30: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
7b40: 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b   trace ?CALLBACK
7b50: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
7b60: 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
7b70: 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
7b80: 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72  BACK routine for
7b90: 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
7ba0: 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ent.  ** that is
7bb0: 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
7bc0: 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
7bd0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43  is appended to C
7be0: 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20  ALLBACK before. 
7bf0: 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74   ** it is execut
7c00: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
7c10: 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20  DB_TRACE: {.    
7c20: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
7c30: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
7c40: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
7c50: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
7c60: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
7c70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7c80: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
7c90: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
7ca0: 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
7cb0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
7cc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7cd0: 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b  pDb->zTrace, 0);
7ce0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7cf0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
7d00: 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e  zTrace;.      in
7d10: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
7d20: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
7d30: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
7d40: 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
7d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72       }.      zTr
7d60: 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ace = Tcl_GetStr
7d70: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
7d80: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
7d90: 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c   if( zTrace && l
7da0: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
7db0: 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63  pDb->zTrace = Tc
7dc0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
7dd0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
7de0: 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  py(pDb->zTrace, 
7df0: 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d  zTrace);.      }
7e00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
7e10: 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20  b->zTrace = 0;. 
7e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7e30: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
7e40: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
7e50: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
7e60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
7e70: 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54  ace(pDb->db, DbT
7e80: 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  raceHandler, pDb
7e90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7ea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7eb0: 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30  trace(pDb->db, 0
7ec0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
7ed0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
7ee0: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
7ef0: 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  copy conflict-al
7f00: 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69  gorithm table fi
7f10: 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f  lename ?SEPARATO
7f20: 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f  R? ?NULLINDICATO
7f30: 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70  R?.  **.  ** Cop
7f40: 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c  y data into tabl
7f50: 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c  e from filename,
7f60: 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e   optionally usin
7f70: 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a  g SEPARATOR.  **
7f80: 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72   as column separ
7f90: 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c  ators.  If a col
7fa0: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e  umn contains a n
7fb0: 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74  ull string, or t
7fc0: 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66  he.  ** value of
7fd0: 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20   NULLINDICATOR, 
7fe0: 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74  a NULL is insert
7ff0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
8000: 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74  n..  ** conflict
8010: 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e  -algorithm is on
8020: 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20  e of the sqlite 
8030: 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  conflict algorit
8040: 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c  hms:.  **    rol
8050: 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61  lback, abort, fa
8060: 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c  il, ignore, repl
8070: 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63  ace.  ** On succ
8080: 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ess, return the 
8090: 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
80a0: 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e  processed, not n
80b0: 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a  ecessarily same.
80c0: 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e    ** as 'db chan
80d0: 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66  ges' due to conf
80e0: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73  lict-algorithm s
80f0: 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20  elected..  **.  
8100: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  ** This code is 
8110: 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70  basically an imp
8120: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61  lementation/enha
8130: 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20  ncement of.  ** 
8140: 74 68 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c  the sqlite3 shel
8150: 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f  l.c ".import" co
8160: 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  mmand..  **.  **
8170: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73   This command us
8180: 61 67 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  age is equivalen
8190: 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32  t to the sqlite2
81a0: 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e  .x COPY statemen
81b0: 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d  t,.  ** which im
81c0: 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74 61 20  ports file data 
81d0: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69  into a table usi
81e0: 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65 53 51  ng the PostgreSQ
81f0: 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d  L COPY file form
8200: 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63  at:.  **   $db c
8210: 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67  opy $conflit_alg
8220: 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66  o $table_name $f
8230: 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20  ilename \t \\N. 
8240: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
8250: 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  PY: {.    char *
8260: 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  zTable;         
8270: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
8280: 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74  data into this t
8290: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  able */.    char
82a0: 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
82b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
82c0: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
82d0: 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20 2a  o extract data *
82e0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e  /.    char *zCon
82f0: 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20 20  flict;          
8300: 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63    /* The conflic
8310: 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75  t algorithm to u
8320: 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  se */.    sqlite
8330: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
8340: 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65        /* A state
8350: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
8360: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8370: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
8380: 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  t code */.    in
8390: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
83a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
83b0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
83c0: 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
83d0: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8400: 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69  s in an SQL stri
8410: 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  ng */.    int i,
8420: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
8430: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
8440: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e  unters */.    in
8450: 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
8460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8470: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
8480: 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  zSep[] */.    in
8490: 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  t nNull;        
84a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
84b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
84c0: 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63  zNull[] */.    c
84d0: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
84e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
84f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
8500: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e  /.    char *zLin
8510: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8520: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69    /* A single li
8530: 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d  ne of input from
8540: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
8550: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20   char **azCol;  
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8570: 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75  zLine[] broken u
8580: 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a  p into columns *
8590: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d  /.    char *zCom
85a0: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
85b0: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d    /* How to comm
85c0: 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  it changes */.  
85d0: 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
85f0: 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   The input file 
8600: 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e  */.    int linen
8610: 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
8620: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
8630: 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  r of input file 
8640: 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e  */.    char zLin
8650: 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20  eNum[80];       
8660: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
8670: 72 20 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a  r print buffer *
8680: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
8690: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
86a0: 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75    /* interp resu
86b0: 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20  lt */..    char 
86c0: 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68 61 72 20  *zSep;.    char 
86d0: 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20  *zNull;.    if( 
86e0: 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37  objc<5 || objc>7
86f0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
8700: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
8710: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20  p, 2, objv, .   
8720: 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d        "CONFLICT-
8730: 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20  ALGORITHM TABLE 
8740: 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41  FILENAME ?SEPARA
8750: 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
8760: 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  TOR?");.      re
8770: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8780: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
8790: 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=6 ){.      z
87a0: 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sep = Tcl_GetStr
87b0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
87c0: 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  5], 0);.    }els
87d0: 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  e{.      zSep = 
87e0: 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  "\t";.    }.    
87f0: 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20  if( objc>=7 ){. 
8800: 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c       zNull = Tcl
8810: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8820: 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20  j(objv[6], 0);. 
8830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8840: 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20  zNull = "";.    
8850: 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20  }.    zConflict 
8860: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
8870: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
8880: 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d  0);.    zTable =
8890: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
88a0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30  omObj(objv[3], 0
88b0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54  );.    zFile = T
88c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
88d0: 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b  Obj(objv[4], 0);
88e0: 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c  .    nSep = strl
88f0: 65 6e 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e  en(zSep);.    nN
8900: 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 75  ull = strlen(zNu
8910: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  ll);.    if( nSe
8920: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
8930: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8940: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e  nterp, "Error: n
8950: 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f  on-null separato
8960: 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  r required for c
8970: 6f 70 79 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  opy", 0);.      
8980: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73  ;.    }.    if(s
89a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
89b0: 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61  onflict, "rollba
89c0: 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20 20 20  ck") != 0 &&.   
89d0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
89e0: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61  mp(zConflict, "a
89f0: 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20 26  bort"   ) != 0 &
8a00: 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  &.       sqlite3
8a10: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
8a20: 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20 21  t, "fail"    ) !
8a30: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
8a40: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
8a50: 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22  nflict, "ignore"
8a60: 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
8a70: 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d     sqlite3StrICm
8a80: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65  p(zConflict, "re
8a90: 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20 29 20  place" ) != 0 ) 
8aa0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8ab0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8ac0: 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43   "Error: \"", zC
8ad0: 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20 20 20  onflict, .      
8ae0: 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66 6c        "\", confl
8af0: 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d 75  ict-algorithm mu
8b00: 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72 6f  st be one of: ro
8b10: 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20 20 20  llback, ".      
8b20: 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20 66 61        "abort, fa
8b30: 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20 72  il, ignore, or r
8b40: 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20 20  eplace", 0);.   
8b50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8b60: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
8b70: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
8b80: 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
8b90: 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61 62  FROM '%q'", zTab
8ba0: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  le);.    if( zSq
8bb0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  l==0 ){.      Tc
8bc0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8bd0: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e  nterp, "Error: n
8be0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c  o such table: ",
8bf0: 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20   zTable, 0);.   
8c00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8c10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ROR;.    }.    n
8c20: 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53  Byte = strlen(zS
8c30: 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ql);.    rc = sq
8c40: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
8c50: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  b->db, zSql, 0, 
8c60: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
8c70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
8c80: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
8c90: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8ca0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8cb0: 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69   "Error: ", sqli
8cc0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
8cd0: 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e  db), 0);.      n
8ce0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Col = 0;.    }el
8cf0: 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  se{.      nCol =
8d00: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8d10: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
8d20: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
8d30: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
8d40: 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30  .    if( nCol==0
8d50: 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72   ) {.      retur
8d60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8d70: 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61   }.    zSql = ma
8d80: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35 30  lloc( nByte + 50
8d90: 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20   + nCol*2 );.   
8da0: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b   if( zSql==0 ) {
8db0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
8dc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8dd0: 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61  "Error: can't ma
8de0: 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20  lloc()", 0);.   
8df0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8e00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
8e10: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8e20: 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20  nByte+50, zSql, 
8e30: 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20 49 4e  "INSERT OR %q IN
8e40: 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28 3f  TO '%q' VALUES(?
8e50: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43 6f 6e  ",.         zCon
8e60: 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a  flict, zTable);.
8e70: 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a      j = strlen(z
8e80: 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Sql);.    for(i=
8e90: 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  1; i<nCol; i++){
8ea0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
8eb0: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53   = ',';.      zS
8ec0: 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20  ql[j++] = '?';. 
8ed0: 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b     }.    zSql[j+
8ee0: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53  +] = ')';.    zS
8ef0: 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72  ql[j] = 0;.    r
8f00: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
8f10: 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71  are(pDb->db, zSq
8f20: 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29  l, 0, &pStmt, 0)
8f30: 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29  ;.    free(zSql)
8f40: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
8f50: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
8f60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8f70: 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  Error: ", sqlite
8f80: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
8f90: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  ), 0);.      sql
8fa0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8fb0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
8fc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8fd0: 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70    }.    in = fop
8fe0: 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b  en(zFile, "rb");
8ff0: 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
9000: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
9010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9020: 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
9030: 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46  open file: ", zF
9040: 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ile, NULL);.    
9050: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
9060: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
9070: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9080: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43  R;.    }.    azC
9090: 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a  ol = malloc( siz
90a0: 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e  eof(azCol[0])*(n
90b0: 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  Col+1) );.    if
90c0: 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20  ( azCol==0 ) {. 
90d0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
90e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
90f0: 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c  rror: can't mall
9100: 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  oc()", 0);.     
9110: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9120: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
9130: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
9140: 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  b, "BEGIN", 0, 0
9150: 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69  , 0);.    zCommi
9160: 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20  t = "COMMIT";.  
9170: 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20    while( (zLine 
9180: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
9190: 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20  0, in))!=0 ){.  
91a0: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
91b0: 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20     i = 0;.      
91c0: 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
91d0: 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65  azCol[0] = zLine
91e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
91f0: 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b   z=zLine; *z; z+
9200: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9210: 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73  *z==zSep[0] && s
9220: 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20  trncmp(z, zSep, 
9230: 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nSep)==0 ){.    
9240: 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20        *z = 0;.  
9250: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
9260: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f         if( i<nCo
9270: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
9280: 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e   azCol[i] = &z[n
9290: 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Sep];.          
92a0: 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20    z += nSep-1;. 
92b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
92c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
92d0: 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c     if( i+1!=nCol
92e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
92f0: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20   *zErr;.        
9300: 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 32 30  zErr = malloc(20
9310: 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  0 + strlen(zFile
9320: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69  ));.        spri
9330: 6e 74 66 28 7a 45 72 72 2c 22 45 72 72 6f 72 3a  ntf(zErr,"Error:
9340: 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70   %s line %d: exp
9350: 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
9360: 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75   of data but fou
9370: 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  nd %d",.        
9380: 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f     zFile, lineno
9390: 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20  , nCol, i+1);.  
93a0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
93b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
93c0: 45 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Err, 0);.       
93d0: 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20   free(zErr);.   
93e0: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
93f0: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
9400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9410: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
9420: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
9430: 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20         /* check 
9440: 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69  for null data, i
9450: 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75  f so, bind as nu
9460: 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ll */.        if
9470: 20 28 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74   ((nNull>0 && st
9480: 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a  rcmp(azCol[i], z
9490: 4e 75 6c 6c 29 3d 3d 30 29 20 7c 7c 20 73 74 72  Null)==0) || str
94a0: 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30  len(azCol[i])==0
94b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) {.          sq
94c0: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
94d0: 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20  pStmt, i+1);.   
94e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
94f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9500: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
9510: 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31  +1, azCol[i], -1
9520: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
9530: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9540: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9550: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
9560: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9570: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
9580: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
9590: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
95a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
95b0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
95c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
95d0: 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
95e0: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
95f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  , 0);.        zC
9600: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
9610: 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
9620: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9630: 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29  .    free(azCol)
9640: 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  ;.    fclose(in)
9650: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
9660: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
9670: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
9680: 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74  pDb->db, zCommit
9690: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  , 0, 0, 0);..   
96a0: 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20   if( zCommit[0] 
96b0: 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20  == 'C' ){.      
96c0: 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20  /* success, set 
96d0: 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72  result as number
96e0: 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
96f0: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65  sed */.      pRe
9700: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
9710: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
9720: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  .      Tcl_SetIn
9730: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69  tObj(pResult, li
9740: 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  neno);.      rc 
9750: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = TCL_OK;.    }e
9760: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61  lse{.      /* fa
9770: 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69  ilure, append li
9780: 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65  neno where faile
9790: 64 20 2a 2f 0a 20 20 20 20 20 20 73 70 72 69 6e  d */.      sprin
97a0: 74 66 28 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22  tf(zLineNum,"%d"
97b0: 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  ,lineno);.      
97c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
97d0: 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65  (interp,", faile
97e0: 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  d while processi
97f0: 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65  ng line: ",zLine
9800: 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63  Num,0);.      rc
9810: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
9820: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
9830: 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20   }...  } /* End 
9840: 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74  of the SWITCH st
9850: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74  atement */.  ret
9860: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9870: 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d     sqlite3 DBNAM
9880: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45  E FILENAME ?MODE
9890: 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a  ? ?-key KEY?.**.
98a0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d  ** This is the m
98b0: 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e  ain Tcl command.
98c0: 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69    When the "sqli
98d0: 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  te" Tcl command 
98e0: 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74  is.** invoked, t
98f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
9900: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74   to process that
9910: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
9920: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
9930: 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61  nt, DBNAME, is a
9940: 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65  n arbitrary name
9950: 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61   for a new.** da
9960: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9970: 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  n.  This command
9980: 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63   creates a new c
9990: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20  ommand named.** 
99a0: 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75  DBNAME that is u
99b0: 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  sed to control t
99c0: 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  hat connection. 
99d0: 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   The database.**
99e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64   connection is d
99f0: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
9a00: 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69  DBNAME command i
9a10: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
9a20: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
9a30: 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
9a40: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
9a50: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  y that contains.
9a60: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 20 64 61  ** the sqlite da
9a70: 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 74  tabase that is t
9a80: 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 0a 2a  o be accessed..*
9a90: 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67  *.** For testing
9aa0: 20 70 75 72 70 6f 73 65 73 2c 20 77 65 20 61 6c   purposes, we al
9ab0: 73 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20 66  so support the f
9ac0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
9ad0: 20 73 71 6c 69 74 65 33 20 2d 65 6e 63 6f 64 69   sqlite3 -encodi
9ae0: 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52  ng.**.**       R
9af0: 65 74 75 72 6e 20 74 68 65 20 65 6e 63 6f 64 69  eturn the encodi
9b00: 6e 67 20 75 73 65 64 20 62 79 20 4c 49 4b 45 20  ng used by LIKE 
9b10: 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f  and GLOB operato
9b20: 72 73 2e 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20  rs.  Choices.** 
9b30: 20 20 20 20 20 20 61 72 65 20 55 54 46 2d 38 20        are UTF-8 
9b40: 61 6e 64 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a  and iso8859..**.
9b50: 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 76 65 72  **  sqlite3 -ver
9b60: 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  sion.**.**      
9b70: 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73   Return the vers
9b80: 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  ion number of th
9b90: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
9ba0: 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33  ..**.**  sqlite3
9bb0: 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a   -tcl-uses-utf.*
9bc0: 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72  *.**       Retur
9bd0: 6e 20 22 31 22 20 69 66 20 63 6f 6d 70 69 6c 65  n "1" if compile
9be0: 64 20 77 69 74 68 20 61 20 54 63 6c 20 75 73 65  d with a Tcl use
9bf0: 73 20 55 54 46 2d 38 2e 20 20 52 65 74 75 72 6e  s UTF-8.  Return
9c00: 20 22 30 22 20 69 66 0a 2a 2a 20 20 20 20 20 20   "0" if.**      
9c10: 20 6e 6f 74 2e 20 20 55 73 65 64 20 62 79 20 74   not.  Used by t
9c20: 65 73 74 73 20 74 6f 20 6d 61 6b 65 20 73 75 72  ests to make sur
9c30: 65 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  e the library wa
9c40: 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20  s compiled .**  
9c50: 20 20 20 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a       correctly..
9c60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
9c70: 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54  Main(void *cd, T
9c80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9c90: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f  p, int objc,Tcl_
9ca0: 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29  Obj *const*objv)
9cb0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b  {.  SqliteDb *p;
9cc0: 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20  .  void *pKey = 
9cd0: 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  0;.  int nKey = 
9ce0: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
9cf0: 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a  *zArg;.  char *z
9d00: 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e 73 74 20  ErrMsg;.  const 
9d10: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
9d20: 68 61 72 20 7a 42 75 66 5b 38 30 5d 3b 0a 20 20  har zBuf[80];.  
9d30: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
9d40: 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
9d50: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9d60: 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[1], 0);.    
9d70: 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
9d80: 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29  "-version")==0 )
9d90: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
9da0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9db0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c  sqlite3_version,
9dc0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
9dd0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
9de0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
9df0: 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29  rg,"-has-codec")
9e00: 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
9e10: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
9e20: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
9e30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22  esult(interp,"1"
9e40: 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ,0);.#else.     
9e50: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9e60: 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b  t(interp,"0",0);
9e70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
9e80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
9e90: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
9ea0: 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d 75 73 65  p(zArg,"-tcl-use
9eb0: 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b 0a 23 69  s-utf")==0 ){.#i
9ec0: 66 64 65 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58  fdef TCL_UTF_MAX
9ed0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
9ee0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
9ef0: 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1",0);.#else.   
9f00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9f10: 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30  ult(interp,"0",0
9f20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
9f30: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
9f40: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
9f50: 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d  bjc==5 || objc==
9f60: 36 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  6 ){.    zArg = 
9f70: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
9f80: 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32  mObj(objv[objc-2
9f90: 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73  ], 0);.    if( s
9fa0: 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79  trcmp(zArg,"-key
9fb0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ")==0 ){.      p
9fc0: 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
9fd0: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
9fe0: 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65  jv[objc-1], &nKe
9ff0: 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a 63 20 2d  y);.      objc -
a000: 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 2;.    }.  }. 
a010: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
a020: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
a030: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
a040: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
a050: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
a060: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
a070: 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
a080: 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d 4b 45 59   ?-key CODEC-KEY
a090: 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  ?".#else.      "
a0a0: 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20  HANDLE FILENAME 
a0b0: 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69 66 0a 20  ?MODE?".#endif. 
a0c0: 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
a0d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a0e0: 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
a0f0: 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29   p = (SqliteDb*)
a100: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
a110: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
a120: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
a130: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
a140: 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22   "malloc failed"
a150: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
a160: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a170: 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ROR;.  }.  memse
a180: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
a190: 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54  p));.  zFile = T
a1a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
a1b0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
a1c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  .  sqlite3_open(
a1d0: 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a  zFile, &p->db);.
a1e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
a1f0: 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  =sqlite3_errcode
a200: 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a  (p->db) ){.    z
a210: 45 72 72 4d 73 67 20 3d 20 73 74 72 64 75 70 28  ErrMsg = strdup(
a220: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
a230: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  ->db));.    sqli
a240: 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
a250: 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b  ;.    p->db = 0;
a260: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
a270: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73  TE_HAS_CODEC.  s
a280: 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62  qlite3_key(p->db
a290: 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23  , pKey, nKey);.#
a2a0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64  endif.  if( p->d
a2b0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  b==0 ){.    Tcl_
a2c0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
a2d0: 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56  , zErrMsg, TCL_V
a2e0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63  OLATILE);.    Tc
a2f0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29  l_Free((char*)p)
a300: 3b 0a 20 20 20 20 66 72 65 65 28 7a 45 72 72 4d  ;.    free(zErrM
a310: 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  sg);.    return 
a320: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
a330: 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
a340: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
a350: 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  v[1], 0);.  Tcl_
a360: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
a370: 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
a380: 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
a390: 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
a3a0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72  ..  /* The retur
a3b0: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 76  n value is the v
a3c0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 71 6c 69  alue of the sqli
a3d0: 74 65 2a 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2f  te* pointer.  */
a3e0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
a3f0: 20 22 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20   "%p", p->db);. 
a400: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 42 75   if( strncmp(zBu
a410: 66 2c 22 30 78 22 2c 32 29 20 29 7b 0a 20 20 20  f,"0x",2) ){.   
a420: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
a430: 30 78 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20  0x%p", p->db);. 
a440: 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
a450: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
a460: 75 66 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  uf, 0);..  /* If
a470: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
a480: 51 4c 49 54 45 5f 54 45 53 54 20 74 75 72 6e 65  QLITE_TEST turne
a490: 64 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67 69 73  d on, then regis
a4a0: 74 65 72 20 74 68 65 20 22 6d 64 35 73 75 6d 22  ter the "md5sum"
a4b0: 0a 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  .  ** SQL functi
a4c0: 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  on..  */.#ifdef 
a4d0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a  SQLITE_TEST.  {.
a4e0: 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
a4f0: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
a500: 69 74 65 33 2a 29 3b 0a 23 69 66 64 65 66 20 53  ite3*);.#ifdef S
a510: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
a520: 69 6e 74 20 6d 61 6c 6c 6f 63 66 61 69 6c 20 3d  int mallocfail =
a530: 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
a540: 46 61 69 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  Fail;.    sqlite
a550: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20  3_iMallocFail = 
a560: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 4d 64  0;.#endif.    Md
a570: 35 5f 52 65 67 69 73 74 65 72 28 70 2d 3e 64 62  5_Register(p->db
a580: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
a590: 5f 44 45 42 55 47 0a 20 20 20 20 73 71 6c 69 74  _DEBUG.    sqlit
a5a0: 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d  e3_iMallocFail =
a5b0: 20 6d 61 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e   mallocfail;.#en
a5c0: 64 69 66 0a 20 20 20 7d 0a 23 65 6e 64 69 66 20  dif.   }.#endif 
a5d0: 20 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20   .  p->interp = 
a5e0: 69 6e 74 65 72 70 3b 0a 20 20 72 65 74 75 72 6e  interp;.  return
a5f0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
a600: 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d  * Provide a dumm
a610: 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20  y Tcl_InitStubs 
a620: 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20  if we are using 
a630: 74 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63  this as a static
a640: 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  .** library..*/.
a650: 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f  #ifndef USE_TCL_
a660: 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54  STUBS.# undef  T
a670: 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64  cl_InitStubs.# d
a680: 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74  efine Tcl_InitSt
a690: 75 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  ubs(a,b,c).#endi
a6a0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  f../*.** Initial
a6b0: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
a6c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20  .**.** This Tcl 
a6d0: 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20  module contains 
a6e0: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65  only a single ne
a6f0: 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61  w Tcl command na
a700: 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a  med "sqlite"..**
a710: 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69 73   (Hence there is
a720: 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20   no namespace.  
a730: 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  There is no poin
a740: 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d  t in using a nam
a750: 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65  espace.** if the
a760: 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20   extension only 
a770: 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77  supplies one new
a780: 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73 71   name!)  The "sq
a790: 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73  lite" command is
a7a0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  .** used to open
a7b0: 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61   a new SQLite da
a7c0: 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68 65  tabase.  See the
a7d0: 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e   DbMain() routin
a7e0: 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61  e above.** for a
a7f0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
a800: 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 53 71  ation..*/.int Sq
a810: 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
a820: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
a830: 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28    Tcl_InitStubs(
a840: 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30  interp, "8.4", 0
a850: 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
a860: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
a870: 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63  , "sqlite3", (Tc
a880: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
a890: 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54  Main, 0, 0);.  T
a8a0: 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
a8b0: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
a8c0: 20 22 33 2e 30 22 29 3b 0a 20 20 72 65 74 75 72   "3.0");.  retur
a8d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  n TCL_OK;.}.int 
a8e0: 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28  Tclsqlite3_Init(
a8f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
a900: 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53  rp){.  Tcl_InitS
a910: 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
a920: 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  4", 0);.  Tcl_Cr
a930: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
a940: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
a950: 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
a960: 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
a970: 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  ;.  Tcl_PkgProvi
a980: 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
a990: 74 65 33 22 2c 20 22 33 2e 30 22 29 3b 0a 20 20  te3", "3.0");.  
a9a0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a9b0: 0a 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66  .int Sqlite3_Saf
a9c0: 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
a9d0: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74   *interp){.  ret
a9e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e  urn TCL_OK;.}.in
a9f0: 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66  t Tclsqlite3_Saf
aa00: 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
aa10: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74   *interp){.  ret
aa20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
aa30: 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a  ifdef TCLSH./***
aa40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aa50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aa60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aa70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aa80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
aa90: 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c  e code that foll
aaa0: 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62  ows is used to b
aab0: 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20  uild standalone 
aac0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73  TCL interpreters
aad0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .*/../*.** If th
aae0: 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
aaf0: 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69   one, then put i
ab00: 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20  n code this for 
ab10: 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f  the.** "main" ro
ab20: 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
ab30: 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61  initialize Tcl a
ab40: 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72  nd take input fr
ab50: 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  om.** standard i
ab60: 6e 70 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c  nput..*/.#if TCL
ab70: 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61  SH==1.static cha
ab80: 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a  r zMainloop[] =.
ab90: 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
aba0: 22 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f  ".  "while {![eo
abb0: 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20  f stdin]} {\n". 
abc0: 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c     "if {$line!=\
abd0: 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
abe0: 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
abf0: 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"> \"\n".    "
ac00: 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
ac10: 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
ac20: 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20  ne \"% \"\n".   
ac30: 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73   "}\n".    "flus
ac40: 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20  h stdout\n".    
ac50: 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
ac60: 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
ac70: 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70   "if {[info comp
ac80: 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e  lete $line]} {\n
ac90: 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61  ".      "if {[ca
aca0: 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20  tch {uplevel #0 
acb0: 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20  $line} result]} 
acc0: 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
acd0: 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f  ts stderr \"Erro
ace0: 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a  r: $result\"\n".
acf0: 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20        "} elseif 
ad00: 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20  {$result!=\"\"} 
ad10: 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
ad20: 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20  ts $result\n".  
ad30: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
ad40: 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
ad50: 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
ad60: 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c  .      "append l
ad70: 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22  ine \\n\n".    "
ad80: 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23  }\n".  "}\n".;.#
ad90: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
ada0: 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20  the macro TCLSH 
adb0: 69 73 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74  is two, then get
adc0: 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63   the main loop c
add0: 6f 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68  ode out of.** th
ade0: 65 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 20  e separate file 
adf0: 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68  "spaceanal_tcl.h
ae00: 22 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d  "..*/.#if TCLSH=
ae10: 3d 32 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  =2.static char z
ae20: 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69  Mainloop[] = .#i
ae30: 6e 63 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61  nclude "spaceana
ae40: 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69  l_tcl.h".;.#endi
ae50: 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48  f..#define TCLSH
ae60: 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20  _MAIN main   /* 
ae70: 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f  Needed to fake o
ae80: 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69  ut mktclapp */.i
ae90: 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e  nt TCLSH_MAIN(in
aea0: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
aeb0: 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  rgv){.  Tcl_Inte
aec0: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
aed0: 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  l_FindExecutable
aee0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74  (argv[0]);.  int
aef0: 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
af00: 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69  Interp();.  Sqli
af10: 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
af20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
af30: 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74  TEST.  {.    ext
af40: 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
af50: 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st1_Init(Tcl_Int
af60: 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
af70: 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
af80: 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  2_Init(Tcl_Inter
af90: 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
afa0: 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f  int Sqlitetest3_
afb0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
afc0: 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
afd0: 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e  t Sqlitetest4_In
afe0: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
aff0: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
b000: 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
b010: 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
b020: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64     extern int Md
b030: 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  5_Init(Tcl_Inter
b040: 70 2a 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  p*);.    Sqlitet
b050: 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70  est1_Init(interp
b060: 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
b070: 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t2_Init(interp);
b080: 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33  .    Sqlitetest3
b090: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
b0a0: 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49     Sqlitetest4_I
b0b0: 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
b0c0: 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
b0d0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d  t(interp);.    M
b0e0: 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  d5_Init(interp);
b0f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
b100: 28 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c  ( argc>=2 || TCL
b110: 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  SH==2 ){.    int
b120: 20 69 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56   i;.    Tcl_SetV
b130: 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30  ar(interp,"argv0
b140: 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c  ",argv[1],TCL_GL
b150: 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
b160: 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
b170: 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43  p,"argv", "", TC
b180: 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
b190: 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53      for(i=3-TCLS
b1a0: 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  H; i<argc; i++){
b1b0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61  .      Tcl_SetVa
b1c0: 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22  r(interp, "argv"
b1d0: 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20  , argv[i],.     
b1e0: 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f       TCL_GLOBAL_
b1f0: 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f  ONLY | TCL_LIST_
b200: 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50  ELEMENT | TCL_AP
b210: 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20  PEND_VALUE);.   
b220: 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48   }.    if( TCLSH
b230: 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46  ==1 && Tcl_EvalF
b240: 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ile(interp, argv
b250: 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  [1])!=TCL_OK ){.
b260: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
b270: 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65   *zInfo = Tcl_Ge
b280: 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72  tVar(interp, "er
b290: 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c  rorInfo", TCL_GL
b2a0: 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
b2b0: 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29    if( zInfo==0 )
b2c0: 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d   zInfo = interp-
b2d0: 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66  >result;.      f
b2e0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
b2f0: 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c  s: %s\n", *argv,
b300: 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72   zInfo);.      r
b310: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
b320: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d 31   }.  if( argc<=1
b330: 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a   || TCLSH==2 ){.
b340: 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76      Tcl_GlobalEv
b350: 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e  al(interp, zMain
b360: 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  loop);.  }.  ret
b370: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
b380: 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23 65 6e  /* TCLSH */..#en
b390: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
b3a0: 4e 4f 5f 54 43 4c 29 20 2a 2f 0a                 NO_TCL) */.