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

Artifact ef3276d0967cc0042bedcc1a7f09e0eb95cd3a8c:


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: 32 38 20 32 30 30 35 2f 30 37 2f 32 33 20 30 32  28 2005/07/23 02
01c0: 3a 31 37 3a 30 33 20 64 72 68 20 45 78 70 20 24  :17:03 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 23  ude <assert.h>.#
0290: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
02a0: 3e 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f 50  >..#define NUM_P
02b0: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30  REPARED_STMTS 10
02c0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 52 45  .#define MAX_PRE
02d0: 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30 30 0a  PARED_STMTS 100.
02e0: 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c 20 75 73  ./*.** If TCL us
02f0: 65 73 20 55 54 46 2d 38 20 61 6e 64 20 53 51 4c  es UTF-8 and SQL
0300: 69 74 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ite is configure
0310: 64 20 74 6f 20 75 73 65 20 69 73 6f 38 38 35 39  d to use iso8859
0320: 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20 68 61 76  , then we.** hav
0330: 65 20 74 6f 20 64 6f 20 61 20 74 72 61 6e 73 6c  e to do a transl
0340: 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f 69 6e 67  ation when going
0350: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
0360: 2e 20 20 53 65 74 20 74 68 65 20 0a 2a 2a 20 55  .  Set the .** U
0370: 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e  TF_TRANSLATION_N
0380: 45 45 44 45 44 20 6d 61 63 72 6f 20 74 6f 20 69  EEDED macro to i
0390: 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20  ndicate that we 
03a0: 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74 68  need to do.** th
03b0: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 20  is translation. 
03c0: 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
03d0: 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29 20 26 26  (TCL_UTF_MAX) &&
03e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
03f0: 5f 55 54 46 38 29 0a 23 20 64 65 66 69 6e 65 20  _UTF8).# define 
0400: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
0410: 4e 45 45 44 45 44 20 31 0a 23 65 6e 64 69 66 0a  NEEDED 1.#endif.
0420: 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c 20 66  ./*.** New SQL f
0430: 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20  unctions can be 
0440: 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20 73  created as TCL s
0450: 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73 75  cripts.  Each su
0460: 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ch function.** i
0470: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
0480: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0490: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
04a0: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
04b0: 66 20 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  f struct SqlFunc
04c0: 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72 75 63 74   SqlFunc;.struct
04d0: 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20 54 63 6c   SqlFunc {.  Tcl
04e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
04f0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
0500: 74 65 72 70 72 65 74 20 74 6f 20 65 78 65 63 75  terpret to execu
0510: 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  te the function 
0520: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
0530: 63 72 69 70 74 3b 20 20 20 20 20 2f 2a 20 54 68  cript;     /* Th
0540: 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70 72 65 73  e Tcl_Obj repres
0550: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0560: 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74 20  script */.  int 
0570: 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20 20  useEvalObjv;    
0580: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 20    /* True if it 
0590: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
05a0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20  cl_EvalObjv */. 
05b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
05c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
05d0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
05e0: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e  */.  SqlFunc *pN
05f0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
0600: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0610: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0620: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0630: 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   New collation s
0640: 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f  equences functio
0650: 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  n can be created
0660: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0670: 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66    Each such.** f
0680: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72  unction is descr
0690: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
06a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
06b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
06c0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
06d0: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c  t SqlCollate Sql
06e0: 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20  Collate;.struct 
06f0: 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54  SqlCollate {.  T
0700: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0710: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
0720: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
0730: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
0740: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63  n */.  char *zSc
0750: 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ript;        /* 
0760: 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65  The script to be
0770: 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c   run */.  SqlCol
0780: 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  late *pNext;    
0790: 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e  /* Next function
07a0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20   on the list of 
07b0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a  them all */.};..
07c0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20 73  /*.** Prepared s
07d0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 61  tatements are ca
07e0: 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72 20  ched for faster 
07f0: 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63 68  execution.  Each
0800: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
0810: 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72 69  tement is descri
0820: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0830: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0840: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0850: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0860: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0870: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0880: 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  ;.struct SqlPrep
0890: 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71 6c  aredStmt {.  Sql
08a0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
08b0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
08c0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
08d0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
08e0: 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50 72  t *pPrev;  /* Pr
08f0: 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c 69  evious on the li
0900: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
0910: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
0920: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
0930: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0940: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
0950: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61 72           /* char
0960: 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  s in zSql[] */. 
0970: 20 63 68 61 72 20 7a 53 71 6c 5b 31 5d 3b 20 20   char zSql[1];  
0980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
0990: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
09a0: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  tement */.};../*
09b0: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  .** There is one
09c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
09d0: 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
09e0: 65 61 63 68 20 53 51 4c 69 74 65 20 64 61 74 61  each SQLite data
09f0: 62 61 73 65 0a 2a 2a 20 74 68 61 74 20 68 61 73  base.** that has
0a00: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20   been opened by 
0a10: 74 68 65 20 53 51 4c 69 74 65 20 54 43 4c 20 69  the SQLite TCL i
0a20: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 74 79 70  nterface..*/.typ
0a30: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 69  edef struct Sqli
0a40: 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a 73  teDb SqliteDb;.s
0a50: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
0a60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0a80: 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74 61   The "real" data
0a90: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a  base structure *
0aa0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
0ab0: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f  interp;        /
0ac0: 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65  * The interprete
0ad0: 72 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  r used for this 
0ae0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
0af0: 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20  ar *zBusy;      
0b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0b10: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f  busy callback ro
0b20: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0b30: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
0b40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
0b50: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
0b60: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0b70: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0b90: 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
0ba0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0bb0: 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20  r *zProgress;   
0bc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0bd0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
0be0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0bf0: 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20  ar *zAuth;      
0c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0c10: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
0c20: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0c30: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b  /.  char *zNull;
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c50: 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69  * Text to substi
0c60: 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20  tute for an SQL 
0c70: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
0c80: 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20  SqlFunc *pFunc; 
0c90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
0ca0: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
0cb0: 6f 6e 73 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ons */.  SqlColl
0cc0: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20  ate *pCollate;  
0cd0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53      /* List of S
0ce0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
0cf0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
0d00: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
0d10: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
0d20: 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65   code of most re
0d30: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  cent sqlite3_exe
0d40: 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  c() */.  Tcl_Obj
0d50: 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64   *pCollateNeeded
0d60: 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e  ;   /* Collation
0d70: 20 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a   needed script *
0d80: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
0d90: 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f  tmt *stmtList; /
0da0: 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72  * List of prepar
0db0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a  ed statements*/.
0dc0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0dd0: 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20  t *stmtLast; /* 
0de0: 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69  Last statement i
0df0: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0e00: 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20  int maxStmt;    
0e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0e20: 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e  e next maximum n
0e30: 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73  umber of stmtLis
0e40: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74  t */.  int nStmt
0e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0e60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
0e70: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d  tatements in stm
0e80: 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  tList */.};../*.
0e90: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73  ** Look at the s
0ea0: 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20  cript prefix in 
0eb0: 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62  pCmd.  We will b
0ec0: 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
0ed0: 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72   script.** after
0ee0: 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67   first appending
0ef0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67   one or more arg
0f00: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f  uments.  This ro
0f10: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a  utine analyzes.*
0f20: 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20  * the script to 
0f30: 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66  see if it is saf
0f40: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
0f50: 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73  lObjv() on the s
0f60: 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20  cript.** rather 
0f70: 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65  than the more ge
0f80: 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78  neral Tcl_EvalEx
0f90: 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ().  Tcl_EvalObj
0fa0: 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66  v() is much.** f
0fb0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72  aster..**.** Scr
0fc0: 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61  ipts that are sa
0fd0: 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54  fe to use with T
0fe0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f  cl_EvalObjv() co
0ff0: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63  nsists of a.** c
1000: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c  ommand name foll
1010: 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20  owed by zero or 
1020: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77  more arguments w
1030: 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20  ith no [...] or 
1040: 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72  $.** or {...} or
1050: 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e   ; to be seen an
1060: 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61  ywhere.  Most ca
1070: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63  llback scripts c
1080: 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73  onsist.** of jus
1090: 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  t a single proce
10a0: 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  dure name and th
10b0: 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71  ey meet this req
10c0: 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  uirement..*/.sta
10d0: 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73  tic int safeToUs
10e0: 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e  eEvalObjv(Tcl_In
10f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
1100: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20  l_Obj *pCmd){.  
1110: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20  /* We could try 
1120: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
1130: 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29  with Tcl_Parse()
1140: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69  .  But we will i
1150: 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74  nstead.  ** just
1160: 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
1170: 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61   forbidden chara
1180: 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f  cters.  If any o
1190: 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a  f the forbidden.
11a0: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
11b0: 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20  appear in pCmd, 
11c0: 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  we will report t
11d0: 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73  he string as uns
11e0: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  afe..  */.  cons
11f0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
1200: 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65   n;.  z = Tcl_Ge
1210: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
1220: 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c  Cmd, &n);.  whil
1230: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
1240: 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29    int c = *(z++)
1250: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27  ;.    if( c=='$'
1260: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
1270: 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b  =';' ) return 0;
1280: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
12a0: 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74  n SqlFunc struct
12b0: 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ure with the giv
12c0: 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65  en name.  Or cre
12d0: 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65  ate a new.** one
12e0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
12f0: 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  one cannot be fo
1300: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  und.  Return a p
1310: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
1320: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1330: 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66  tatic SqlFunc *f
1340: 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74  indSqlFunc(Sqlit
1350: 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  eDb *pDb, const 
1360: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1370: 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65  SqlFunc *p, *pNe
1380: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e  w;.  int i;.  pN
1390: 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54  ew = (SqlFunc*)T
13a0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
13b0: 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e  (*pNew) + strlen
13c0: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20  (zName) + 1 );. 
13d0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28   pNew->zName = (
13e0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
13f0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65    for(i=0; zName
1400: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d  [i]; i++){ pNew-
1410: 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f  >zName[i] = tolo
1420: 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d  wer(zName[i]); }
1430: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69  .  pNew->zName[i
1440: 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70  ] = 0;.  for(p=p
1450: 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d  Db->pFunc; p; p=
1460: 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20  p->pNext){ .    
1470: 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e  if( strcmp(p->zN
1480: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  ame, pNew->zName
1490: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
14a0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e  l_Free((char*)pN
14b0: 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ew);.      retur
14c0: 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n p;.    }.  }. 
14d0: 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20   pNew->interp = 
14e0: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70  pDb->interp;.  p
14f0: 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30  New->pScript = 0
1500: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
1510: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
1520: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65  pDb->pFunc = pNe
1530: 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  w;.  return pNew
1540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
1550: 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c  ize and free a l
1560: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
1570: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  statements.*/.st
1580: 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53  atic void flushS
1590: 74 6d 74 43 61 63 68 65 28 20 53 71 6c 69 74 65  tmtCache( Sqlite
15a0: 44 62 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c  Db *pDb ){.  Sql
15b0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
15c0: 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65  reStmt;..  while
15d0: 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  (  pDb->stmtList
15e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15f0: 66 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73  finalize( pDb->s
1600: 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29  tmtList->pStmt )
1610: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d  ;.    pPreStmt =
1620: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a   pDb->stmtList;.
1630: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
1640: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
1650: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  t->pNext;.    Tc
1660: 6c 5f 46 72 65 65 28 20 28 63 68 61 72 2a 29 70  l_Free( (char*)p
1670: 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20  PreStmt );.  }. 
1680: 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b   pDb->nStmt = 0;
1690: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  .  pDb->stmtLast
16a0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
16b0: 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72  CL calls this pr
16c0: 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20  ocedure when an 
16d0: 73 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65  sqlite3 database
16e0: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64   command is.** d
16f0: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
1700: 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43  c void DbDeleteC
1710: 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20  md(void *db){.  
1720: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
1730: 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20  (SqliteDb*)db;. 
1740: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
1750: 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pDb);.  sqlite3_
1760: 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a  close(pDb->db);.
1770: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46    while( pDb->pF
1780: 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75  unc ){.    SqlFu
1790: 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d  nc *pFunc = pDb-
17a0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d  >pFunc;.    pDb-
17b0: 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e  >pFunc = pFunc->
17c0: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44  pNext;.    Tcl_D
17d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
17e0: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
17f0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1800: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
1810: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
1820: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
1830: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
1840: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
1850: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
1860: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
1870: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
1880: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
1890: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
18a0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
18b0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
18c0: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
18d0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
18e0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
18f0: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
1900: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
1910: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
1920: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d  pDb->zAuth);.  }
1930: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c  .  if( pDb->zNul
1940: 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  l ){.    Tcl_Fre
1950: 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20  e(pDb->zNull);. 
1960: 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63   }.  Tcl_Free((c
1970: 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a  har*)pDb);.}../*
1980: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1990: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
19a0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19b0: 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20  is locked while 
19c0: 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65  trying.** to exe
19d0: 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61  cute SQL..*/.sta
19e0: 74 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61  tic int DbBusyHa
19f0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
1a00: 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53  int nTries){.  S
1a10: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
1a20: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
1a30: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
1a40: 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 70 72 69  Val[30];..  spri
1a50: 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64 22 2c 20  ntf(zVal, "%d", 
1a60: 6e 54 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20  nTries);.  rc = 
1a70: 54 63 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d  Tcl_VarEval(pDb-
1a80: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  >interp, pDb->zB
1a90: 75 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20  usy, " ", zVal, 
1aa0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28  (char*)0);.  if(
1ab0: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
1ac0: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
1ad0: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
1ae0: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
1af0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1b00: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1b10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1b20: 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27  invoked as the '
1b30: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
1b40: 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  k' for the datab
1b50: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1b60: 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e  nt DbProgressHan
1b70: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
1b80: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
1b90: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
1ba0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1bb0: 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67  sert( pDb->zProg
1bc0: 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54  ress );.  rc = T
1bd0: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
1be0: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
1bf0: 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ess);.  if( rc!=
1c00: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
1c10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1c20: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
1c30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1c40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c60: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1c70: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
1c80: 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68  trace handler wh
1c90: 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20  enever a new.** 
1ca0: 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20  block of SQL is 
1cb0: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54  executed.  The T
1cc0: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
1cd0: 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63  ->zTrace is exec
1ce0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
1cf0: 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64  void DbTraceHand
1d00: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
1d10: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
1d20: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1d30: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
1d40: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
1d50: 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72  str;..  Tcl_DStr
1d60: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
1d70: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
1d80: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54  nd(&str, pDb->zT
1d90: 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  race, -1);.  Tcl
1da0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
1db0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
1dc0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
1dd0: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
1de0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
1df0: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
1e00: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
1e10: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
1e20: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a  Db->interp);.}..
1e30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
1e50: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
1e60: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54  is committed.  T
1e70: 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74  he.** TCL script
1e80: 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74   in pDb->zCommit
1e90: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 49   is executed.  I
1ea0: 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e  f it returns non
1eb0: 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69  -zero or.** if i
1ec0: 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  t throws an exce
1ed0: 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73  ption, the trans
1ee0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1ef0: 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a   back instead.**
1f00: 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   of being commit
1f10: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
1f20: 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c  nt DbCommitHandl
1f30: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
1f40: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
1f50: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
1f60: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
1f70: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
1f80: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
1f90: 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
1fa0: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
1fb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1fc0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
1fd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1fe0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1ff0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2000: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
2010: 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  d(.  void *pCtx,
2020: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
2030: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e    int enc,.  con
2040: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
2050: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
2060: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
2070: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
2080: 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  *pScript = Tcl_D
2090: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
20a0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
20b0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
20c0: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
20d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
20e0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
20f0: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
2100: 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31  ingObj(zName, -1
2110: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
2120: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
2130: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
2140: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2150: 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a  (pScript);.}../*
2160: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2170: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
2180: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f  aluate an SQL co
2190: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
21a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
21b0: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
21c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21d0: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20  tclSqlCollate(. 
21e0: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
21f0: 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nA,.  const v
2200: 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
2210: 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  B,.  const void 
2220: 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c  *zB.){.  SqlColl
2230: 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c  ate *p = (SqlCol
2240: 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54  late *)pCtx;.  T
2250: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
2260: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53   pCmd = Tcl_NewS
2270: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72  tringObj(p->zScr
2280: 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ipt, -1);.  Tcl_
2290: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
22a0: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
22b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
22c0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
22d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
22e0: 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c  (zA, nA));.  Tcl
22f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2300: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
2310: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
2320: 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29  ringObj(zB, nB))
2330: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
2340: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
2350: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
2360: 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
2370: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
2380: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
2390: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
23a0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
23b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
23c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
23d0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
23e0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
23f0: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
2400: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
2410: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
2420: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
2430: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2440: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
2450: 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b  e3_value**argv){
2460: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20  .  SqlFunc *p = 
2470: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
2480: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63  a(context);.  Tc
2490: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69  l_Obj *pCmd;.  i
24a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
24b0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
24c0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
24d0: 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e  e are no argumen
24e0: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
24f0: 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  on, call Tcl_Eva
2500: 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20  lObjEx on the.  
2510: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
2520: 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ct directly.  Th
2530: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43  is allows the TC
2540: 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65  L compiler to ge
2550: 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79  nerate.    ** by
2560: 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63  tecode for the c
2570: 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69  ommand on the fi
2580: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
2590: 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20  nd thus make.   
25a0: 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69   ** subsequent i
25b0: 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20  nvocations much 
25c0: 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70  faster. */.    p
25d0: 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74  Cmd = p->pScript
25e0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
25f0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
2600: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
2610: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
2620: 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63  pCmd, 0);.    Tc
2630: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
2640: 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
2650: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
2660: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  re arguments to 
2670: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  the function, ma
2680: 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70  ke a shallow cop
2690: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
26a0: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c  script object, l
26b0: 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d  append the argum
26c0: 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75  ents, then evalu
26d0: 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ate the copy..  
26e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22    **.    ** By "
26f0: 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77  shallow" copy, w
2700: 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68  e mean a only th
2710: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
2720: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
2730: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
2740: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
2750: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
2760: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
2770: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
2780: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
2790: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
27a0: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
27b0: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
27c0: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
27d0: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
27e0: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
27f0: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
2800: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
2810: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
2820: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
2830: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
2840: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
2850: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
2860: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
2870: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
2880: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
2890: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
28a0: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
28b0: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
28c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
28d0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
28e0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
28f0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
2900: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
2910: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
2920: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
2930: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
2940: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
2950: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
2960: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
2970: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
2980: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
2990: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
29a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
29b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
29c0: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
29d0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
29e0: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
29f0: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
2a00: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
2a10: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
2a20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
2a30: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
2a40: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
2a50: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
2a60: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
2a70: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
2a80: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
2a90: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
2aa0: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
2ab0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
2ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2ad0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
2ae0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
2af0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2b00: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
2b10: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
2b20: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
2b30: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
2b40: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
2b50: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
2b60: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
2b70: 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  wIntObj(v);.    
2b80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b90: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
2ba0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
2bb0: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
2bc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
2bd0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2be0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
2bf0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
2c00: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
2c10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
2c20: 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  ble(pIn);.      
2c30: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
2c40: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a  ewDoubleObj(r);.
2c50: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2c60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
2c80: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
2c90: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
2ca0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b  tringObj("", 0);
2cb0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2cc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2cd0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
2ce0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
2cf0: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
2d00: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
2d10: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
2d20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2d30: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
2d40: 65 78 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29  ext(pIn), bytes)
2d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2d60: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2d70: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2d80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2d90: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
2da0: 72 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b  rp, pCmd, pVal);
2db0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2dc0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
2dd0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
2de0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2df0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
2e00: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
2e10: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
2e20: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20  terp), -1); .   
2e30: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2e40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2e50: 66 28 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62  f( !p->useEvalOb
2e60: 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  jv ){.      /* T
2e70: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77  cl_EvalObjEx() w
2e80: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
2e90: 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  y call Tcl_EvalO
2ea0: 62 6a 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20  bjv() if pCmd.  
2eb0: 20 20 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74      ** is a list
2ec0: 20 77 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e   without a strin
2ed0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
2ee0: 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68  .  To prevent th
2ef0: 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  is from.      **
2f00: 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65   happening, make
2f10: 20 73 75 72 65 20 70 43 6d 64 20 68 61 73 20 61   sure pCmd has a
2f20: 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65   valid string re
2f30: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  presentation */.
2f40: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
2f50: 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d  ing(pCmd);.    }
2f60: 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  .    rc = Tcl_Ev
2f70: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
2f80: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
2f90: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54  L_DIRECT);.    T
2fa0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2fb0: 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCmd);.  }..  if
2fc0: 28 20 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f  ( rc && rc!=TCL_
2fd0: 52 45 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71  RETURN ){.    sq
2fe0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2ff0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
3000: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
3010: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
3020: 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54   .  }else{.    T
3030: 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54  cl_Obj *pVar = T
3040: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
3050: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  p->interp);.    
3060: 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64  int n;.    u8 *d
3070: 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ata;.    char *z
3080: 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70  Type = pVar->typ
3090: 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70  ePtr ? pVar->typ
30a0: 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b  ePtr->name : "";
30b0: 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54  .    char c = zT
30c0: 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ype[0];.    if( 
30d0: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
30e0: 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61  (zType,"bytearra
30f0: 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e  y")==0 && pVar->
3100: 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  bytes==0 ){.    
3110: 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e    /* Only return
3120: 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20   a BLOB type if 
3130: 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65  the Tcl variable
3140: 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20   is a bytearray 
3150: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  and.      ** has
3160: 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65   no string repre
3170: 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  sentation. */.  
3180: 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47      data = Tcl_G
3190: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
31a0: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
31b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31c0: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
31d0: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
31e0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
31f0: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
3200: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
3210: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
3220: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ) ||.          (
3230: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
3240: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
3250: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47  ) ){.      Tcl_G
3260: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  etIntFromObj(0, 
3270: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
3280: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3290: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b  int(context, n);
32a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
32b0: 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28  =='d' && strcmp(
32c0: 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d  zType,"double")=
32d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62  =0 ){.      doub
32e0: 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f  le r;.      Tcl_
32f0: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
3300: 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  (0, pVar, &r);. 
3310: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3320: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
3330: 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, r);.    }els
3340: 65 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20  e if( c=='w' && 
3350: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
3360: 64 65 49 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20  deInt")==0 ){.  
3370: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
3380: 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  v;.      Tcl_Get
3390: 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30  WideIntFromObj(0
33a0: 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20  , pVar, &v);.   
33b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
33c0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
33d0: 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   v);.    }else{.
33e0: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
33f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
3400: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
3410: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3420: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
3430: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
3440: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
3450: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
3460: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3470: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
3480: 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74   This is the aut
3490: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63  hentication func
34a0: 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64  tion.  It append
34b0: 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61  s the authentica
34c0: 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64  tion.** type cod
34d0: 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72  e and the two ar
34e0: 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b  guments to zCmd[
34f0: 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74  ] then invokes t
3500: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20  he result.** on 
3510: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
3520: 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65    The reply is e
3530: 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72  xamined to deter
3540: 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61  mine if the.** a
3550: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61  uthentication fa
3560: 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e  ils or succeeds.
3570: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
3580: 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20  uth_callback(.  
3590: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e  void *pArg,.  in
35a0: 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20  t code,.  const 
35b0: 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63  char *zArg1,.  c
35c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
35d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
35e0: 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63  zArg3,.  const c
35f0: 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20  har *zArg4.){.  
3600: 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54  char *zCode;.  T
3610: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
3620: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
3630: 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a  t char *zReply;.
3640: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3650: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72  = (SqliteDb*)pAr
3660: 67 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63 6f  g;..  switch( co
3670: 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  de ){.    case S
3680: 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20  QLITE_COPY      
3690: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
36a0: 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62  "SQLITE_COPY"; b
36b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
36c0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
36d0: 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  EX      : zCode=
36e0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49  "SQLITE_CREATE_I
36f0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
3700: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
3710: 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20  EATE_TABLE      
3720: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
3730: 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62  CREATE_TABLE"; b
3740: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3750: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
3760: 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d  P_INDEX : zCode=
3770: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
3780: 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  EMP_INDEX"; brea
3790: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
37a0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
37b0: 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51  ABLE : zCode="SQ
37c0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
37d0: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
37e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
37f0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47  CREATE_TEMP_TRIG
3800: 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  GER: zCode="SQLI
3810: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
3820: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
3830: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3840: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
3850: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
3860: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
3870: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
3880: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
3890: 54 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20  TE_TRIGGER    : 
38a0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
38b0: 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62  EATE_TRIGGER"; b
38c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
38d0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
38e0: 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  W       : zCode=
38f0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56  "SQLITE_CREATE_V
3900: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
3910: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c   case SQLITE_DEL
3920: 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ETE            :
3930: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
3940: 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  ELETE"; break;. 
3950: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
3960: 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20  ROP_INDEX       
3970: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3980: 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72  _DROP_INDEX"; br
3990: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
39a0: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20  LITE_DROP_TABLE 
39b0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
39c0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
39d0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
39e0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
39f0: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a  TEMP_INDEX   : z
3a00: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
3a10: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62  P_TEMP_INDEX"; b
3a20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3a30: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
3a40: 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d  TABLE   : zCode=
3a50: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
3a60: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
3a70: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3a80: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  _DROP_TEMP_TRIGG
3a90: 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  ER : zCode="SQLI
3aa0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49  TE_DROP_TEMP_TRI
3ab0: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
3ac0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
3ad0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20  OP_TEMP_VIEW    
3ae0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
3af0: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b  DROP_TEMP_VIEW";
3b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3b10: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49   SQLITE_DROP_TRI
3b20: 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64  GGER      : zCod
3b30: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
3b40: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
3b50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3b60: 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20  DROP_VIEW       
3b70: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
3b80: 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72  E_DROP_VIEW"; br
3b90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
3ba0: 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20  LITE_INSERT     
3bb0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
3bc0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20  SQLITE_INSERT"; 
3bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3be0: 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20  SQLITE_PRAGMA   
3bf0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
3c00: 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22  ="SQLITE_PRAGMA"
3c10: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3c20: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20  e SQLITE_READ   
3c30: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
3c40: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22  de="SQLITE_READ"
3c50: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3c60: 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20  e SQLITE_SELECT 
3c70: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
3c80: 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43  de="SQLITE_SELEC
3c90: 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
3ca0: 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ase SQLITE_TRANS
3cb0: 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a  ACTION       : z
3cc0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41  Code="SQLITE_TRA
3cd0: 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b  NSACTION"; break
3ce0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
3cf0: 45 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 20  E_UPDATE        
3d00: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
3d10: 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65  ITE_UPDATE"; bre
3d20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
3d30: 49 54 45 5f 41 54 54 41 43 48 20 20 20 20 20 20  ITE_ATTACH      
3d40: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
3d50: 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62  QLITE_ATTACH"; b
3d60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3d70: 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20 20  QLITE_DETACH    
3d80: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
3d90: 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b  "SQLITE_DETACH";
3da0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3db0: 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41   SQLITE_ALTER_TA
3dc0: 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  BLE       : zCod
3dd0: 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f  e="SQLITE_ALTER_
3de0: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
3df0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
3e00: 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
3e10: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3e20: 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  _REINDEX"; break
3e30: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
3e40: 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20  E_ANALYZE       
3e50: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
3e60: 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72  ITE_ANALYZE"; br
3e70: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
3ea0: 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ????"; break;.  
3eb0: 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  }.  Tcl_DStringI
3ec0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
3ed0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
3ee0: 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  str, pDb->zAuth,
3ef0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
3f00: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
3f10: 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20  (&str, zCode);. 
3f20: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
3f30: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
3f40: 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20  zArg1 ? zArg1 : 
3f50: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
3f60: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
3f70: 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41  &str, zArg2 ? zA
3f80: 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg2 : "");.  Tcl
3f90: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
3fa0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
3fb0: 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b  3 ? zArg3 : "");
3fc0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
3fd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
3fe0: 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20  , zArg4 ? zArg4 
3ff0: 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63  : "");.  rc = Tc
4000: 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62  l_GlobalEval(pDb
4010: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
4020: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
4030: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
4040: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52  Free(&str);.  zR
4050: 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  eply = Tcl_GetSt
4060: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
4070: 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73  interp);.  if( s
4080: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
4090: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
40a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
40b0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
40c0: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
40d0: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
40e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
40f0: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
4100: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
4110: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
4120: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
4130: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
4140: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4150: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
4160: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
4170: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
4180: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
4190: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20  */../*.** zText 
41a0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
41b0: 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76 69  text obtained vi
41c0: 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  a an sqlite3_res
41d0: 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72  ult_text().** or
41e0: 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66 61   similar interfa
41f0: 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ce. This routine
4200: 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20 73   returns a Tcl s
4210: 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a  tring object, .*
4220: 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  * reference coun
4230: 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74  t set to 0, cont
4240: 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 2e  aining the text.
4250: 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69 6f   If a translatio
4260: 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73 6f  n.** between iso
4270: 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20 69  8859 and UTF-8 i
4280: 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20 69  s required, it i
4290: 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s preformed..*/.
42a0: 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a  static Tcl_Obj *
42b0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61 72  dbTextToObj(char
42c0: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a   const *zText){.
42d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
42e0: 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e  .#ifdef UTF_TRAN
42f0: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20  SLATION_NEEDED. 
4300: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f   Tcl_DString dCo
4310: 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  l;.  Tcl_DString
4320: 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54  Init(&dCol);.  T
4330: 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66  cl_ExternalToUtf
4340: 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54  DString(NULL, zT
4350: 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b  ext, -1, &dCol);
4360: 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65  .  pVal = Tcl_Ne
4370: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44  wStringObj(Tcl_D
4380: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f  StringValue(&dCo
4390: 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  l), -1);.  Tcl_D
43a0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c  StringFree(&dCol
43b0: 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c 20  );.#else.  pVal 
43c0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
43d0: 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23  bj(zText, -1);.#
43e0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
43f0: 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Val;.}../*.** Th
4400: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
4410: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
4420: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
4430: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
4440: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
4450: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
4460: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
4470: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
4480: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
4490: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
44a0: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
44b0: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
44c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  s..**.** The int
44d0: 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22  erface is like "
44e0: 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f  readline" but no
44f0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64   command-line ed
4500: 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65  iting.** is done
4510: 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66  ..**.** copied f
4520: 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d  rom shell.c from
4530: 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61   '.import' comma
4540: 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nd.*/.static cha
4550: 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65  r *local_getline
4560: 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20  (char *zPrompt, 
4570: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
4580: 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  r *zLine;.  int 
4590: 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  nLine;.  int n;.
45a0: 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c    int eol;..  nL
45b0: 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69  ine = 100;.  zLi
45c0: 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69  ne = malloc( nLi
45d0: 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e  ne );.  if( zLin
45e0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
45f0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20  .  n = 0;.  eol 
4600: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65  = 0;.  while( !e
4610: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b  ol ){.    if( n+
4620: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
4630: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
4640: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
4650: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
4660: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
4670: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
4680: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4690: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74    }.    if( fget
46a0: 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69  s(&zLine[n], nLi
46b0: 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29  ne - n, in)==0 )
46c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  {.      if( n==0
46d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65   ){.        free
46e0: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
46f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
4700: 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e   }.      zLine[n
4710: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c  ] = 0;.      eol
4720: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
4730: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  k;.    }.    whi
4740: 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20  le( zLine[n] ){ 
4750: 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e  n++; }.    if( n
4760: 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d  >0 && zLine[n-1]
4770: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
4780: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  n--;.      zLine
4790: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65  [n] = 0;.      e
47a0: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol = 1;.    }.  
47b0: 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c  }.  zLine = real
47c0: 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20  loc( zLine, n+1 
47d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e  );.  return zLin
47e0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
47f0: 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
4800: 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61   below creates a
4810: 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
4820: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e   for each.** con
4830: 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73  nection it opens
4840: 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61   to an SQLite da
4850: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
4860: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
4870: 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65  .** whenever one
4880: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
4890: 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f  tion-specific co
48a0: 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74  mmands is execut
48b0: 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46  ed.** in Tcl.  F
48c0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79  or example, if y
48d0: 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20  ou run Tcl code 
48e0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
48f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64         sqlite3 d
4900: 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65  b1  "my_database
4910: 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63  ".**       db1 c
4920: 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  lose.**.** The f
4930: 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65  irst command ope
4940: 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ns a connection 
4950: 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62  to the "my_datab
4960: 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a  ase" database.**
4970: 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20   and calls that 
4980: 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22  connection "db1"
4990: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f  .  The second co
49a0: 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69  mmand causes thi
49b0: 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20  s.** subroutine 
49c0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a  to be invoked..*
49d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
49e0: 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20  bjCmd(void *cd, 
49f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4a00: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c  rp, int objc,Tcl
4a10: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
4a20: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4a30: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
4a40: 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65  cd;.  int choice
4a50: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c  ;.  int rc = TCL
4a60: 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  _OK;.  static co
4a70: 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72  nst char *DB_str
4a80: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74  s[] = {.    "aut
4a90: 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20  horizer",       
4aa0: 20 20 22 62 75 73 79 22 2c 20 20 20 20 20 20 20    "busy",       
4ab0: 20 20 20 20 20 20 20 22 63 61 63 68 65 22 2c 0a         "cache",.
4ac0: 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20 20      "changes",  
4ad0: 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73 65            "close
4ae0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
4af0: 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20 20 22 63  collate",.    "c
4b00: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22  ollation_needed"
4b10: 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ,   "commit_hook
4b20: 22 2c 20 20 20 20 20 20 20 22 63 6f 6d 70 6c 65  ",       "comple
4b30: 74 65 22 2c 0a 20 20 20 20 22 63 6f 70 79 22 2c  te",.    "copy",
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
4b50: 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20  errorcode",     
4b60: 20 20 20 20 22 65 76 61 6c 22 2c 0a 20 20 20 20      "eval",.    
4b70: 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20  "function",     
4b80: 20 20 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65        "last_inse
4b90: 72 74 5f 72 6f 77 69 64 22 2c 20 22 6e 75 6c 6c  rt_rowid", "null
4ba0: 76 61 6c 75 65 22 2c 0a 20 20 20 20 22 6f 6e 65  value",.    "one
4bb0: 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20  column",        
4bc0: 20 20 22 70 72 6f 67 72 65 73 73 22 2c 20 20 20    "progress",   
4bd0: 20 20 20 20 20 20 20 22 72 65 6b 65 79 22 2c 0a         "rekey",.
4be0: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20      "timeout",  
4bf0: 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c            "total
4c00: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22  _changes",     "
4c10: 74 72 61 63 65 22 2c 0a 20 20 20 20 22 76 65 72  trace",.    "ver
4c20: 73 69 6f 6e 22 2c 0a 20 20 20 20 30 20 20 20 20  sion",.    0    
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f  .  };.  enum DB_
4c50: 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55  enum {.    DB_AU
4c60: 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20  THORIZER,       
4c70: 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20 20   DB_BUSY,       
4c80: 20 20 20 20 20 20 44 42 5f 43 41 43 48 45 2c 0a        DB_CACHE,.
4c90: 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20      DB_CHANGES, 
4ca0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c 4f            DB_CLO
4cb0: 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 44  SE,            D
4cc0: 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20 20 44  B_COLLATE,.    D
4cd0: 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44  B_COLLATION_NEED
4ce0: 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  ED,  DB_COMMIT_H
4cf0: 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43 4f 4d  OOK,      DB_COM
4d00: 50 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f  PLETE,.    DB_CO
4d10: 50 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  PY,             
4d20: 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20 20   DB_ERRORCODE,  
4d30: 20 20 20 20 20 20 44 42 5f 45 56 41 4c 2c 0a 20        DB_EVAL,. 
4d40: 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20     DB_FUNCTION, 
4d50: 20 20 20 20 20 20 20 20 20 44 42 5f 4c 41 53 54           DB_LAST
4d60: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 44 42  _INSERT_ROWID,DB
4d70: 5f 4e 55 4c 4c 56 41 4c 55 45 2c 0a 20 20 20 20  _NULLVALUE,.    
4d80: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20  DB_ONECOLUMN,   
4d90: 20 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53        DB_PROGRES
4da0: 53 2c 20 20 20 20 20 20 20 20 20 44 42 5f 52 45  S,         DB_RE
4db0: 4b 45 59 2c 0a 20 20 20 20 44 42 5f 54 49 4d 45  KEY,.    DB_TIME
4dc0: 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 20 44  OUT,           D
4dd0: 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c  B_TOTAL_CHANGES,
4de0: 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a 20 20      DB_TRACE,.  
4df0: 20 20 44 42 5f 56 45 52 53 49 4f 4e 0a 20 20 7d    DB_VERSION.  }
4e00: 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61  ;.  /* don't lea
4e10: 76 65 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d  ve trailing comm
4e20: 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69  as on DB_enum, i
4e30: 74 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41  t confuses the A
4e40: 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20  IX xlc compiler 
4e50: 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  */..  if( objc<2
4e60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
4e70: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
4e80: 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f   1, objv, "SUBCO
4e90: 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20  MMAND ...");.   
4ea0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4eb0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
4ec0: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
4ed0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
4ee0: 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69  , DB_strs, "opti
4ef0: 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29  on", 0, &choice)
4f00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
4f10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
4f20: 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44   switch( (enum D
4f30: 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b  B_enum)choice ){
4f40: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75  ..  /*    $db au
4f50: 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41  thorizer ?CALLBA
4f60: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
4f70: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
4f80: 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f  allback to autho
4f90: 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70  rize each SQL op
4fa0: 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73  eration as it is
4fb0: 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20  .  ** compiled. 
4fc0: 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65   5 arguments are
4fd0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
4fe0: 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   callback before
4ff0: 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f   it is.  ** invo
5000: 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ked:.  **.  **  
5010: 20 28 31 29 20 54 68 65 20 61 75 74 68 6f 72 69   (1) The authori
5020: 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a  zation type (ex:
5030: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5040: 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53  ABLE, SQLITE_INS
5050: 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20  ERT, ...).  **  
5060: 20 28 32 29 20 46 69 72 73 74 20 64 65 73 63 72   (2) First descr
5070: 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70  iptive name (dep
5080: 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a  ends on authoriz
5090: 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a  ation type).  **
50a0: 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65     (3) Second de
50b0: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20  scriptive name. 
50c0: 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f   **   (4) Name o
50d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  f the database (
50e0: 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d  ex: "main", "tem
50f0: 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e  p").  **   (5) N
5100: 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20 74  ame of trigger t
5110: 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65  hat is doing the
5120: 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a   access.  **.  *
5130: 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  * The callback s
5140: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20  hould return on 
5150: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
5160: 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45   strings: SQLITE
5170: 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  _OK,.  ** SQLITE
5180: 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49  _IGNORE, or SQLI
5190: 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74  TE_DENY.  Any ot
51a0: 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
51b0: 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20   is an error..  
51c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
51d0: 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65  method is invoke
51e0: 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  d with no argume
51f0: 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74  nts, the current
5200: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20   authorization. 
5210: 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72   ** callback str
5220: 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ing is returned.
5230: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
5240: 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69  AUTHORIZER: {.#i
5250: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5260: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
5270: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
5280: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74  ult(interp, "aut
5290: 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61  horization not a
52a0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73  vailable in this
52b0: 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20   build", 0);.   
52c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
52d0: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  R;.#else.    if(
52e0: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
52f0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
5300: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
5310: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
5320: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
5330: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
5340: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
5350: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
5360: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
5370: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
5380: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
5390: 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20  >zAuth, 0);.    
53a0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
53b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68       char *zAuth
53c0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
53d0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
53e0: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
53f0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
5400: 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Auth);.      }. 
5410: 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c       zAuth = Tcl
5420: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
5430: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
5440: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74  ;.      if( zAut
5450: 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  h && len>0 ){.  
5460: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
5470: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
5480: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
5490: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 41 75   strcpy(pDb->zAu
54a0: 74 68 2c 20 7a 41 75 74 68 29 3b 0a 20 20 20 20  th, zAuth);.    
54b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
54c0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b   pDb->zAuth = 0;
54d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
54e0: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
54f0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
5500: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
5510: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
5520: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44  et_authorizer(pD
5530: 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c  b->db, auth_call
5540: 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20  back, pDb);.    
5550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5560: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
5570: 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c  horizer(pDb->db,
5580: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
5590: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
55a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
55b0: 2a 20 20 20 20 24 64 62 20 62 75 73 79 20 3f 43  *    $db busy ?C
55c0: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
55d0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
55e0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  ven callback if 
55f0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
5600: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
5610: 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  n.  ** a locked 
5620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
5630: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 55   */.  case DB_BU
5640: 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  SY: {.    if( ob
5650: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
5660: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
5670: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
5680: 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20  "CALLBACK");.   
5690: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
56a0: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
56b0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
56c0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
56d0: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  sy ){.        Tc
56e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
56f0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73  nterp, pDb->zBus
5700: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  y, 0);.      }. 
5710: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5720: 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20  char *zBusy;.   
5730: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
5740: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
5750: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5760: 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29  Free(pDb->zBusy)
5770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5780: 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74 53  zBusy = Tcl_GetS
5790: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
57a0: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
57b0: 20 20 20 69 66 28 20 7a 42 75 73 79 20 26 26 20     if( zBusy && 
57c0: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
57d0: 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63   pDb->zBusy = Tc
57e0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
57f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
5800: 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a  py(pDb->zBusy, z
5810: 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Busy);.      }el
5820: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
5830: 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >zBusy = 0;.    
5840: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
5850: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
5860: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
5870: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
5880: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
5890: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
58a0: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  DbBusyHandler, p
58b0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
58c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
58d0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
58e0: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
58f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5900: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
5910: 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20  *     $db cache 
5920: 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24  flush.  **     $
5930: 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a  db cache size n.
5940: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20    **.  ** Flush 
5950: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
5960: 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72  tement cache, or
5970: 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
5980: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
5990: 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
59a0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
59b0: 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63  B_CACHE: {.    c
59c0: 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20  har *subCmd;.   
59d0: 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28   int n;..    if(
59e0: 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20   objc<=2 ){.    
59f0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
5a00: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
5a10: 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f  jv, "cache optio
5a20: 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20  n ?arg?");.     
5a30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5a40: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62  R;.    }.    sub
5a50: 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Cmd = Tcl_GetStr
5a60: 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76  ingFromObj( objv
5a70: 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66  [2], 0 );.    if
5a80: 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26  ( *subCmd=='f' &
5a90: 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c  & strcmp(subCmd,
5aa0: 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20  "flush")==0 ){. 
5ab0: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
5ac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5ad0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
5ae0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66  erp, 2, objv, "f
5af0: 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20  lush");.        
5b00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5b10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5b20: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
5b30: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
5b40: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
5b50: 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27  if( *subCmd=='s'
5b60: 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d   && strcmp(subCm
5b70: 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  d,"size")==0 ){.
5b80: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
5b90: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
5ba0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
5bb0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
5bc0: 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20  size n");.      
5bd0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5be0: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
5bf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c  .        if( TCL
5c00: 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49  _ERROR==Tcl_GetI
5c10: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
5c20: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
5c30: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
5c40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
5c50: 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f  terp, "cannot co
5c60: 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20 20 20 20  nvert \"", .    
5c70: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
5c80: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5c90: 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20  objv[3],0), "\" 
5ca0: 74 6f 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b  to integer", 0);
5cb0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5cc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5cd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5ce0: 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b        if( n<0 ){
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75  .            flu
5d00: 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62  shStmtCache( pDb
5d10: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
5d20: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
5d30: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58   }else if( n>MAX
5d40: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20  _PREPARED_STMTS 
5d50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
5d60: 20 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f   = MAX_PREPARED_
5d70: 53 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20  STMTS;.         
5d80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62   }.          pDb
5d90: 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20  ->maxStmt = n;. 
5da0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5db0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5dc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5dd0: 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64  lt( interp, "bad
5de0: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20   option \"", .  
5df0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
5e00: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
5e10: 76 5b 30 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75  v[0],0), "\": mu
5e20: 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73  st be flush or s
5e30: 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ize", 0);.      
5e40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
5e60: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
5e70: 20 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a   $db changes.  *
5e80: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
5e90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
5ea0: 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66   that were modif
5eb0: 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f  ied, inserted, o
5ec0: 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a  r deleted by.  *
5ed0: 2a 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  * the most recen
5ee0: 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  t INSERT, UPDATE
5ef0: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
5f00: 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64  ment, not includ
5f10: 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68  ing .  ** any ch
5f20: 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 72  anges made by tr
5f30: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a  igger programs..
5f40: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
5f50: 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63  HANGES: {.    Tc
5f60: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
5f70: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
5f80: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
5f90: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
5fa0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
5fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
5fc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
5fd0: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
5fe0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
5ff0: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
6000: 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
6010: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
6020: 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  (pDb->db));.    
6030: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6040: 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20      $db close.  
6050: 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e  **.  ** Shutdown
6060: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
6070: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f  */.  case DB_CLO
6080: 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65  SE: {.    Tcl_De
6090: 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  leteCommand(inte
60a0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
60b0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
60c0: 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  , 0));.    break
60d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
60e0: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
60f0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
6100: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
6110: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75  iven callback ju
6120: 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  st before commit
6130: 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74  ting every SQL t
6140: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
6150: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
6160: 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
6170: 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20  tion or returns 
6180: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
6190: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
61a0: 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20  ion is aborted. 
61b0: 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20   If CALLBACK is 
61c0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
61d0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20   the callback.  
61e0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a  ** is disabled..
61f0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
6200: 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  OMMIT_HOOK: {.  
6210: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
6220: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6230: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
6240: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
6250: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
6260: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6270: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
6280: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
6290: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
62a0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
62b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
62c0: 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  p, pDb->zCommit,
62d0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
62e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
62f0: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20  ar *zCommit;.   
6300: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
6310: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
6320: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
6330: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d  l_Free(pDb->zCom
6340: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
6350: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63      zCommit = Tc
6360: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
6370: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
6380: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  );.      if( zCo
6390: 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b  mmit && len>0 ){
63a0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
63b0: 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ommit = Tcl_Allo
63c0: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
63d0: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
63e0: 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d  ->zCommit, zComm
63f0: 69 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  it);.      }else
6400: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
6410: 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  Commit = 0;.    
6420: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
6430: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  b->zCommit ){.  
6440: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
6450: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
6460: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
6470: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
6480: 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72   DbCommitHandler
6490: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
64a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
64b0: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
64c0: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
64d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
64e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
64f0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
6500: 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43   collate NAME SC
6510: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
6520: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
6530: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
6540: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
6550: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
6560: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
6570: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
6580: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
6590: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
65a0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
65b0: 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53 71  OLLATE: {.    Sq
65c0: 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61  lCollate *pColla
65d0: 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  te;.    char *zN
65e0: 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ame;.    char *z
65f0: 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20  Script;.    int 
6600: 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28  nScript;.    if(
6610: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
6620: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6630: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
6640: 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54  jv, "NAME SCRIPT
6650: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6660: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6670: 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
6680: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
6690: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
66a0: 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63      zScript = Tc
66b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
66c0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63  bj(objv[3], &nSc
66d0: 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ript);.    pColl
66e0: 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74  ate = (SqlCollat
66f0: 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  e*)Tcl_Alloc( si
6700: 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20  zeof(*pCollate) 
6710: 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20 29 3b  + nScript + 1 );
6720: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 61 74  .    if( pCollat
6730: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  e==0 ) return TC
6740: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f  L_ERROR;.    pCo
6750: 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20  llate->interp = 
6760: 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c  interp;.    pCol
6770: 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44  late->pNext = pD
6780: 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  b->pCollate;.   
6790: 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69   pCollate->zScri
67a0: 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  pt = (char*)&pCo
67b0: 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44  llate[1];.    pD
67c0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43  b->pCollate = pC
67d0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 73 74 72 63  ollate;.    strc
67e0: 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63  py(pCollate->zSc
67f0: 72 69 70 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a  ript, zScript);.
6800: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
6810: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
6820: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
6830: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
6840: 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
6850: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
6860: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
6870: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
6880: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
6890: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
68a0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
68b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
68c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
68d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
68e0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
68f0: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
6900: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
6910: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
6920: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
6930: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
6940: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
6950: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
6960: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
6970: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
6980: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
6990: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
69a0: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
69b0: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
69c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
69d0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
69e0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
69f0: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
6a00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6a10: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
6a20: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
6a30: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
6a40: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
6a50: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
6a60: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
6a70: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
6a80: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
6a90: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
6aa0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
6ab0: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
6ac0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
6ad0: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
6ae0: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
6af0: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
6b00: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
6b10: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
6b20: 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51   $db complete SQ
6b30: 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  L.  **.  ** Retu
6b40: 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20 69  rn TRUE if SQL i
6b50: 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  s a complete SQL
6b60: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
6b70: 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a  urn FALSE if.  *
6b80: 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e  * additional lin
6b90: 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20  es of input are 
6ba0: 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 69 73  needed.  This is
6bb0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a   similar to the.
6bc0: 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69    ** built-in "i
6bd0: 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f  nfo complete" co
6be0: 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20  mmand of Tcl..  
6bf0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d  */.  case DB_COM
6c00: 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66  PLETE: {.#ifndef
6c10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
6c20: 50 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62  PLETE.    Tcl_Ob
6c30: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
6c40: 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a  int isComplete;.
6c50: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
6c60: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
6c70: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6c80: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22  , 2, objv, "SQL"
6c90: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6ca0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6cb0: 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20  .    isComplete 
6cc0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  = sqlite3_comple
6cd0: 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  te( Tcl_GetStrin
6ce0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
6cf0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73  , 0) );.    pRes
6d00: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
6d10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
6d20: 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65      Tcl_SetBoole
6d30: 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69  anObj(pResult, i
6d40: 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64  sComplete);.#end
6d50: 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
6d60: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
6d70: 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20  $db errorcode.  
6d80: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
6d90: 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72  he numeric error
6da0: 20 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72   code that was r
6db0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d  eturned by the m
6dc0: 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20  ost recent.  ** 
6dd0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
6de0: 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63  exec()..  */.  c
6df0: 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45  ase DB_ERRORCODE
6e00: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  : {.    Tcl_SetO
6e10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
6e20: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
6e30: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
6e40: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62  Db->db)));.    b
6e50: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  reak;.  }.   .  
6e60: 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
6e70: 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 3f  val $sql ?array?
6e80: 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20   ?{  ...code... 
6e90: 7d 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f  }?.  **    $db o
6ea0: 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20  necolumn $sql.  
6eb0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 20  **.  ** The SQL 
6ec0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73 71  statement in $sq
6ed0: 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 20  l is evaluated. 
6ee0: 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 74   For each row, t
6ef0: 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20  he values are.  
6f00: 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c 65  ** placed in ele
6f10: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72  ments of the arr
6f20: 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79 22  ay named "array"
6f30: 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20   and ...code... 
6f40: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
6f50: 2a 20 49 66 20 22 61 72 72 61 79 22 20 61 6e 64  * If "array" and
6f60: 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69 74   "code" are omit
6f70: 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c  ted, then no cal
6f80: 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79 20 69  lback is every i
6f90: 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20  nvoked..  ** If 
6fa0: 22 61 72 72 61 79 22 20 69 73 20 61 6e 20 65 6d  "array" is an em
6fb0: 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e  pty string, then
6fc0: 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
6fd0: 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61 62  placed in variab
6fe0: 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68 61  les.  ** that ha
6ff0: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  ve the same name
7000: 20 61 73 20 74 68 65 20 66 69 65 6c 64 73 20 65   as the fields e
7010: 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65 20  xtracted by the 
7020: 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
7030: 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d   The onecolumn m
7040: 65 74 68 6f 64 20 69 73 20 74 68 65 20 65 71 75  ethod is the equ
7050: 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a  ivalent of:.  **
7060: 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62       lindex [$db
7070: 20 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20   eval $sql] 0.  
7080: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45  */.  case DB_ONE
7090: 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61 73 65 20 44  COLUMN:.  case D
70a0: 42 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20 63 68  B_EVAL: {.    ch
70b0: 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b 20  ar const *zSql; 
70c0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53 51 4c       /* Next SQL
70d0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   statement to ex
70e0: 65 63 75 74 65 20 2a 2f 0a 20 20 20 20 63 68 61  ecute */.    cha
70f0: 72 20 63 6f 6e 73 74 20 2a 7a 4c 65 66 74 3b 20  r const *zLeft; 
7100: 20 20 20 20 2f 2a 20 57 68 61 74 20 69 73 20 6c      /* What is l
7110: 65 66 74 20 61 66 74 65 72 20 66 69 72 73 74 20  eft after first 
7120: 73 74 6d 74 20 69 6e 20 7a 53 71 6c 20 2a 2f 0a  stmt in zSql */.
7130: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
7140: 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 6f   *pStmt;   /* Co
7150: 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74 6d  mpiled SQL statm
7160: 65 6e 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  ent */.    Tcl_O
7170: 62 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20  bj *pArray;     
7180: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72    /* Name of arr
7190: 61 79 20 69 6e 74 6f 20 77 68 69 63 68 20 72 65  ay into which re
71a0: 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65  sults are writte
71b0: 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  n */.    Tcl_Obj
71c0: 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20 20   *pScript;      
71d0: 2f 2a 20 53 63 72 69 70 74 20 74 6f 20 72 75 6e  /* Script to run
71e0: 20 66 6f 72 20 65 61 63 68 20 72 65 73 75 6c 74   for each result
71f0: 20 73 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   set */.    Tcl_
7200: 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20  Obj **apParm;   
7210: 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73     /* Parameters
7220: 20 74 68 61 74 20 6e 65 65 64 20 61 20 54 63 6c   that need a Tcl
7230: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 29 20  _DecrRefCount() 
7240: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 6d  */.    int nParm
7250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7260: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
7270: 65 73 20 75 73 65 64 20 69 6e 20 61 70 50 61 72  es used in apPar
7280: 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  m[] */.    Tcl_O
7290: 62 6a 20 2a 61 50 61 72 6d 5b 31 30 5d 3b 20 20  bj *aParm[10];  
72a0: 20 20 2f 2a 20 53 74 61 74 69 63 20 73 70 61 63    /* Static spac
72b0: 65 20 66 6f 72 20 61 70 50 61 72 6d 5b 5d 20 69  e for apParm[] i
72c0: 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
72d0: 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  e */.    Tcl_Obj
72e0: 20 2a 70 52 65 74 3b 20 20 20 20 20 20 20 20 20   *pRet;         
72f0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20 72  /* Value to be r
7300: 65 74 75 72 6e 65 64 20 2a 2f 0a 20 20 20 20 53  eturned */.    S
7310: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
7320: 70 50 72 65 53 74 6d 74 3b 20 20 2f 2a 20 50 6f  pPreStmt;  /* Po
7330: 69 6e 74 65 72 20 74 6f 20 61 20 70 72 65 70 61  inter to a prepa
7340: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
7350: 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
7360: 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
7370: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20  B_ONECOLUMN ){. 
7380: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
7390: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
73a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
73b0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
73c0: 51 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  QL");.        re
73d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
73e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
73f0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  et = 0;.    }els
7400: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  e{.      if( obj
7410: 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b  c<3 || objc>5 ){
7420: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
7430: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
7440: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20  , 2, objv, "SQL 
7450: 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43  ?ARRAY-NAME? ?SC
7460: 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20  RIPT?");.       
7470: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7480: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
7490: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
74a0: 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  bj();.      Tcl_
74b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
74c0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
74d0: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
74e0: 20 20 20 70 41 72 72 61 79 20 3d 20 70 53 63 72     pArray = pScr
74f0: 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ipt = 0;.    }el
7500: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
7510: 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d  {.      pArray =
7520: 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70   0;.      pScrip
7530: 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  t = objv[3];.   
7540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41   }else{.      pA
7550: 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  rray = objv[3];.
7560: 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
7570: 74 53 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b  tString(pArray)[
7580: 30 5d 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d  0]==0 ) pArray =
7590: 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70   0;.      pScrip
75a0: 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20  t = objv[4];.   
75b0: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   }..    Tcl_Incr
75c0: 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d  RefCount(objv[2]
75d0: 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63  );.    zSql = Tc
75e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
75f0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
7600: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54      while( rc==T
7610: 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d  CL_OK && zSql[0]
7620: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
7650: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  nter */.      in
7660: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7680: 65 72 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d  er of bind param
7690: 65 74 65 72 73 20 69 6e 20 74 68 65 20 70 53 74  eters in the pSt
76a0: 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
76b0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
76c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
76d0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
76e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
76f0: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
7700: 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20  *apColName = 0; 
7710: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f    /* Array of co
7720: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
7730: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20      int len;    
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7750: 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  * String length 
7760: 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20  of zSql */.  .  
7770: 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69      /* Try to fi
7780: 6e 64 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65  nd a SQL stateme
7790: 6e 74 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  nt that has alre
77a0: 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  ady been compile
77b0: 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77  d and.      ** w
77c0: 68 69 63 68 20 6d 61 74 63 68 65 73 20 74 68 65  hich matches the
77d0: 20 6e 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f   next sequence o
77e0: 66 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a  f SQL..      */.
77f0: 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b        pStmt = 0;
7800: 0a 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20  .      pPreStmt 
7810: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
7820: 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  .      len = str
7830: 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  len(zSql);.     
7840: 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 26 26   if( pPreStmt &&
7850: 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64   sqlite3_expired
7860: 28 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  (pPreStmt->pStmt
7870: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 75  ) ){.        flu
7880: 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29  shStmtCache(pDb)
7890: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74  ;.        pPreSt
78a0: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
78b0: 20 20 20 20 20 20 66 6f 72 28 3b 20 70 50 72 65        for(; pPre
78c0: 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70  Stmt; pPreStmt=p
78d0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b  PreStmt->pNext){
78e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
78f0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b   pPreStmt->nSql;
7900: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
7910: 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=n .           
7920: 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53   && memcmp(pPreS
7930: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
7940: 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   n)==0.         
7950: 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d     && (zSql[n]==
7960: 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d  0 || zSql[n-1]==
7970: 27 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ';').        ){.
7980: 20 20 20 20 20 20 20 20 20 20 70 53 74 6d 74 20            pStmt 
7990: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  = pPreStmt->pStm
79a0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65  t;.          zLe
79b0: 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53  ft = &zSql[pPreS
79c0: 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20  tmt->nSql];..   
79d0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61         /* When a
79e0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
79f0: 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e  ent is found, un
7a00: 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65  link it from the
7a10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
7a20: 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69  che list.  It wi
7a30: 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65  ll later be adde
7a40: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  d back to the be
7a50: 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20  ginning.        
7a60: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68    ** of the cach
7a70: 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20  e list in order 
7a80: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55  to implement LRU
7a90: 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20   replacement..  
7aa0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7ab0: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
7ac0: 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  t->pPrev ){.    
7ad0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
7ae0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
7af0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
7b00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7b10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
7b20: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70  Db->stmtList = p
7b30: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
7b40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7b50: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
7b60: 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  mt->pNext ){.   
7b70: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
7b80: 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  t->pNext->pPrev 
7b90: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  = pPreStmt->pPre
7ba0: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  v;.          }el
7bb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7bc0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
7bd0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b  pPreStmt->pPrev;
7be0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7bf0: 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d         pDb->nStm
7c00: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  t--;.          b
7c10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7c20: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
7c30: 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72   /* If no prepar
7c40: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  ed statement was
7c50: 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65   found.  Compile
7c60: 20 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20   the SQL text.  
7c70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
7c80: 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   pStmt==0 ){.   
7c90: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
7ca0: 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70  OK!=sqlite3_prep
7cb0: 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71  are(pDb->db, zSq
7cc0: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26  l, -1, &pStmt, &
7cd0: 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  zLeft) ){.      
7ce0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
7cf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54  sult(interp, dbT
7d00: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
7d10: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
7d20: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
7d30: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
7d40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7d50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d60: 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b   if( pStmt==0 ){
7d70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53  .          if( S
7d80: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
7d90: 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
7da0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
7db0: 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74    /* A compile-t
7dc0: 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65  ime error in the
7dd0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
7de0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7df0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
7e00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
7e10: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
7e20: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
7e30: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b)));.          
7e40: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
7e50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
7e60: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
7e70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7e80: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65    /* The stateme
7e90: 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20  nt was a no-op. 
7ea0: 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65   Continue to the
7eb0: 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a   next statement.
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
7ed0: 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  n the SQL string
7ee0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
7ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 71  .            zSq
7f00: 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 20  l = zLeft;.     
7f10: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7f20: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
7f40: 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d  ssert( pPreStmt=
7f50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
7f60: 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c       /* Bind val
7f70: 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72  ues to parameter
7f80: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
7f90: 68 20 24 20 6f 72 20 3a 0a 20 20 20 20 20 20 2a  h $ or :.      *
7fa0: 2f 20 20 0a 20 20 20 20 20 20 6e 56 61 72 20 3d  /  .      nVar =
7fb0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
7fc0: 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
7fd0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50 61 72  tmt);.      nPar
7fe0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  m = 0;.      if(
7ff0: 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61 50 61   nVar>sizeof(aPa
8000: 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61 72 6d  rm)/sizeof(aParm
8010: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
8020: 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62  apParm = (Tcl_Ob
8030: 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56  j**)Tcl_Alloc(nV
8040: 61 72 2a 73 69 7a 65 6f 66 28 61 70 50 61 72 6d  ar*sizeof(apParm
8050: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [0]));.      }el
8060: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61  se{.        apPa
8070: 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20 20  rm = aParm;.    
8080: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
8090: 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29  1; i<=nVar; i++)
80a0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
80b0: 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c  char *zVar = sql
80c0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
80d0: 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  ter_name(pStmt, 
80e0: 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
80f0: 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72  zVar!=0 && (zVar
8100: 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72  [0]=='$' || zVar
8110: 5b 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20 20 20  [0]==':') ){.   
8120: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
8130: 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61  pVar = Tcl_GetVa
8140: 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56  r2Ex(interp, &zV
8150: 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20  ar[1], 0, 0);.  
8160: 20 20 20 20 20 20 20 20 69 66 28 20 70 56 61 72          if( pVar
8170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8180: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  int n;.         
8190: 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20     u8 *data;.   
81a0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
81b0: 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70  Type = pVar->typ
81c0: 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70  ePtr ? pVar->typ
81d0: 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b  ePtr->name : "";
81e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
81f0: 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a  r c = zType[0];.
8200: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8210: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
8220: 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61  (zType,"bytearra
8230: 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e  y")==0 && pVar->
8240: 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  bytes==0 ){.    
8250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c            /* Onl
8260: 79 20 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79  y load a BLOB ty
8270: 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61  pe if the Tcl va
8280: 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65  riable is a byte
8290: 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20  array and.      
82a0: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e          ** has n
82b0: 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  o string represe
82c0: 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ntation. */.    
82d0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d            data =
82e0: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
82f0: 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  yFromObj(pVar, &
8300: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
8310: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
8320: 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61  lob(pStmt, i, da
8330: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54  ta, n, SQLITE_ST
8340: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
8350: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
8360: 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20  Count(pVar);.   
8370: 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61 72             apPar
8380: 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61  m[nParm++] = pVa
8390: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  r;.            }
83a0: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62 27  else if( (c=='b'
83b0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
83c0: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29 20  ,"boolean")==0) 
83d0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
83e0: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
83f0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
8400: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
8410: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
8420: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
8430: 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  p, pVar, &n);.  
8440: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
8450: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
8460: 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20  mt, i, n);.     
8470: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8480: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
8490: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
84a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
84b0: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a        double r;.
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
84d0: 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
84e0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
84f0: 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &r);.          
8500: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
8510: 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
8520: 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , r);.          
8530: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
8540: 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  w' && strcmp(zTy
8550: 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30  pe,"wideInt")==0
8560: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8570: 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b    Tcl_WideInt v;
8580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
8590: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
85a0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
85b0: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
85c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
85d0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
85e0: 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20 20  i, v);.         
85f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8600: 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54          data = T
8610: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8620: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8640: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
8650: 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e  Stmt, i, data, n
8660: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
8670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8680: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
8690: 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20  (pVar);.        
86a0: 20 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61        apParm[nPa
86b0: 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20  rm++] = pVar;.  
86c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
86d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
86e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
86f0: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d  _bind_null( pStm
8700: 74 2c 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20  t, i );.        
8710: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8720: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
8730: 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e  Compute column n
8740: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43  ames */.      nC
8750: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
8760: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
8770: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72  ;.      if( pScr
8780: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ipt ){.        a
8790: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f  pColName = (Tcl_
87a0: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
87b0: 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a   sizeof(Tcl_Obj*
87c0: 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  )*nCol );.      
87d0: 20 20 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d    if( apColName=
87e0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
87f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
8800: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
8810: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
8820: 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  ] = dbTextToObj(
8830: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
8840: 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
8850: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
8860: 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e  rRefCount(apColN
8870: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ame[i]);.       
8880: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
8890: 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20    /* If results 
88a0: 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  are being stored
88b0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72   in an array var
88c0: 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61  iable, then crea
88d0: 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
88e0: 61 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66  array(*) entry f
88f0: 6f 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20  or that array.  
8900: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
8910: 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20   pArray ){.     
8920: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c     Tcl_Obj *pCol
8930: 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  List = Tcl_NewOb
8940: 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  j();.        Tcl
8950: 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63  _Obj *pStar = Tc
8960: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
8970: 2a 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  *", -1);.       
8980: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
8990: 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20  t(pColList);.   
89a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
89b0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
89c0: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
89d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
89e0: 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c  nterp, pColList,
89f0: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a   apColName[i]);.
8a00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a10: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
8a20: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
8a30: 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74   pStar, pColList
8a40: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  ,0);.        Tcl
8a50: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
8a60: 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  olList);.       
8a70: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
8a80: 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20  t(pStar);.      
8a90: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63  }..      /* Exec
8aa0: 75 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20  ute the SQL.    
8ab0: 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
8ac0: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20  ( rc==TCL_OK && 
8ad0: 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f  pStmt && SQLITE_
8ae0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
8af0: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
8b00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
8b10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
8b20: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
8b30: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20  al;.          . 
8b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
8b50: 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pVal to contain 
8b60: 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20  the i'th column 
8b70: 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a  of this row. */.
8b80: 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
8b90: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
8ba0: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20  _type(pStmt, i) 
8bb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
8bc0: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
8bd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
8be0: 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c   int bytes = sql
8bf0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
8c00: 73 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  s(pStmt, i);.   
8c10: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
8c20: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
8c30: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ayObj(sqlite3_co
8c40: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
8c50: 20 69 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20   i), bytes);.   
8c60: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8c70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
8c90: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
8ca0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
8cb0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20   sqlite_int64 v 
8cc0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
8cd0: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29  _int64(pStmt, i)
8ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8cf0: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
8d00: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
8d10: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
8d20: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
8d30: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a  l_NewIntObj(v);.
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
8d50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
8d60: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
8d70: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
8d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8d90: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
8da0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
8db0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8dc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
8dd0: 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  AT: {.          
8de0: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
8df0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
8e00: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  uble(pStmt, i);.
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
8e20: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
8e30: 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20  leObj(r);.      
8e40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8e50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8e60: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
8e70: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
8e80: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
8e90: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44  = dbTextToObj(pD
8ea0: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
8eb0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8ed0: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
8ee0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t: {.           
8ef0: 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74     pVal = dbText
8f00: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ToObj(sqlite3_co
8f10: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
8f20: 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   i));.          
8f30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8f40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8f50: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
8f60: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
8f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8f80: 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20   pArray==0 ){.  
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
8fa0: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
8fb0: 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  p, apColName[i],
8fc0: 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20   0, pVal, 0);.  
8fd0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
8fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
8ff0: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
9000: 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70  terp, pArray, ap
9010: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c  ColName[i], pVal
9020: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
9030: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
9040: 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d  lse if( choice==
9050: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a  DB_ONECOLUMN ){.
9060: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9070: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pRet==0 ){.     
9080: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
9090: 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pVal;.          
90a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
90b0: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
90c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
90d0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42        rc = TCL_B
90e0: 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  REAK;.          
90f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9100: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
9110: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
9120: 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c 29 3b  rp, pRet, pVal);
9130: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9140: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
9150: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
9160: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
9170: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
9180: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
9190: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
91a0: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
91b0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
91c0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
91d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
91e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
91f0: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
9200: 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  EAK ){.        r
9210: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
9220: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72    }..      /* Fr
9230: 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ee the column na
9240: 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  me objects */.  
9250: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
9260: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
9270: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
9280: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
9290: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43  DecrRefCount(apC
92a0: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
92b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63      }.        Tc
92c0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70  l_Free((char*)ap
92d0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
92e0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  }..      /* Free
92f0: 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e   the bound strin
9300: 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d  g and blob param
9310: 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 66  eters */.      f
9320: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b  or(i=0; i<nParm;
9330: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54   i++){.        T
9340: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
9350: 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20  apParm[i]);.    
9360: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70    }.      if( ap
9370: 50 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20  Parm!=aParm ){. 
9380: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
9390: 28 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a  (char*)apParm);.
93a0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
93b0: 2a 20 52 65 73 65 74 20 74 68 65 20 73 74 61 74  * Reset the stat
93c0: 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72  ement.  If the r
93d0: 65 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53 51  esult code is SQ
93e0: 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68 65  LITE_SCHEMA, the
93f0: 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68  n.      ** flush
9400: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
9410: 61 63 68 65 20 61 6e 64 20 74 72 79 20 74 68 65  ache and try the
9420: 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e   statement again
9430: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9440: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
9450: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
9460: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 53 43     if( SQLITE_SC
9470: 48 45 4d 41 3d 3d 72 63 32 20 29 7b 0a 20 20 20  HEMA==rc2 ){.   
9480: 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 61 20       /* After a 
9490: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 66  schema change, f
94a0: 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 20 61  lush the cache a
94b0: 6e 64 20 74 72 79 20 74 6f 20 72 75 6e 20 74 68  nd try to run th
94c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61  e.        ** sta
94d0: 74 65 6d 65 6e 74 20 61 67 61 69 6e 0a 20 20 20  tement again.   
94e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
94f0: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
9500: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 73  pDb );.        s
9510: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
9520: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
9530: 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54  if( pPreStmt ) T
9540: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
9550: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
9560: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9570: 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49    }else if( SQLI
9580: 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20  TE_OK!=rc2 ){.  
9590: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75        /* If a ru
95a0: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63  n-time error occ
95b0: 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20  urs, report the 
95c0: 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72  error and stop r
95d0: 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  eading.        *
95e0: 2a 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20  * the SQL.      
95f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c    */.        Tcl
9600: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
9610: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
9620: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
9630: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
9640: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
9650: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
9660: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
9670: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
9680: 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c  ( pPreStmt ) Tcl
9690: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72  _Free((char*)pPr
96a0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  eStmt);.        
96b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
96c0: 73 65 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53  se if( pDb->maxS
96d0: 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt<=0 ){.      
96e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
96f0: 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c  e is turned off,
9700: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65   deallocated the
9710: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
9720: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
9730: 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63  mt ) Tcl_Free((c
9740: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  har*)pPreStmt);.
9750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9760: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
9770: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9780: 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68        /* Everyth
9790: 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74  ing worked and t
97a0: 68 65 20 63 61 63 68 65 20 69 73 20 6f 70 65 72  he cache is oper
97b0: 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20  ational..       
97c0: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
97d0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
97e0: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 77 65   structure if we
97f0: 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20   need one..     
9800: 20 20 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72     ** (If we alr
9810: 65 61 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65  eady have one we
9820: 20 63 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20   can just reuse 
9830: 69 74 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a  it.).        */.
9840: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
9850: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
9860: 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74       len = zLeft
9870: 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20   - zSql;.       
9880: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
9890: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
98a0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
98b0: 66 28 2a 70 50 72 65 53 74 6d 74 29 20 2b 20 6c  f(*pPreStmt) + l
98c0: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  en );.          
98d0: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
98e0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
98f0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OR;.          pP
9900: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20  reStmt->pStmt = 
9910: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20  pStmt;.         
9920: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20   pPreStmt->nSql 
9930: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  = len;.         
9940: 20 6d 65 6d 63 70 79 28 70 50 72 65 53 74 6d 74   memcpy(pPreStmt
9950: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65  ->zSql, zSql, le
9960: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  n);.          pP
9970: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65 6e  reStmt->zSql[len
9980: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 0;.        }
9990: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ..        /* Add
99a0: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
99b0: 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62  atement to the b
99c0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
99d0: 63 61 63 68 65 20 6c 69 73 74 0a 20 20 20 20 20  cache list.     
99e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50     */.        pP
99f0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20  reStmt->pNext = 
9a00: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
9a10: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
9a20: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
9a30: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
9a40: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tList ){.       
9a50: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d    pDb->stmtList-
9a60: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
9a70: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
9a80: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
9a90: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
9aa0: 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e         if( pDb->
9ab0: 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  stmtLast==0 ){. 
9ac0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
9ad0: 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29   pDb->nStmt==0 )
9ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
9af0: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
9b00: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Stmt;.        }e
9b10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
9b20: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
9b30: 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  t>0 );.        }
9b40: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53  .        pDb->nS
9b50: 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20  tmt++;.   .     
9b60: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
9b70: 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d   too many statem
9b80: 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65  ent in cache, re
9b90: 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73  move the surplus
9ba0: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
9bb0: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
9bc0: 63 61 63 68 65 20 6c 69 73 74 2e 0a 20 20 20 20  cache list..    
9bd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77      */.        w
9be0: 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74  hile( pDb->nStmt
9bf0: 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b  >pDb->maxStmt ){
9c00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9c10: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d  e3_finalize(pDb-
9c20: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74  >stmtLast->pStmt
9c30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
9c40: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62  ->stmtLast = pDb
9c50: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65  ->stmtLast->pPre
9c60: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
9c70: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62  _Free((char*)pDb
9c80: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78  ->stmtLast->pNex
9c90: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  t);.          pD
9ca0: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65  b->stmtLast->pNe
9cb0: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
9cc0: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
9cd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ce0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63  }..      /* Proc
9cf0: 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  eed to the next 
9d00: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
9d10: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
9d20: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
9d30: 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ecrRefCount(objv
9d40: 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  [2]);..    if( p
9d50: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Ret ){.      if(
9d60: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
9d70: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
9d80: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
9d90: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pRet);.      }. 
9da0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
9db0: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
9dc0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
9dd0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
9de0: 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41   $db function NA
9df0: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
9e00: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
9e10: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61   SQL function ca
9e20: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
9e30: 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69  ever that functi
9e40: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65  on is.  ** calle
9e50: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
9e60: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
9e70: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
9e80: 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49    case DB_FUNCTI
9e90: 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e  ON: {.    SqlFun
9ea0: 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63  c *pFunc;.    Tc
9eb0: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
9ec0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
9ed0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  .    if( objc!=4
9ee0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
9ef0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9f00: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
9f10: 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  E SCRIPT");.    
9f20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9f30: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  OR;.    }.    zN
9f40: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
9f50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
9f60: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 53 63 72  2], 0);.    pScr
9f70: 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ipt = objv[3];. 
9f80: 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53     pFunc = findS
9f90: 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d  qlFunc(pDb, zNam
9fa0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  e);.    if( pFun
9fb0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  c==0 ) return TC
9fc0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28  L_ERROR;.    if(
9fd0: 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
9fe0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
9ff0: 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d  rRefCount(pFunc-
a000: 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  >pScript);.    }
a010: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72  .    pFunc->pScr
a020: 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20  ipt = pScript;. 
a030: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
a040: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
a050: 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c    pFunc->useEval
a060: 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65  Objv = safeToUse
a070: 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c  EvalObjv(interp,
a080: 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72   pScript);.    r
a090: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
a0a0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d  te_function(pDb-
a0b0: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  >db, zName, -1, 
a0c0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
a0d0: 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53       pFunc, tclS
a0e0: 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
a0f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a100: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
a110: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
a120: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
a130: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
a140: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
a150: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
a160: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65  OLATILE);.    }e
a170: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75  lse{.      /* Mu
a180: 73 74 20 66 6c 75 73 68 20 61 6e 79 20 63 61 63  st flush any cac
a190: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  hed statements *
a1a0: 2f 0a 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d  /.      flushStm
a1b0: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
a1c0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
a1d0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
a1e0: 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65     $db last_inse
a1f0: 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20  rt_rowid .  **. 
a200: 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e   ** Return an in
a210: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
a220: 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65  he ROWID for the
a230: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
a240: 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ert..  */.  case
a250: 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f   DB_LAST_INSERT_
a260: 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c  ROWID: {.    Tcl
a270: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
a280: 20 20 20 69 6e 74 20 72 6f 77 69 64 3b 0a 20 20     int rowid;.  
a290: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
a2a0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
a2b0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a2c0: 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
a2d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a2e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a2f0: 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
a300: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
a310: 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  d(pDb->db);.    
a320: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
a330: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
a340: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
a350: 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72  ntObj(pResult, r
a360: 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  owid);.    break
a370: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
a380: 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d   The DB_ONECOLUM
a390: 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c  N method is impl
a3a0: 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72  emented together
a3b0: 20 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20   with DB_EVAL.. 
a3c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   */..  /*    $db
a3d0: 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c   progress ?N CAL
a3e0: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a  LBACK?.  ** .  *
a3f0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
a400: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72  en callback ever
a410: 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68  y N virtual mach
a420: 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c  ine opcodes whil
a430: 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a  e executing.  **
a440: 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
a450: 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53   case DB_PROGRES
a460: 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  S: {.    if( obj
a470: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
a480: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
a490: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
a4a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a4b0: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
a4c0: 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ess, 0);.      }
a4d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
a4e0: 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
a4f0: 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b  char *zProgress;
a500: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
a510: 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20        int N;.   
a520: 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
a530: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
a540: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
a550: 2c 20 26 4e 29 20 29 7b 0a 09 72 65 74 75 72 6e  , &N) ){..return
a560: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a570: 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70    };.      if( p
a580: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
a590: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
a5a0: 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  e(pDb->zProgress
a5b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a5c0: 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c   zProgress = Tcl
a5d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a5e0: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29  j(objv[3], &len)
a5f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f  ;.      if( zPro
a600: 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29  gress && len>0 )
a610: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
a620: 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41  Progress = Tcl_A
a630: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
a640: 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
a650: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20  pDb->zProgress, 
a660: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20  zProgress);.    
a670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a680: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
a690: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
a6a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a6b0: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
a6c0: 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CK.      if( pDb
a6d0: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->zProgress ){. 
a6e0: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
a6f0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
a700: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
a710: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
a720: 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67  b->db, N, DbProg
a730: 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62  ressHandler, pDb
a740: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a760: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
a770: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  (pDb->db, 0, 0, 
a780: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
a790: 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
a7a0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
a7b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
a7c0: 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43  objv, "N CALLBAC
a7d0: 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
a7e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a7f0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
a800: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
a810: 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20   $db rekey KEY. 
a820: 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20   **.  ** Change 
a830: 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b  the encryption k
a840: 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ey on the curren
a850: 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73  tly open databas
a860: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
a870: 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69  B_REKEY: {.    i
a880: 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69  nt nKey;.    voi
a890: 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28  d *pKey;.    if(
a8a0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
a8b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
a8c0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
a8d0: 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20  jv, "KEY");.    
a8e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a8f0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b  OR;.    }.    pK
a900: 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ey = Tcl_GetByte
a910: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
a920: 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69  v[2], &nKey);.#i
a930: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
a940: 43 4f 44 45 43 0a 20 20 20 20 72 63 20 3d 20 73  CODEC.    rc = s
a950: 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62  qlite3_rekey(pDb
a960: 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  ->db, pKey, nKey
a970: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
a980: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
a990: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a9a0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
a9b0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20  ), 0);.      rc 
a9c0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
a9d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
a9e0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
a9f0: 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65   **     $db time
aa00: 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53  out MILLESECONDS
aa10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79  .  **.  ** Delay
aa20: 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20   for the number 
aa30: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
aa40: 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 61  specified when a
aa50: 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e   file is locked.
aa60: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
aa70: 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69  TIMEOUT: {.    i
aa80: 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f  nt ms;.    if( o
aa90: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
aaa0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
aab0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
aac0: 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22  , "MILLISECONDS"
aad0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
aae0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
aaf0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
ab00: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
ab10: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29  p, objv[2], &ms)
ab20: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ab30: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
ab40: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44  _busy_timeout(pD
ab50: 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20  b->db, ms);.    
ab60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
ab70: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75  .  **     $db nu
ab80: 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f  llvalue ?STRING?
ab90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67  .  **.  ** Chang
aba0: 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65 6e  e text used when
abb0: 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61   a NULL comes ba
abc0: 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ck from the data
abd0: 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47  base. If ?STRING
abe0: 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72  ?.  ** is not pr
abf0: 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  esent, then the 
ac00: 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75  current string u
ac10: 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20  sed for NULL is 
ac20: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49  returned..  ** I
ac30: 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65 73  f STRING is pres
ac40: 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47  ent, then STRING
ac50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
ac60: 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  **.  */.  case D
ac70: 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20  B_NULLVALUE: {. 
ac80: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
ac90: 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
aca0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
acb0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
acc0: 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22  bjv, "NULLVALUE"
acd0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ace0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
acf0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
ad00: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   ){.      int le
ad10: 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  n;.      char *z
ad20: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
ad30: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
ad40: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
ad50: 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c    if( pDb->zNull
ad60: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
ad70: 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
ad80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ad90: 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e  if( zNull && len
ada0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
adb0: 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41  b->zNull = Tcl_A
adc0: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
add0: 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79  .        strncpy
ade0: 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75  (pDb->zNull, zNu
adf0: 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ll, len);.      
ae00: 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e    pDb->zNull[len
ae10: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
ae20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
ae30: 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20  Db->zNull = 0;. 
ae40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ae50: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
ae60: 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74  t(interp, dbText
ae70: 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c  ToObj(pDb->zNull
ae80: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
ae90: 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
aea0: 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68      $db total_ch
aeb0: 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
aec0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
aed0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
aee0: 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
aef0: 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
af00: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
af10: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
af20: 6c 65 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  le was created..
af30: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
af40: 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a  OTAL_CHANGES: {.
af50: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
af60: 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  sult;.    if( ob
af70: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
af80: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
af90: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
afa0: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
afb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
afc0: 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20    }.    pResult 
afd0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
afe0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
aff0: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
b000: 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74  esult, sqlite3_t
b010: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62  otal_changes(pDb
b020: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
b030: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
b040: 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42  $db trace ?CALLB
b050: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
b060: 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
b070: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
b080: 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
b090: 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  for each SQL sta
b0a0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74  tement.  ** that
b0b0: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
b0c0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53  he text of the S
b0d0: 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  QL is appended t
b0e0: 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72  o CALLBACK befor
b0f0: 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65  e.  ** it is exe
b100: 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  cuted..  */.  ca
b110: 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20  se DB_TRACE: {. 
b120: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
b130: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
b140: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
b150: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
b160: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
b170: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b180: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
b190: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
b1a0: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
b1b0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
b1c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b1d0: 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  p, pDb->zTrace, 
b1e0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
b1f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
b200: 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20  r *zTrace;.     
b210: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
b220: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
b230: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
b240: 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
b250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b260: 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74  zTrace = Tcl_Get
b270: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
b280: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
b290: 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26      if( zTrace &
b2a0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
b2b0: 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
b2c0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
b2d0: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
b2e0: 74 72 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63  trcpy(pDb->zTrac
b2f0: 65 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 20 20  e, zTrace);.    
b300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b310: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30   pDb->zTrace = 0
b320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b330: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
b340: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
b350: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
b360: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b370: 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20  _trace(pDb->db, 
b380: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20  DbTraceHandler, 
b390: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
b3a0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b3b0: 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62  e3_trace(pDb->db
b3c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
b3d0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
b3e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
b3f0: 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74  db copy conflict
b400: 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65  -algorithm table
b410: 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52   filename ?SEPAR
b420: 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43  ATOR? ?NULLINDIC
b430: 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ATOR?.  **.  ** 
b440: 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74  Copy data into t
b450: 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61  able from filena
b460: 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75  me, optionally u
b470: 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20  sing SEPARATOR. 
b480: 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65   ** as column se
b490: 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20  parators.  If a 
b4a0: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
b4b0: 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f  a null string, o
b4c0: 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65  r the.  ** value
b4d0: 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f   of NULLINDICATO
b4e0: 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73  R, a NULL is ins
b4f0: 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f  erted for the co
b500: 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c  lumn..  ** confl
b510: 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73  ict-algorithm is
b520: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69   one of the sqli
b530: 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  te conflict algo
b540: 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20  rithms:.  **    
b550: 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c  rollback, abort,
b560: 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72   fail, ignore, r
b570: 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73  eplace.  ** On s
b580: 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74  uccess, return t
b590: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  he number of lin
b5a0: 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f  es processed, no
b5b0: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61  t necessarily sa
b5c0: 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63  me.  ** as 'db c
b5d0: 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63  hanges' due to c
b5e0: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
b5f0: 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a  m selected..  **
b600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  .  ** This code 
b610: 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20  is basically an 
b620: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65  implementation/e
b630: 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20  nhancement of.  
b640: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73  ** the sqlite3 s
b650: 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22  hell.c ".import"
b660: 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20   command..  **. 
b670: 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64   ** This command
b680: 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61   usage is equiva
b690: 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69  lent to the sqli
b6a0: 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65  te2.x COPY state
b6b0: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68  ment,.  ** which
b6c0: 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61   imports file da
b6d0: 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ta into a table 
b6e0: 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72  using the Postgr
b6f0: 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66  eSQL COPY file f
b700: 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64  ormat:.  **   $d
b710: 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f  b copy $conflit_
b720: 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65  algo $table_name
b730: 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c   $filename \t \\
b740: 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  N.  */.  case DB
b750: 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61  _COPY: {.    cha
b760: 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20  r *zTable;      
b770: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
b780: 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  rt data into thi
b790: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  s table */.    c
b7a0: 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20  har *zFile;     
b7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b7c0: 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63  e file from whic
b7d0: 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74  h to extract dat
b7e0: 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  a */.    char *z
b7f0: 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20  Conflict;       
b800: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
b810: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74  lict algorithm t
b820: 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c  o use */.    sql
b830: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
b840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74  ;        /* A st
b850: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
b860: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
b870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b880: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20  sult code */.   
b890: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8b0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
b8c0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
b8d0: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  /.    int nByte;
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
b900: 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73  ytes in an SQL s
b910: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  tring */.    int
b920: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
b930: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b940: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20   counters */.   
b950: 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20   int nSep;      
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b970: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b980: 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20  in zSep[] */.   
b990: 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20   int nNull;     
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9b0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b9c0: 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20  in zNull[] */.  
b9d0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9f0: 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
ba00: 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  t */.    char *z
ba10: 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Line;           
ba20: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
ba30: 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66   line of input f
ba40: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  rom the file */.
ba50: 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
ba60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ba70: 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65  /* zLine[] broke
ba80: 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e  n up into column
ba90: 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  s */.    char *z
baa0: 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20  Commit;         
bab0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63       /* How to c
bac0: 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f  ommit changes */
bad0: 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  .    FILE *in;  
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69   /* The input fi
bb00: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69  le */.    int li
bb10: 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  neno = 0;       
bb20: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
bb30: 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69  mber of input fi
bb40: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a  le */.    char z
bb50: 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20  LineNum[80];    
bb60: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
bb70: 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65  mber print buffe
bb80: 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  r */.    Tcl_Obj
bb90: 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20   *pResult;      
bba0: 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72       /* interp r
bbb0: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68  esult */..    ch
bbc0: 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68  ar *zSep;.    ch
bbd0: 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69  ar *zNull;.    i
bbe0: 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a  f( objc<5 || obj
bbf0: 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>7 ){.      Tcl
bc00: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
bc10: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a  terp, 2, objv, .
bc20: 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49           "CONFLI
bc30: 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42  CT-ALGORITHM TAB
bc40: 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50  LE FILENAME ?SEP
bc50: 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44  ARATOR? ?NULLIND
bc60: 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20  ICATOR?");.     
bc70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bc80: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
bc90: 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20   objc>=6 ){.    
bca0: 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74    zSep = Tcl_Get
bcb0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
bcc0: 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[5], 0);.    }
bcd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70  else{.      zSep
bce0: 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20   = "\t";.    }. 
bcf0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29     if( objc>=7 )
bd00: 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20  {.      zNull = 
bd10: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
bd20: 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29  mObj(objv[6], 0)
bd30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bd40: 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20     zNull = "";. 
bd50: 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69     }.    zConfli
bd60: 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ct = Tcl_GetStri
bd70: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
bd80: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c  ], 0);.    zTabl
bd90: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
bda0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
bdb0: 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  , 0);.    zFile 
bdc0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
bdd0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20  romObj(objv[4], 
bde0: 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73  0);.    nSep = s
bdf0: 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20 20  trlen(zSep);.   
be00: 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 28   nNull = strlen(
be10: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  zNull);.    if( 
be20: 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
be30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
be40: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
be50: 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72  : non-null separ
be60: 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f  ator required fo
be70: 72 20 63 6f 70 79 22 2c 20 30 29 3b 0a 20 20 20  r copy", 0);.   
be80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
be90: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
bea0: 66 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  f(sqlite3StrICmp
beb0: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c  (zConflict, "rol
bec0: 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a  lback") != 0 &&.
bed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
bee0: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
bef0: 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20   "abort"   ) != 
bf00: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
bf10: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
bf20: 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20  lict, "fail"    
bf30: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
bf40: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
bf50: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f  zConflict, "igno
bf60: 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20  re"  ) != 0 &&. 
bf70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
bf80: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
bf90: 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30  "replace" ) != 0
bfa0: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
bfb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
bfc0: 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c  rp, "Error: \"",
bfd0: 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20   zConflict, .   
bfe0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
bff0: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
c000: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
c010: 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
c020: 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
c030: 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
c040: 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a  r replace", 0);.
c050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
c060: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
c070: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
c080: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
c090: 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
c0a0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
c0b0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
c0c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
c0d0: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
c0e0: 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  : no such table:
c0f0: 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a   ", zTable, 0);.
c100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
c110: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
c120: 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e    nByte = strlen
c130: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
c140: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
c150: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
c160: 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  0, &pStmt, 0);. 
c170: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c180: 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
c190: 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
c1a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c1b0: 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
c1c0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
c1d0: 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
c1e0: 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
c1f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f  }else{.      nCo
c200: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
c210: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
c220: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c230: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
c240: 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c  t);.    if( nCol
c250: 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65  ==0 ) {.      re
c260: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c270: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
c280: 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b   malloc( nByte +
c290: 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a   50 + nCol*2 );.
c2a0: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
c2b0: 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  ) {.      Tcl_Ap
c2c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c2d0: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74  p, "Error: can't
c2e0: 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a   malloc()", 0);.
c2f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
c300: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
c310: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
c320: 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71  tf(nByte+50, zSq
c330: 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71  l, "INSERT OR %q
c340: 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45   INTO '%q' VALUE
c350: 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  S(?",.         z
c360: 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65  Conflict, zTable
c370: 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65  );.    j = strle
c380: 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72  n(zSql);.    for
c390: 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=1; i<nCol; i+
c3a0: 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  +){.      zSql[j
c3b0: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
c3c0: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27   zSql[j++] = '?'
c3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
c3e0: 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [j++] = ')';.   
c3f0: 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zSql[j] = 0;.  
c400: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
c410: 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20  repare(pDb->db, 
c420: 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c  zSql, 0, &pStmt,
c430: 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53   0);.    free(zS
c440: 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
c450: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
c460: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c470: 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  , "Error: ", sql
c480: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
c490: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
c4a0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
c4b0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
c4c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c4d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20  .    }.    in = 
c4e0: 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62  fopen(zFile, "rb
c4f0: 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d  ");.    if( in==
c500: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
c510: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c520: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rp, "Error: cann
c530: 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c  ot open file: ",
c540: 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20   zFile, NULL);. 
c550: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
c560: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
c570: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c580: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
c590: 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20  azCol = malloc( 
c5a0: 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29  sizeof(azCol[0])
c5b0: 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20  *(nCol+1) );.   
c5c0: 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
c5d0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
c5e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
c5f0: 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d   "Error: can't m
c600: 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20  alloc()", 0);.  
c610: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c620: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
c630: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
c640: 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  ->db, "BEGIN", 0
c650: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f  , 0, 0);.    zCo
c660: 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b  mmit = "COMMIT";
c670: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69  .    while( (zLi
c680: 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69  ne = local_getli
c690: 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b  ne(0, in))!=0 ){
c6a0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  .      char *z;.
c6b0: 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20        i = 0;.   
c6c0: 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
c6d0: 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c     azCol[0] = zL
c6e0: 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ine;.      for(i
c6f0: 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b  =0, z=zLine; *z;
c700: 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   z++){.        i
c710: 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26  f( *z==zSep[0] &
c720: 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65  & strncmp(z, zSe
c730: 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20  p, nSep)==0 ){. 
c740: 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b           *z = 0;
c750: 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
c760: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
c770: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
c780: 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26      azCol[i] = &
c790: 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20  z[nSep];.       
c7a0: 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31       z += nSep-1
c7b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c7c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c7d0: 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e        if( i+1!=n
c7e0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Col ){.        c
c7f0: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
c800: 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63     zErr = malloc
c810: 28 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46  (200 + strlen(zF
c820: 69 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73  ile));.        s
c830: 70 72 69 6e 74 66 28 7a 45 72 72 2c 22 45 72 72  printf(zErr,"Err
c840: 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20  or: %s line %d: 
c850: 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
c860: 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74 20  mns of data but 
c870: 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20  found %d",.     
c880: 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e        zFile, lin
c890: 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b  eno, nCol, i+1);
c8a0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
c8b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c8c0: 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20  , zErr, 0);.    
c8d0: 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b 0a      free(zErr);.
c8e0: 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
c8f0: 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
c900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c910: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
c920: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
c930: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65  {.        /* che
c940: 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61  ck for null data
c950: 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73  , if so, bind as
c960: 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   null */.       
c970: 20 69 66 20 28 28 6e 4e 75 6c 6c 3e 30 20 26 26   if ((nNull>0 &&
c980: 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d   strcmp(azCol[i]
c990: 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20 7c 7c 20  , zNull)==0) || 
c9a0: 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29  strlen(azCol[i])
c9b0: 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ==0) {.         
c9c0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
c9d0: 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a  ll(pStmt, i+1);.
c9e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c9f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ca00: 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
ca10: 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  , i+1, azCol[i],
ca20: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
ca30: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
ca40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ca50: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
ca60: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
ca70: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
ca80: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c  );.      free(zL
ca90: 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
caa0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cab0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
cac0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
cad0: 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69  ,"Error: ", sqli
cae0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
caf0: 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  db), 0);.       
cb00: 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c   zCommit = "ROLL
cb10: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62  BACK";.        b
cb20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
cb30: 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43    }.    free(azC
cb40: 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28  ol);.    fclose(
cb50: 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  in);.    sqlite3
cb60: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
cb70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
cb80: 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d  ec(pDb->db, zCom
cb90: 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a  mit, 0, 0, 0);..
cba0: 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b      if( zCommit[
cbb0: 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20  0] == 'C' ){.   
cbc0: 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73     /* success, s
cbd0: 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d  et result as num
cbe0: 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f  ber of lines pro
cbf0: 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  cessed */.      
cc00: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
cc10: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
cc20: 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  p);.      Tcl_Se
cc30: 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
cc40: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20   lineno);.      
cc50: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
cc60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
cc70: 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64   failure, append
cc80: 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61   lineno where fa
cc90: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 70  iled */.      sp
cca0: 72 69 6e 74 66 28 7a 4c 69 6e 65 4e 75 6d 2c 22  rintf(zLineNum,"
ccb0: 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  %d",lineno);.   
ccc0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ccd0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61  ult(interp,", fa
cce0: 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65  iled while proce
ccf0: 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c  ssing line: ",zL
cd00: 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20  ineNum,0);.     
cd10: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
cd20: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
cd30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
cd40: 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  db version.  **.
cd50: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
cd60: 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
cd70: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
cd80: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
cd90: 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20  _VERSION: {.    
cda0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
cdb0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
cdc0: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
cdd0: 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  (), TCL_STATIC);
cde0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
cdf0: 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
ce00: 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65  the SWITCH state
ce10: 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ment */.  return
ce20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20   rc;.}../*.**   
ce30: 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46  sqlite3 DBNAME F
ce40: 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20 3f  ILENAME ?MODE? ?
ce50: 2d 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20  -key KEY?.**.** 
ce60: 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  This is the main
ce70: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57   Tcl command.  W
ce80: 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22  hen the "sqlite"
ce90: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a   Tcl command is.
cea0: 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73  ** invoked, this
ceb0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f   routine runs to
cec0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f   process that co
ced0: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mmand..**.** The
cee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
cef0: 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61   DBNAME, is an a
cf00: 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f  rbitrary name fo
cf10: 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62  r a new.** datab
cf20: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
cf30: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72   This command cr
cf40: 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d  eates a new comm
cf50: 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e  and named.** DBN
cf60: 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64  AME that is used
cf70: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74   to control that
cf80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
cf90: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
cfa0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65  nnection is dele
cfb0: 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e  ted when the DBN
cfc0: 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  AME command is d
cfd0: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
cfe0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
cff0: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
d000: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
d010: 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
d020: 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 62  the sqlite datab
d030: 61 73 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ase that is to b
d040: 65 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a 0a 2a  e accessed..**.*
d050: 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 70 75  * For testing pu
d060: 72 70 6f 73 65 73 2c 20 77 65 20 61 6c 73 6f 20  rposes, we also 
d070: 73 75 70 70 6f 72 74 20 74 68 65 20 66 6f 6c 6c  support the foll
d080: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73 71  owing:.**.**  sq
d090: 6c 69 74 65 33 20 2d 65 6e 63 6f 64 69 6e 67 0a  lite3 -encoding.
d0a0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75  **.**       Retu
d0b0: 72 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  rn the encoding 
d0c0: 75 73 65 64 20 62 79 20 4c 49 4b 45 20 61 6e 64  used by LIKE and
d0d0: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e   GLOB operators.
d0e0: 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20 20    Choices.**    
d0f0: 20 20 20 61 72 65 20 55 54 46 2d 38 20 61 6e 64     are UTF-8 and
d100: 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20   iso8859..**.** 
d110: 20 73 71 6c 69 74 65 33 20 2d 76 65 72 73 69 6f   sqlite3 -versio
d120: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65  n.**.**       Re
d130: 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e  turn the version
d140: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 53   number of the S
d150: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a  QLite library..*
d160: 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 74  *.**  sqlite3 -t
d170: 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a 2a 0a 2a  cl-uses-utf.**.*
d180: 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 22  *       Return "
d190: 31 22 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77  1" if compiled w
d1a0: 69 74 68 20 61 20 54 63 6c 20 75 73 65 73 20 55  ith a Tcl uses U
d1b0: 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 22 30  TF-8.  Return "0
d1c0: 22 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 6e 6f  " if.**       no
d1d0: 74 2e 20 20 55 73 65 64 20 62 79 20 74 65 73 74  t.  Used by test
d1e0: 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  s to make sure t
d1f0: 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  he library was c
d200: 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20 20 20 20  ompiled .**     
d210: 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a    correctly..*/.
d220: 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69  static int DbMai
d230: 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  n(void *cd, Tcl_
d240: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
d250: 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
d260: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
d270: 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20   SqliteDb *p;.  
d280: 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a  void *pKey = 0;.
d290: 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a    int nKey = 0;.
d2a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
d2b0: 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rg;.  char *zErr
d2c0: 4d 73 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Msg;.  const cha
d2d0: 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72  r *zFile;.  char
d2e0: 20 7a 42 75 66 5b 38 30 5d 3b 0a 20 20 69 66 28   zBuf[80];.  if(
d2f0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
d300: 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
d310: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
d320: 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [1], 0);.    if(
d330: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76   strcmp(zArg,"-v
d340: 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  ersion")==0 ){. 
d350: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
d360: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
d370: 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b  ite3_version,0);
d380: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
d390: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
d3a0: 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
d3b0: 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30  "-has-codec")==0
d3c0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
d3d0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
d3e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
d3f0: 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29  lt(interp,"1",0)
d400: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
d410: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d420: 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65  nterp,"0",0);.#e
d430: 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
d440: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
d450: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
d460: 41 72 67 2c 22 2d 74 63 6c 2d 75 73 65 73 2d 75  Arg,"-tcl-uses-u
d470: 74 66 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  tf")==0 ){.#ifde
d480: 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 0a 20 20  f TCL_UTF_MAX.  
d490: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d4a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c  sult(interp,"1",
d4b0: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  0);.#else.      
d4c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d4d0: 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a  (interp,"0",0);.
d4e0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
d4f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
d500: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  }.  }.  if( objc
d510: 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29  ==5 || objc==6 )
d520: 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
d530: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
d540: 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20  j(objv[objc-2], 
d550: 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  0);.    if( strc
d560: 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d  mp(zArg,"-key")=
d570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  =0 ){.      pKey
d580: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
d590: 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
d5a0: 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b  objc-1], &nKey);
d5b0: 0a 20 20 20 20 20 20 6f 62 6a 63 20 2d 3d 20 32  .      objc -= 2
d5c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d5d0: 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
d5e0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
d5f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
d600: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 23  erp, 1, objv, .#
d610: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
d620: 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22 48 41  _CODEC.      "HA
d630: 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NDLE FILENAME ?-
d640: 6b 65 79 20 43 4f 44 45 43 2d 4b 45 59 3f 22 0a  key CODEC-KEY?".
d650: 23 65 6c 73 65 0a 20 20 20 20 20 20 22 48 41 4e  #else.      "HAN
d660: 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f  DLE FILENAME ?MO
d670: 44 45 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20  DE?".#endif.    
d680: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
d690: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
d6a0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20  ErrMsg = 0;.  p 
d6b0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c  = (SqliteDb*)Tcl
d6c0: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
d6d0: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
d6e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
d6f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d  esult(interp, "m
d700: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54  alloc failed", T
d710: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
d720: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d730: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
d740: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
d750: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
d760: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
d770: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
d780: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69  sqlite3_open(zFi
d790: 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 69  le, &p->db);.  i
d7a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
d7b0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
d7c0: 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72  >db) ){.    zErr
d7d0: 4d 73 67 20 3d 20 73 74 72 64 75 70 28 73 71 6c  Msg = strdup(sql
d7e0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
d7f0: 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b));.    sqlite3
d800: 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
d810: 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
d820: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
d830: 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
d840: 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
d850: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64  Key, nKey);.#end
d860: 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
d870: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
d880: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
d890: 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
d8a0: 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
d8b0: 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
d8c0: 20 20 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29     free(zErrMsg)
d8d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d8e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d  _ERROR;.  }.  p-
d8f0: 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50  >maxStmt = NUM_P
d900: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
d910: 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
d920: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
d930: 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  v[1], 0);.  Tcl_
d940: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
d950: 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
d960: 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
d970: 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
d980: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72  ..  /* The retur
d990: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 76  n value is the v
d9a0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 71 6c 69  alue of the sqli
d9b0: 74 65 2a 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2f  te* pointer.  */
d9c0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
d9d0: 20 22 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20   "%p", p->db);. 
d9e0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 42 75   if( strncmp(zBu
d9f0: 66 2c 22 30 78 22 2c 32 29 20 29 7b 0a 20 20 20  f,"0x",2) ){.   
da00: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
da10: 30 78 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20  0x%p", p->db);. 
da20: 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
da30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
da40: 75 66 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  uf, 0);..  /* If
da50: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
da60: 51 4c 49 54 45 5f 54 45 53 54 20 74 75 72 6e 65  QLITE_TEST turne
da70: 64 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67 69 73  d on, then regis
da80: 74 65 72 20 74 68 65 20 22 6d 64 35 73 75 6d 22  ter the "md5sum"
da90: 0a 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  .  ** SQL functi
daa0: 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  on..  */.#ifdef 
dab0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a  SQLITE_TEST.  {.
dac0: 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
dad0: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
dae0: 69 74 65 33 2a 29 3b 0a 23 69 66 64 65 66 20 53  ite3*);.#ifdef S
daf0: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20  QLITE_MEMDEBUG. 
db00: 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 66 61 69     int mallocfai
db10: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c  l = sqlite3_iMal
db20: 6c 6f 63 46 61 69 6c 3b 0a 20 20 20 20 73 71 6c  locFail;.    sql
db30: 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
db40: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
db50: 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 70 2d   Md5_Register(p-
db60: 3e 64 62 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  >db);.#ifdef SQL
db70: 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20  ITE_MEMDEBUG.   
db80: 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
db90: 46 61 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66 61 69  Fail = mallocfai
dba0: 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 7d 0a 23  l;.#endif.   }.#
dbb0: 65 6e 64 69 66 20 20 0a 20 20 70 2d 3e 69 6e 74  endif  .  p->int
dbc0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
dbd0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
dbe0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
dbf0: 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74  a dummy Tcl_Init
dc00: 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20  Stubs if we are 
dc10: 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20  using this as a 
dc20: 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72  static.** librar
dc30: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53  y..*/.#ifndef US
dc40: 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e  E_TCL_STUBS.# un
dc50: 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75  def  Tcl_InitStu
dc60: 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f  bs.# define Tcl_
dc70: 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29  InitStubs(a,b,c)
dc80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
dc90: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
dca0: 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  odule..**.** Thi
dcb0: 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e  s Tcl module con
dcc0: 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e  tains only a sin
dcd0: 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  gle new Tcl comm
dce0: 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74  and named "sqlit
dcf0: 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68  e"..** (Hence th
dd00: 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70  ere is no namesp
dd10: 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ace.  There is n
dd20: 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67  o point in using
dd30: 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20   a namespace.** 
dd40: 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  if the extension
dd50: 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f   only supplies o
dd60: 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54  ne new name!)  T
dd70: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
dd80: 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  and is.** used t
dd90: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c  o open a new SQL
dda0: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53  ite database.  S
ddb0: 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20  ee the DbMain() 
ddc0: 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a  routine above.**
ddd0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
dde0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
ddf0: 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  int Sqlite3_Init
de00: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
de10: 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74  erp){.  Tcl_Init
de20: 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38  Stubs(interp, "8
de30: 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  .4", 0);.  Tcl_C
de40: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
de50: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
de60: 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
de70: 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
de80: 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76  );.  Tcl_PkgProv
de90: 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ide(interp, "sql
dea0: 69 74 65 33 22 2c 20 22 33 2e 30 22 29 3b 0a 20  ite3", "3.0");. 
deb0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
dec0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
ded0: 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a  qlite", (Tcl_Obj
dee0: 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
def0: 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
df00: 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
df10: 20 22 73 71 6c 69 74 65 22 2c 20 22 33 2e 30 22   "sqlite", "3.0"
df20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
df30: 4f 4b 3b 0a 7d 0a 69 6e 74 20 54 63 6c 73 71 6c  OK;.}.int Tclsql
df40: 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
df50: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
df60: 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
df70: 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e  it(interp); }.in
df80: 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e  t Sqlite3_SafeIn
df90: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
dfa0: 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
dfb0: 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c  CL_OK; }.int Tcl
dfc0: 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74  sqlite3_SafeInit
dfd0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
dfe0: 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
dff0: 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK; }..#ifndef 
e000: 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f  SQLITE_3_SUFFIX_
e010: 4f 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f  ONLY.int Sqlite_
e020: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
e030: 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
e040: 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
e050: 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c  terp); }.int Tcl
e060: 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  sqlite_Init(Tcl_
e070: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
e080: 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
e090: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
e0a0: 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49  int Sqlite_SafeI
e0b0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
e0c0: 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
e0d0: 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63  TCL_OK; }.int Tc
e0e0: 6c 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74  lsqlite_SafeInit
e0f0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
e100: 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
e110: 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK; }.#endif..#
e120: 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a  ifdef TCLSH./***
e130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
e180: 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c  e code that foll
e190: 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62  ows is used to b
e1a0: 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20  uild standalone 
e1b0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73  TCL interpreters
e1c0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .*/../*.** If th
e1d0: 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
e1e0: 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69   one, then put i
e1f0: 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20  n code this for 
e200: 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f  the.** "main" ro
e210: 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
e220: 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61  initialize Tcl a
e230: 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72  nd take input fr
e240: 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  om.** standard i
e250: 6e 70 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c  nput..*/.#if TCL
e260: 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61  SH==1.static cha
e270: 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a  r zMainloop[] =.
e280: 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
e290: 22 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f  ".  "while {![eo
e2a0: 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20  f stdin]} {\n". 
e2b0: 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c     "if {$line!=\
e2c0: 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
e2d0: 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
e2e0: 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"> \"\n".    "
e2f0: 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
e300: 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
e310: 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20  ne \"% \"\n".   
e320: 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73   "}\n".    "flus
e330: 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20  h stdout\n".    
e340: 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
e350: 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
e360: 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70   "if {[info comp
e370: 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e  lete $line]} {\n
e380: 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61  ".      "if {[ca
e390: 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20  tch {uplevel #0 
e3a0: 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20  $line} result]} 
e3b0: 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
e3c0: 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f  ts stderr \"Erro
e3d0: 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a  r: $result\"\n".
e3e0: 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20        "} elseif 
e3f0: 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20  {$result!=\"\"} 
e400: 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
e410: 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20  ts $result\n".  
e420: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
e430: 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
e440: 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
e450: 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c  .      "append l
e460: 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22  ine \\n\n".    "
e470: 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23  }\n".  "}\n".;.#
e480: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
e490: 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20  the macro TCLSH 
e4a0: 69 73 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74  is two, then get
e4b0: 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63   the main loop c
e4c0: 6f 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68  ode out of.** th
e4d0: 65 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 20  e separate file 
e4e0: 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68  "spaceanal_tcl.h
e4f0: 22 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d  "..*/.#if TCLSH=
e500: 3d 32 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  =2.static char z
e510: 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69  Mainloop[] = .#i
e520: 6e 63 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61  nclude "spaceana
e530: 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69  l_tcl.h".;.#endi
e540: 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48  f..#define TCLSH
e550: 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20  _MAIN main   /* 
e560: 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f  Needed to fake o
e570: 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69  ut mktclapp */.i
e580: 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e  nt TCLSH_MAIN(in
e590: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
e5a0: 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  rgv){.  Tcl_Inte
e5b0: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
e5c0: 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  l_FindExecutable
e5d0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74  (argv[0]);.  int
e5e0: 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
e5f0: 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69  Interp();.  Sqli
e600: 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
e610: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
e620: 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74  TEST.  {.    ext
e630: 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
e640: 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st1_Init(Tcl_Int
e650: 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
e660: 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
e670: 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  2_Init(Tcl_Inter
e680: 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
e690: 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f  int Sqlitetest3_
e6a0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
e6b0: 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
e6c0: 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e  t Sqlitetest4_In
e6d0: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
e6e0: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
e6f0: 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
e700: 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
e710: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64     extern int Md
e720: 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  5_Init(Tcl_Inter
e730: 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
e740: 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 73  int Sqlitetestss
e750: 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
e760: 70 2a 29 3b 0a 0a 20 20 20 20 53 71 6c 69 74 65  p*);..    Sqlite
e770: 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72  test1_Init(inter
e780: 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
e790: 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st2_Init(interp)
e7a0: 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
e7b0: 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
e7c0: 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f      Sqlitetest4_
e7d0: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
e7e0: 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e    Sqlitetest5_In
e7f0: 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
e800: 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Md5_Init(interp)
e810: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
e820: 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65  SSE.    Sqlitete
e830: 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72  stsse_Init(inter
e840: 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  p);.#endif.  }.#
e850: 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67 63  endif.  if( argc
e860: 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20  >=2 || TCLSH==2 
e870: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
e880: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
e890: 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76  erp,"argv0",argv
e8a0: 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  [1],TCL_GLOBAL_O
e8b0: 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  NLY);.    Tcl_Se
e8c0: 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
e8d0: 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42  v", "", TCL_GLOB
e8e0: 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f  AL_ONLY);.    fo
e8f0: 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61  r(i=3-TCLSH; i<a
e900: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
e910: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
e920: 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76  rp, "argv", argv
e930: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54  [i],.          T
e940: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c  CL_GLOBAL_ONLY |
e950: 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e   TCL_LIST_ELEMEN
e960: 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56  T | TCL_APPEND_V
e970: 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ALUE);.    }.   
e980: 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26   if( TCLSH==1 &&
e990: 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e   Tcl_EvalFile(in
e9a0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d  terp, argv[1])!=
e9b0: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
e9c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66  const char *zInf
e9d0: 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69  o = Tcl_GetVar(i
e9e0: 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66  nterp, "errorInf
e9f0: 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  o", TCL_GLOBAL_O
ea00: 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NLY);.      if( 
ea10: 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f  zInfo==0 ) zInfo
ea20: 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c   = interp->resul
ea30: 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  t;.      fprintf
ea40: 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c  (stderr,"%s: %s\
ea50: 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f  n", *argv, zInfo
ea60: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ea70: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
ea80: 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43  f( argc<=1 || TC
ea90: 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63  LSH==2 ){.    Tc
eaa0: 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74  l_GlobalEval(int
eab0: 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b  erp, zMainloop);
eac0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
ead0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c  .}.#endif /* TCL
eae0: 53 48 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  SH */..#endif /*
eaf0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 43 4c   !defined(NO_TCL
eb00: 29 20 2a 2f 0a                                   ) */.