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

Artifact 9923abeffc9b3d7dad58e92b319661521f60debf:


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 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 24 49 64 3a 20 74 63 6c 73 71 6c 69 74  ** $Id: tclsqlit
0210: 65 2e 63 2c 76 20 31 2e 32 30 37 20 32 30 30 37  e.c,v 1.207 2007
0220: 2f 31 31 2f 31 34 20 30 36 3a 34 38 3a 34 38 20  /11/14 06:48:48 
0230: 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20  danielk1977 Exp 
0240: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 74  $.*/.#include "t
0250: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0260: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  errno.h>../*.** 
0270: 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Some additional 
0280: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61 72  include files ar
0290: 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69 73  e needed if this
02a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
02b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
02c0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
02d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
02e0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69  AMALGAMATION.# i
02f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0300: 74 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c  t.h".# include <
0310: 73 74 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c  stdlib.h>.# incl
0320: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0330: 20 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74   include <assert
0340: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 63  .h>.# include <c
0350: 74 79 70 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  type.h>.#endif..
0360: 2f 2a 0a 20 2a 20 57 69 6e 64 6f 77 73 20 6e 65  /*. * Windows ne
0370: 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 69 63  eds to know whic
0380: 68 20 73 79 6d 62 6f 6c 73 20 74 6f 20 65 78 70  h symbols to exp
0390: 6f 72 74 2e 20 20 55 6e 69 78 20 64 6f 65 73 20  ort.  Unix does 
03a0: 6e 6f 74 2e 0a 20 2a 20 42 55 49 4c 44 5f 73 71  not.. * BUILD_sq
03b0: 6c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 75  lite should be u
03c0: 6e 64 65 66 69 6e 65 64 20 66 6f 72 20 55 6e 69  ndefined for Uni
03d0: 78 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 42 55  x.. */.#ifdef BU
03e0: 49 4c 44 5f 73 71 6c 69 74 65 0a 23 75 6e 64 65  ILD_sqlite.#unde
03f0: 66 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c  f TCL_STORAGE_CL
0400: 41 53 53 0a 23 64 65 66 69 6e 65 20 54 43 4c 5f  ASS.#define TCL_
0410: 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 20 44 4c  STORAGE_CLASS DL
0420: 4c 45 58 50 4f 52 54 0a 23 65 6e 64 69 66 20 2f  LEXPORT.#endif /
0430: 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 2a  * BUILD_sqlite *
0440: 2f 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f 50  /..#define NUM_P
0450: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30  REPARED_STMTS 10
0460: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 52 45  .#define MAX_PRE
0470: 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30 30 0a  PARED_STMTS 100.
0480: 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c 20 75 73  ./*.** If TCL us
0490: 65 73 20 55 54 46 2d 38 20 61 6e 64 20 53 51 4c  es UTF-8 and SQL
04a0: 69 74 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ite is configure
04b0: 64 20 74 6f 20 75 73 65 20 69 73 6f 38 38 35 39  d to use iso8859
04c0: 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20 68 61 76  , then we.** hav
04d0: 65 20 74 6f 20 64 6f 20 61 20 74 72 61 6e 73 6c  e to do a transl
04e0: 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f 69 6e 67  ation when going
04f0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
0500: 2e 20 20 53 65 74 20 74 68 65 20 0a 2a 2a 20 55  .  Set the .** U
0510: 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e  TF_TRANSLATION_N
0520: 45 45 44 45 44 20 6d 61 63 72 6f 20 74 6f 20 69  EEDED macro to i
0530: 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20  ndicate that we 
0540: 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74 68  need to do.** th
0550: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 20  is translation. 
0560: 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
0570: 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29 20 26 26  (TCL_UTF_MAX) &&
0580: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0590: 5f 55 54 46 38 29 0a 23 20 64 65 66 69 6e 65 20  _UTF8).# define 
05a0: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
05b0: 4e 45 45 44 45 44 20 31 0a 23 65 6e 64 69 66 0a  NEEDED 1.#endif.
05c0: 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c 20 66  ./*.** New SQL f
05d0: 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20  unctions can be 
05e0: 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20 73  created as TCL s
05f0: 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73 75  cripts.  Each su
0600: 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ch function.** i
0610: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
0620: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0630: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0640: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
0650: 66 20 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  f struct SqlFunc
0660: 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72 75 63 74   SqlFunc;.struct
0670: 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20 54 63 6c   SqlFunc {.  Tcl
0680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
0690: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
06a0: 74 65 72 70 72 65 74 20 74 6f 20 65 78 65 63 75  terpret to execu
06b0: 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  te the function 
06c0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
06d0: 63 72 69 70 74 3b 20 20 20 20 20 2f 2a 20 54 68  cript;     /* Th
06e0: 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70 72 65 73  e Tcl_Obj repres
06f0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0700: 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74 20  script */.  int 
0710: 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20 20  useEvalObjv;    
0720: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 20    /* True if it 
0730: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
0740: 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20  cl_EvalObjv */. 
0750: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
0760: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0770: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
0780: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e  */.  SqlFunc *pN
0790: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
07a0: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
07b0: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
07c0: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
07d0: 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   New collation s
07e0: 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f  equences functio
07f0: 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  n can be created
0800: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0810: 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66    Each such.** f
0820: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72  unction is descr
0830: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0840: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0850: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0870: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c  t SqlCollate Sql
0880: 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20  Collate;.struct 
0890: 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54  SqlCollate {.  T
08a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
08b0: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
08c0: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
08d0: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
08e0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63  n */.  char *zSc
08f0: 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ript;        /* 
0900: 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65  The script to be
0910: 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c   run */.  SqlCol
0920: 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  late *pNext;    
0930: 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e  /* Next function
0940: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20   on the list of 
0950: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a  them all */.};..
0960: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20 73  /*.** Prepared s
0970: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 61  tatements are ca
0980: 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72 20  ched for faster 
0990: 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63 68  execution.  Each
09a0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
09b0: 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72 69  tement is descri
09c0: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
09d0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
09e0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
09f0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a00: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0a10: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0a20: 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  ;.struct SqlPrep
0a30: 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71 6c  aredStmt {.  Sql
0a40: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
0a50: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
0a60: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
0a70: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0a80: 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50 72  t *pPrev;  /* Pr
0a90: 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c 69  evious on the li
0aa0: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
0ab0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
0ac0: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
0ad0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0ae0: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
0af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61 72           /* char
0b00: 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  s in zSql[] */. 
0b10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
0b20: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  l;        /* Tex
0b30: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
0b40: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 74 79  tement */.};..ty
0b50: 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 63  pedef struct Inc
0b60: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 49 6e 63  rblobChannel Inc
0b70: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 3b 0a 0a 2f  rblobChannel;../
0b80: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
0b90: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
0ba0: 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
0bb0: 20 65 61 63 68 20 53 51 4c 69 74 65 20 64 61 74   each SQLite dat
0bc0: 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20 68 61  abase.** that ha
0bd0: 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
0be0: 20 74 68 65 20 53 51 4c 69 74 65 20 54 43 4c 20   the SQLite TCL 
0bf0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 74 79  interface..*/.ty
0c00: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0c10: 69 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a  iteDb SqliteDb;.
0c20: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
0c30: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c50: 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74  * The "real" dat
0c60: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
0c70: 20 4d 55 53 54 20 42 45 20 46 49 52 53 54 20 2a   MUST BE FIRST *
0c80: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
0c90: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f  interp;        /
0ca0: 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65  * The interprete
0cb0: 72 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  r used for this 
0cc0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
0cd0: 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20  ar *zBusy;      
0ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0cf0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f  busy callback ro
0d00: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0d10: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
0d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
0d30: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
0d40: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0d50: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0d70: 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
0d80: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0d90: 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20 20 20  r *zProfile;    
0da0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0db0: 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20  rofile callback 
0dc0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0dd0: 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20  r *zProgress;   
0de0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0df0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
0e00: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0e10: 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20  ar *zAuth;      
0e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0e30: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
0e40: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0e50: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b  /.  char *zNull;
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0e70: 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69  * Text to substi
0e80: 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20  tute for an SQL 
0e90: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
0ea0: 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20  SqlFunc *pFunc; 
0eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
0ec0: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
0ed0: 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ons */.  Tcl_Obj
0ee0: 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20   *pUpdateHook;  
0ef0: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f      /* Update ho
0f00: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0f10: 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  y) */.  Tcl_Obj 
0f20: 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20  *pRollbackHook; 
0f30: 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68     /* Rollback h
0f40: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
0f50: 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ny) */.  SqlColl
0f60: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20  ate *pCollate;  
0f70: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53      /* List of S
0f80: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
0f90: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
0fa0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
0fb0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
0fc0: 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65   code of most re
0fd0: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  cent sqlite3_exe
0fe0: 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  c() */.  Tcl_Obj
0ff0: 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64   *pCollateNeeded
1000: 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e  ;   /* Collation
1010: 20 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a   needed script *
1020: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
1030: 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f  tmt *stmtList; /
1040: 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72  * List of prepar
1050: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a  ed statements*/.
1060: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
1070: 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20  t *stmtLast; /* 
1080: 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69  Last statement i
1090: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
10a0: 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20  int maxStmt;    
10b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10c0: 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e  e next maximum n
10d0: 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73  umber of stmtLis
10e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74  t */.  int nStmt
10f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1100: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
1110: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d  tatements in stm
1120: 74 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62  tList */.  Incrb
1130: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63  lobChannel *pInc
1140: 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20  rblob;/* Linked 
1150: 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63  list of open inc
1160: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
1170: 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63  /.};..struct Inc
1180: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20  rblobChannel {. 
1190: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
11a0: 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73 71  Blob;      /* sq
11b0: 6c 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c  lite3 blob handl
11c0: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
11d0: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
11e0: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
11f0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1200: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65  on */.  int iSee
1210: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1220: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65 65    /* Current see
1230: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54 63  k offset */.  Tc
1240: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65  l_Channel channe
1250: 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e  l;      /* Chann
1260: 65 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  el identifier */
1270: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1280: 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20  el *pNext;   /* 
1290: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
12a0: 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  ll open incrblob
12b0: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49   channels */.  I
12c0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
12d0: 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b  pPrev;   /* Link
12e0: 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f  ed list of all o
12f0: 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  pen incrblob cha
1300: 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  nnels */.};..#if
1310: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1320: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
1330: 43 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72 62 6c  Close all incrbl
1340: 6f 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70 65 6e  ob channels open
1350: 65 64 20 75 73 69 6e 67 20 64 61 74 61 62 61 73  ed using databas
1360: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62  e connection pDb
1370: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  ..** This is cal
1380: 6c 65 64 20 77 68 65 6e 20 73 68 75 74 74 69 6e  led when shuttin
1390: 67 20 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62  g down the datab
13a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
13b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
13c0: 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  loseIncrblobChan
13d0: 6e 65 6c 73 28 53 71 6c 69 74 65 44 62 20 2a 70  nels(SqliteDb *p
13e0: 44 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  Db){.  IncrblobC
13f0: 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49 6e 63  hannel *p;.  Inc
1400: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e  rblobChannel *pN
1410: 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 44  ext;..  for(p=pD
1420: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20 70 3b  b->pIncrblob; p;
1430: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
1440: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
1450: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 43  ..    /* Note: C
1460: 61 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73 74 65  alling unregiste
1470: 72 20 68 65 72 65 20 63 61 6c 6c 20 54 63 6c 5f  r here call Tcl_
1480: 43 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69 6e 63  Close on the inc
1490: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c 20 0a  rblob channel, .
14a0: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 64 65 6c      ** which del
14b0: 65 74 65 73 20 74 68 65 20 49 6e 63 72 62 6c 6f  etes the Incrblo
14c0: 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75  bChannel structu
14d0: 72 65 20 61 74 20 2a 70 2e 20 53 6f 20 64 6f 20  re at *p. So do 
14e0: 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  not.    ** call 
14f0: 54 63 6c 5f 46 72 65 65 28 29 20 68 65 72 65 2e  Tcl_Free() here.
1500: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  .    */.    Tcl_
1510: 55 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65  UnregisterChanne
1520: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
1530: 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a  ->channel);.  }.
1540: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1550: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
1560: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
1570: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
1580: 6f 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74 44 61  obClose(ClientDa
1590: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
15a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15b0: 65 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  erp){.  Incrblob
15c0: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
15d0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
15e0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
15f0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1600: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70  _blob_close(p->p
1610: 42 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  Blob);.  sqlite3
1620: 20 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d 3e 64   *db = p->pDb->d
1630: 62 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  b;..  /* Remove 
1640: 74 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d  the channel from
1650: 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49   the SqliteDb.pI
1660: 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f  ncrblob list. */
1670: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
1680: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
1690: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
16a0: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  v;.  }.  if( p->
16b0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
16c0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
16d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
16e0: 66 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72  f( p->pDb->pIncr
16f0: 62 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20 20 70  blob==p ){.    p
1700: 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  ->pDb->pIncrblob
1710: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
1720: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
1730: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1740: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54  structure */.  T
1750: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
1760: 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  p);..  if( rc!=S
1770: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1780: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1790: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
17a0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
17b0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
17c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
17e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
17f0: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
1800: 72 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rom an increment
1810: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1830: 6e 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20 20  ncrblobInput(.  
1840: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
1850: 6e 63 65 44 61 74 61 2c 20 0a 20 20 63 68 61 72  nceData, .  char
1860: 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 62 75   *buf, .  int bu
1870: 66 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65 72  fSize,.  int *er
1880: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
1890: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
18a0: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
18b0: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
18c0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65 61  Data;.  int nRea
18d0: 64 20 3d 20 62 75 66 53 69 7a 65 3b 20 20 20 20  d = bufSize;    
18e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18f0: 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
1900: 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20  */.  int nBlob; 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
1930: 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20  of the blob */. 
1940: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1960: 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
1970: 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d  de */..  nBlob =
1980: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
1990: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  tes(p->pBlob);. 
19a0: 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e   if( (p->iSeek+n
19b0: 52 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20  Read)>nBlob ){. 
19c0: 20 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f 62     nRead = nBlob
19d0: 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a 20  -p->iSeek;.  }. 
19e0: 20 69 66 28 20 6e 52 65 61 64 3c 3d 30 20 29 7b   if( nRead<=0 ){
19f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1a00: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
1a10: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e  e3_blob_read(p->
1a20: 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62  pBlob, (void *)b
1a30: 75 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 53  uf, nRead, p->iS
1a40: 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  eek);.  if( rc!=
1a50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a60: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
1a70: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   rc;.    return 
1a80: 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53  -1;.  }..  p->iS
1a90: 65 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20  eek += nRead;.  
1aa0: 72 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a  return nRead;.}.
1ab0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
1ac0: 61 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  a to an incremen
1ad0: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
1ae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1af0: 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 28 0a  incrblobOutput(.
1b00: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
1b10: 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 43 4f  tanceData, .  CO
1b20: 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 0a  NST char *buf, .
1b30: 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20    int toWrite,. 
1b40: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
1b50: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
1b60: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
1b70: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
1b80: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
1b90: 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f 57  int nWrite = toW
1ba0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  rite;        /* 
1bb0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1bc0: 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e  to write */.  in
1bd0: 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20  t nBlob;        
1be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
1bf0: 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
1c00: 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63  blob */.  int rc
1c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c20: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1c30: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a   error code */..
1c40: 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    nBlob = sqlite
1c50: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
1c60: 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70  pBlob);.  if( (p
1c70: 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29 3e  ->iSeek+nWrite)>
1c80: 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65 72  nBlob ){.    *er
1c90: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e  rorCodePtr = EIN
1ca0: 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  VAL;.    return 
1cb0: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 57  -1;.  }.  if( nW
1cc0: 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 72  rite<=0 ){.    r
1cd0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
1cf0: 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f 62  b_write(p->pBlob
1d00: 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e  , (void *)buf, n
1d10: 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b 29  Write, p->iSeek)
1d20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1d30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72  TE_OK ){.    *er
1d40: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f  rorCodePtr = EIO
1d50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
1d60: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b  .  }..  p->iSeek
1d70: 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72 65   += nWrite;.  re
1d80: 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a  turn nWrite;.}..
1d90: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69 6e  /*.** Seek an in
1da0: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1db0: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1dc0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 53 65  c int incrblobSe
1dd0: 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ek(.  ClientData
1de0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a   instanceData, .
1df0: 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20    long offset,. 
1e00: 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20   int seekMode,. 
1e10: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
1e20: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
1e30: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
1e40: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
1e50: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20  instanceData;.. 
1e60: 20 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64   switch( seekMod
1e70: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45  e ){.    case SE
1e80: 45 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d  EK_SET:.      p-
1e90: 3e 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b  >iSeek = offset;
1ea0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1eb0: 20 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a    case SEEK_CUR:
1ec0: 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20  .      p->iSeek 
1ed0: 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20  += offset;.     
1ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1ef0: 20 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20   SEEK_END:.     
1f00: 20 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69   p->iSeek = sqli
1f10: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
1f20: 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65  ->pBlob) + offse
1f30: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
1f40: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
1f50: 73 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d  sert(!"Bad seekM
1f60: 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ode");.  }..  re
1f70: 74 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d  turn p->iSeek;.}
1f80: 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  ...static void i
1f90: 6e 63 72 62 6c 6f 62 57 61 74 63 68 28 43 6c 69  ncrblobWatch(Cli
1fa0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
1fb0: 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  Data, int mode){
1fc0: 20 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20   .  /* NO-OP */ 
1fd0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  .}.static int in
1fe0: 63 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43 6c 69  crblobHandle(Cli
1ff0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2000: 44 61 74 61 2c 20 69 6e 74 20 64 69 72 2c 20 43  Data, int dir, C
2010: 6c 69 65 6e 74 44 61 74 61 20 2a 68 50 74 72 29  lientData *hPtr)
2020: 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  {.  return TCL_E
2030: 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RROR;.}..static 
2040: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20  Tcl_ChannelType 
2050: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54  IncrblobChannelT
2060: 79 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72 62  ype = {.  "incrb
2070: 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2090: 74 79 70 65 4e 61 6d 65 20 20 20 20 20 20 20 20  typeName        
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43 48       */.  TCL_CH
20c0: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c  ANNEL_VERSION_2,
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e0: 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20  version         
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2110: 6f 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  obClose,        
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2130: 63 6c 6f 73 65 50 72 6f 63 20 20 20 20 20 20 20  closeProc       
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2160: 6f 62 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20  obInput,        
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2180: 69 6e 70 75 74 50 72 6f 63 20 20 20 20 20 20 20  inputProc       
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
21b0: 6f 62 4f 75 74 70 75 74 2c 20 20 20 20 20 20 20  obOutput,       
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d0: 6f 75 74 70 75 74 50 72 6f 63 20 20 20 20 20 20  outputProc      
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2200: 6f 62 53 65 65 6b 2c 20 20 20 20 20 20 20 20 20  obSeek,         
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2220: 73 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20  seekProc        
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2270: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20  setOptionProc   
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22c0: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20  getOptionProc   
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
22f0: 6f 62 57 61 74 63 68 2c 20 20 20 20 20 20 20 20  obWatch,        
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2310: 77 61 74 63 68 50 72 6f 63 20 28 74 68 69 73 20  watchProc (this 
2320: 69 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20 20  is a no-op)     
2330: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2340: 6f 62 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20  obHandle,       
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2360: 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 28 61  getHandleProc (a
2370: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 65 72  lways returns er
2380: 72 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20 20  ror) */.  0,    
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b0: 63 6c 6f 73 65 32 50 72 6f 63 20 20 20 20 20 20  close2Proc      
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2400: 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20 20  blockModeProc   
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2450: 66 6c 75 73 68 50 72 6f 63 20 20 20 20 20 20 20  flushProc       
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 68 61 6e 64 6c 65 72 50 72 6f 63 20 20 20 20 20  handlerProc     
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24f0: 77 69 64 65 53 65 65 6b 50 72 6f 63 20 20 20 20  wideSeekProc    
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a       */.};../*.*
2520: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
2530: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  ncrblob channel.
2540: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2550: 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61  reateIncrblobCha
2560: 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74 65  nnel(.  Tcl_Inte
2570: 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 53  rp *interp, .  S
2580: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 0a 20  qliteDb *pDb, . 
2590: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
25a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
25b0: 7a 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e 73 74  zTable, .  const
25c0: 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20   char *zColumn, 
25d0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
25e0: 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73 52 65  iRow,.  int isRe
25f0: 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e 63 72  adonly.){.  Incr
2600: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a  blobChannel *p;.
2610: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2620: 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74  pDb->db;.  sqlit
2630: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a  e3_blob *pBlob;.
2640: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2650: 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45 41 44  flags = TCL_READ
2660: 41 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e 6c 79  ABLE|(isReadonly
2670: 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49 54 41   ? 0 : TCL_WRITA
2680: 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  BLE);..  /* This
2690: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
26a0: 64 20 74 6f 20 6e 61 6d 65 20 74 68 65 20 63 68  d to name the ch
26b0: 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62 6c 6f  annels: "incrblo
26c0: 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d 22 20  b_[incr count]" 
26d0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  */.  static int 
26e0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61  count = 0;.  cha
26f0: 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a  r zChannel[64];.
2700: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2710: 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 7a 44  blob_open(db, zD
2720: 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75  b, zTable, zColu
2730: 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52 65 61  mn, iRow, !isRea
2740: 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29 3b 0a  donly, &pBlob);.
2750: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2760: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
2770: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
2780: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2790: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
27a0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
27b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
27c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 20  ERROR;.  }..  p 
27d0: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
27e0: 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73  el *)Tcl_Alloc(s
27f0: 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43 68  izeof(IncrblobCh
2800: 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69 53  annel));.  p->iS
2810: 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 42  eek = 0;.  p->pB
2820: 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20  lob = pBlob;..  
2830: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2840: 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e 65 6c  (sizeof(zChannel
2850: 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22 69 6e  ), zChannel, "in
2860: 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f  crblob_%d", ++co
2870: 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e  unt);.  p->chann
2880: 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43  el = Tcl_CreateC
2890: 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f 62  hannel(&Incrblob
28a0: 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43 68  ChannelType, zCh
28b0: 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73 29  annel, p, flags)
28c0: 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65 72  ;.  Tcl_Register
28d0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
28e0: 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20  p->channel);..  
28f0: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
2900: 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74 68 65  channel into the
2910: 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62   SqliteDb.pIncrb
2920: 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70  lob list. */.  p
2930: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
2940: 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70  Incrblob;.  p->p
2950: 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  Prev = 0;.  if( 
2960: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
2970: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
2980: 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e  = p;.  }.  pDb->
2990: 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b 0a 20  pIncrblob = p;. 
29a0: 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 0a   p->pDb = pDb;..
29b0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
29c0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
29d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
29e0: 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20  me(p->channel), 
29f0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
2a00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2a10: 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c 73 65  }.#else  /* else
2a20: 20 63 6c 61 75 73 65 20 66 6f 72 20 22 23 69 66   clause for "#if
2a30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a40: 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a 20 20  _INCRBLOB" */.  
2a50: 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 49 6e 63  #define closeInc
2a60: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44  rblobChannels(pD
2a70: 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  b).#endif../*.**
2a80: 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72   Look at the scr
2a90: 69 70 74 20 70 72 65 66 69 78 20 69 6e 20 70 43  ipt prefix in pC
2aa0: 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20  md.  We will be 
2ab0: 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 73  executing this s
2ac0: 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66  cript.** after f
2ad0: 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f  irst appending o
2ae0: 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ne or more argum
2af0: 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74  ents.  This rout
2b00: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20  ine analyzes.** 
2b10: 74 68 65 20 73 63 72 69 70 74 20 74 6f 20 73 65  the script to se
2b20: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
2b30: 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f  to use Tcl_EvalO
2b40: 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72  bjv() on the scr
2b50: 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ipt.** rather th
2b60: 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  an the more gene
2b70: 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29  ral Tcl_EvalEx()
2b80: 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  .  Tcl_EvalObjv(
2b90: 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73  ) is much.** fas
2ba0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70  ter..**.** Scrip
2bb0: 74 73 20 74 68 61 74 20 61 72 65 20 73 61 66 65  ts that are safe
2bc0: 20 74 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c   to use with Tcl
2bd0: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73  _EvalObjv() cons
2be0: 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d  ists of a.** com
2bf0: 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77  mand name follow
2c00: 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f  ed by zero or mo
2c10: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74  re arguments wit
2c20: 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a  h no [...] or $.
2c30: 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b  ** or {...} or ;
2c40: 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77   to be seen anyw
2c50: 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c  here.  Most call
2c60: 62 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e  back scripts con
2c70: 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20  sist.** of just 
2c80: 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75  a single procedu
2c90: 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79  re name and they
2ca0: 20 6d 65 65 74 20 74 68 69 73 20 72 65 71 75 69   meet this requi
2cb0: 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  rement..*/.stati
2cc0: 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45  c int safeToUseE
2cd0: 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65  valObjv(Tcl_Inte
2ce0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f  rp *interp, Tcl_
2cf0: 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a  Obj *pCmd){.  /*
2d00: 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f   We could try to
2d10: 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   do something wi
2d20: 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20  th Tcl_Parse(). 
2d30: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73   But we will ins
2d40: 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64  tead.  ** just d
2d50: 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 66  o a search for f
2d60: 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61 63 74  orbidden charact
2d70: 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20  ers.  If any of 
2d80: 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20  the forbidden.  
2d90: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 70  ** characters ap
2da0: 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65  pear in pCmd, we
2db0: 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65   will report the
2dc0: 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66   string as unsaf
2dd0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  e..  */.  const 
2de0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
2df0: 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53  ;.  z = Tcl_GetS
2e00: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d  tringFromObj(pCm
2e10: 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28  d, &n);.  while(
2e20: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
2e30: 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a  int c = *(z++);.
2e40: 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c      if( c=='$' |
2e50: 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27  | c=='[' || c=='
2e60: 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ;' ) return 0;. 
2e70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
2e80: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20  ../*.** Find an 
2e90: 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72  SqlFunc structur
2ea0: 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  e with the given
2eb0: 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74   name.  Or creat
2ec0: 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69  e a new.** one i
2ed0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e  f an existing on
2ee0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
2ef0: 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  d.  Return a poi
2f00: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  nter to the.** s
2f10: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2f20: 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e  tic SqlFunc *fin
2f30: 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44  dSqlFunc(SqliteD
2f40: 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68  b *pDb, const ch
2f50: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71  ar *zName){.  Sq
2f60: 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b  lFunc *p, *pNew;
2f70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77  .  int i;.  pNew
2f80: 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c   = (SqlFunc*)Tcl
2f90: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
2fa0: 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e 28 7a  pNew) + strlen(z
2fb0: 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70  Name) + 1 );.  p
2fc0: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  New->zName = (ch
2fd0: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
2fe0: 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69  for(i=0; zName[i
2ff0: 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a  ]; i++){ pNew->z
3000: 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65  Name[i] = tolowe
3010: 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20  r(zName[i]); }. 
3020: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20   pNew->zName[i] 
3030: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62  = 0;.  for(p=pDb
3040: 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d  ->pFunc; p; p=p-
3050: 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66  >pNext){ .    if
3060: 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d  ( strcmp(p->zNam
3070: 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d  e, pNew->zName)=
3080: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
3090: 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77  Free((char*)pNew
30a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
30b0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  p;.    }.  }.  p
30c0: 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44  New->interp = pD
30d0: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65  b->interp;.  pNe
30e0: 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a  w->pScript = 0;.
30f0: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
3100: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44  pDb->pFunc;.  pD
3110: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b  b->pFunc = pNew;
3120: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3130: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a  }../*.** Finaliz
3140: 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73  e and free a lis
3150: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
3160: 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  atements.*/.stat
3170: 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d  ic void flushStm
3180: 74 43 61 63 68 65 28 20 53 71 6c 69 74 65 44 62  tCache( SqliteDb
3190: 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72   *pDb ){.  SqlPr
31a0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
31b0: 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20  Stmt;..  while( 
31c0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29   pDb->stmtList )
31d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
31e0: 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d  nalize( pDb->stm
31f0: 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  tList->pStmt );.
3200: 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70      pPreStmt = p
3210: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20  Db->stmtList;.  
3220: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
3230: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d  = pDb->stmtList-
3240: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f  >pNext;.    Tcl_
3250: 46 72 65 65 28 20 28 63 68 61 72 2a 29 70 50 72  Free( (char*)pPr
3260: 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70  eStmt );.  }.  p
3270: 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  Db->nStmt = 0;. 
3280: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
3290: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c   0;.}../*.** TCL
32a0: 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63   calls this proc
32b0: 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71  edure when an sq
32c0: 6c 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63  lite3 database c
32d0: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c  ommand is.** del
32e0: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
32f0: 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64  void DbDeleteCmd
3300: 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71  (void *db){.  Sq
3310: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3320: 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66  qliteDb*)db;.  f
3330: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44  lushStmtCache(pD
3340: 62 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62  b);.  closeIncrb
3350: 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29  lobChannels(pDb)
3360: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ;.  sqlite3_clos
3370: 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68  e(pDb->db);.  wh
3380: 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20  ile( pDb->pFunc 
3390: 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a  ){.    SqlFunc *
33a0: 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75  pFunc = pDb->pFu
33b0: 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75  nc;.    pDb->pFu
33c0: 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78  nc = pFunc->pNex
33d0: 74 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  t;.    Tcl_DecrR
33e0: 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70  efCount(pFunc->p
33f0: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c  Script);.    Tcl
3400: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75  _Free((char*)pFu
3410: 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  nc);.  }.  while
3420: 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20  ( pDb->pCollate 
3430: 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74  ){.    SqlCollat
3440: 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44  e *pCollate = pD
3450: 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  b->pCollate;.   
3460: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
3470: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
3480: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
3490: 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b  char*)pCollate);
34a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
34b0: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c  zBusy ){.    Tcl
34c0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79  _Free(pDb->zBusy
34d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
34e0: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
34f0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54  Tcl_Free(pDb->zT
3500: 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  race);.  }.  if(
3510: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
3520: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
3530: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  Db->zProfile);. 
3540: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41   }.  if( pDb->zA
3550: 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  uth ){.    Tcl_F
3560: 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b  ree(pDb->zAuth);
3570: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3580: 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c  zNull ){.    Tcl
3590: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c  _Free(pDb->zNull
35a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
35b0: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b  ->pUpdateHook ){
35c0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
35d0: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61  Count(pDb->pUpda
35e0: 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  teHook);.  }.  i
35f0: 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  f( pDb->pRollbac
3600: 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  kHook ){.    Tcl
3610: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
3620: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
3630: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3640: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
3650: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
3660: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
3670: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
3680: 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63   }.  Tcl_Free((c
3690: 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a  har*)pDb);.}../*
36a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36b0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
36c0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
36d0: 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20  is locked while 
36e0: 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65  trying.** to exe
36f0: 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61  cute SQL..*/.sta
3700: 74 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61  tic int DbBusyHa
3710: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
3720: 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53  int nTries){.  S
3730: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3740: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
3750: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
3760: 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69  Val[30];..  sqli
3770: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
3780: 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c  eof(zVal), zVal,
3790: 20 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a   "%d", nTries);.
37a0: 20 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76    rc = Tcl_VarEv
37b0: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
37c0: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c  pDb->zBusy, " ",
37d0: 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29   zVal, (char*)0)
37e0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
37f0: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
3800: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
3810: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
3820: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3830: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
3840: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3850: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
3860: 73 20 74 68 65 20 27 70 72 6f 67 72 65 73 73 20  s the 'progress 
3870: 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68  callback' for th
3880: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
3890: 74 61 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67  tatic int DbProg
38a0: 72 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64  ressHandler(void
38b0: 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44   *cd){.  SqliteD
38c0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
38d0: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
38e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ;..  assert( pDb
38f0: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20  ->zProgress );. 
3900: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
3910: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
3920: 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69  >zProgress);.  i
3930: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
3940: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
3950: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
3960: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
3970: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
3980: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
3990: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
39a0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  TRACE./*.** This
39b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
39c0: 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ed by the SQLite
39d0: 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77   trace handler w
39e0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a  henever a new.**
39f0: 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73   block of SQL is
3a00: 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
3a10: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
3a20: 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65  b->zTrace is exe
3a30: 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cuted..*/.static
3a40: 20 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e   void DbTraceHan
3a50: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63  dler(void *cd, c
3a60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
3a70: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3a80: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
3a90: 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  d;.  Tcl_DString
3aa0: 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74   str;..  Tcl_DSt
3ab0: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
3ac0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
3ad0: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
3ae0: 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63  Trace, -1);.  Tc
3af0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
3b00: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71  lement(&str, zSq
3b10: 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70  l);.  Tcl_Eval(p
3b20: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
3b30: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
3b40: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
3b50: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
3b60: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
3b70: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a  pDb->interp);.}.
3b80: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
3b90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
3ba0: 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
3bb0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
3bc0: 79 20 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f  y the SQLite pro
3bd0: 66 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74  file handler aft
3be0: 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  er a statement.*
3bf0: 2a 20 53 51 4c 20 68 61 73 20 65 78 65 63 75 74  * SQL has execut
3c00: 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72  ed.  The TCL scr
3c10: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f  ipt in pDb->zPro
3c20: 66 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65  file is evaluate
3c30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3c40: 64 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c  d DbProfileHandl
3c50: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e  er(void *cd, con
3c60: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73  st char *zSql, s
3c70: 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29  qlite_uint64 tm)
3c80: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3c90: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
3ca0: 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  d;.  Tcl_DString
3cb0: 20 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d   str;.  char zTm
3cc0: 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  [100];..  sqlite
3cd0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
3ce0: 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22  f(zTm)-1, zTm, "
3cf0: 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63  %lld", tm);.  Tc
3d00: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
3d10: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
3d20: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
3d30: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31  Db->zProfile, -1
3d40: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3d50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
3d60: 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c  tr, zSql);.  Tcl
3d70: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
3d80: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29  ement(&str, zTm)
3d90: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  ;.  Tcl_Eval(pDb
3da0: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
3db0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
3dc0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3dd0: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63  Free(&str);.  Tc
3de0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44  l_ResetResult(pD
3df0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65  b->interp);.}.#e
3e00: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
3e10: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
3e20: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
3e30: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
3e40: 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20  ed.  The.** TCL 
3e50: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
3e60: 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74  Commit is execut
3e70: 65 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72  ed.  If it retur
3e80: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a  ns non-zero or.*
3e90: 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61  * if it throws a
3ea0: 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65  n exception, the
3eb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
3ec0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74  rolled back inst
3ed0: 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20  ead.** of being 
3ee0: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74  committed..*/.st
3ef0: 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69  atic int DbCommi
3f00: 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  tHandler(void *c
3f10: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
3f20: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3f30: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
3f40: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28    rc = Tcl_Eval(
3f50: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
3f60: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66  ->zCommit);.  if
3f70: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc!=TCL_OK || 
3f80: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
3f90: 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  ngResult(pDb->in
3fa0: 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65  terp)) ){.    re
3fb0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
3fc0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
3fd0: 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63  c void DbRollbac
3fe0: 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  kHandler(void *c
3ff0: 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71  lientData){.  Sq
4000: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4010: 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44  qliteDb*)clientD
4020: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44  ata;.  assert(pD
4030: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
4040: 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  );.  if( TCL_OK!
4050: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
4060: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
4070: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20  >pRollbackHook, 
4080: 30 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  0) ){.    Tcl_Ba
4090: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44  ckgroundError(pD
40a0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  b->interp);.  }.
40b0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  }..static void D
40c0: 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a  bUpdateHandler(.
40d0: 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e    void *p, .  in
40e0: 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  t op,.  const ch
40f0: 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73  ar *zDb, .  cons
4100: 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20  t char *zTbl, . 
4110: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f   sqlite_int64 ro
4120: 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  wid.){.  SqliteD
4130: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4140: 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62  Db *)p;.  Tcl_Ob
4150: 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65  j *pCmd;..  asse
4160: 72 74 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65  rt( pDb->pUpdate
4170: 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74  Hook );.  assert
4180: 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53  ( op==SQLITE_INS
4190: 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54  ERT || op==SQLIT
41a0: 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d  E_UPDATE || op==
41b0: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b  SQLITE_DELETE );
41c0: 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44  ..  pCmd = Tcl_D
41d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
41e0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  >pUpdateHook);. 
41f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4200: 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c  t(pCmd);.  Tcl_L
4210: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4220: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
4230: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20  _NewStringObj(. 
4240: 20 20 20 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45     ( (op==SQLITE
4250: 5f 49 4e 53 45 52 54 29 3f 22 49 4e 53 45 52 54  _INSERT)?"INSERT
4260: 22 3a 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  ":(op==SQLITE_UP
4270: 44 41 54 45 29 3f 22 55 50 44 41 54 45 22 3a 22  DATE)?"UPDATE":"
4280: 44 45 4c 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a  DELETE"), -1));.
4290: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
42a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
42b0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
42c0: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
42d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
42e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
42f0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
4300: 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b  gObj(zTbl, -1));
4310: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4320: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4330: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  Cmd, Tcl_NewWide
4340: 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a  IntObj(rowid));.
4350: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
4360: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  pDb->interp, pCm
4370: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
4380: 43 54 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  CT);.}..static v
4390: 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65  oid tclCollateNe
43a0: 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 43  eded(.  void *pC
43b0: 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  tx,.  sqlite3 *d
43c0: 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  b,.  int enc,.  
43d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
43e0: 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  e.){.  SqliteDb 
43f0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
4400: 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f   *)pCtx;.  Tcl_O
4410: 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63  bj *pScript = Tc
4420: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
4430: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
4440: 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  ed);.  Tcl_IncrR
4450: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
4460: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
4470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
4480: 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77  pScript, Tcl_New
4490: 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c  StringObj(zName,
44a0: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
44b0: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
44c0: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
44d0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
44e0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a  unt(pScript);.}.
44f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4500: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
4510: 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c   evaluate an SQL
4520: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
4530: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  ion implemented.
4540: 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72  ** using TCL scr
4550: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ipt..*/.static i
4560: 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65  nt tclSqlCollate
4570: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
4580: 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73    int nA,.  cons
4590: 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e  t void *zA,.  in
45a0: 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  t nB,.  const vo
45b0: 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43  id *zB.){.  SqlC
45c0: 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53 71 6c  ollate *p = (Sql
45d0: 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a  Collate *)pCtx;.
45e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
45f0: 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e  ..  pCmd = Tcl_N
4600: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a  ewStringObj(p->z
4610: 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54  Script, -1);.  T
4620: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4630: 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  pCmd);.  Tcl_Lis
4640: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4650: 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  t(p->interp, pCm
4660: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
4670: 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20  Obj(zA, nA));.  
4680: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4690: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
46a0: 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  rp, pCmd, Tcl_Ne
46b0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e  wStringObj(zB, n
46c0: 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  B));.  Tcl_EvalO
46d0: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
46e0: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
46f0: 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65  IRECT);.  Tcl_De
4700: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
4710: 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69  ;.  return (atoi
4720: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
4730: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29  sult(p->interp))
4740: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
4750: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4760: 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  ed to evaluate a
4770: 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69  n SQL function i
4780: 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73  mplemented.** us
4790: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a  ing TCL script..
47a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
47b0: 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65  clSqlFunc(sqlite
47c0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
47d0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
47e0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67  lite3_value**arg
47f0: 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70  v){.  SqlFunc *p
4800: 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
4810: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20  data(context);. 
4820: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
4830: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4840: 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  c;..  if( argc==
4850: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
4860: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75  here are no argu
4870: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
4880: 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f  ction, call Tcl_
4890: 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65  EvalObjEx on the
48a0: 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f  .    ** script o
48b0: 62 6a 65 63 74 20 64 69 72 65 63 74 6c 79 2e 20  bject directly. 
48c0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
48d0: 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f   TCL compiler to
48e0: 20 67 65 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a   generate.    **
48f0: 20 62 79 74 65 63 6f 64 65 20 66 6f 72 20 74 68   bytecode for th
4900: 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65  e command on the
4910: 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f   first invocatio
4920: 6e 20 61 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a  n and thus make.
4930: 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e      ** subsequen
4940: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75  t invocations mu
4950: 63 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20  ch faster. */.  
4960: 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72    pCmd = p->pScr
4970: 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  ipt;.    Tcl_Inc
4980: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4990: 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  .    rc = Tcl_Ev
49a0: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
49b0: 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20  p, pCmd, 0);.   
49c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
49d0: 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65  t(pCmd);.  }else
49e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
49f0: 65 20 61 72 65 20 61 72 67 75 6d 65 6e 74 73 20  e are arguments 
4a00: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  to the function,
4a10: 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20   make a shallow 
4a20: 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20  copy of the.    
4a30: 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74  ** script object
4a40: 2c 20 6c 61 70 70 65 6e 64 20 74 68 65 20 61 72  , lappend the ar
4a50: 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65 76  guments, then ev
4a60: 61 6c 75 61 74 65 20 74 68 65 20 63 6f 70 79 2e  aluate the copy.
4a70: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42  .    **.    ** B
4a80: 79 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79  y "shallow" copy
4a90: 2c 20 77 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79  , we mean a only
4aa0: 20 74 68 65 20 6f 75 74 65 72 20 6c 69 73 74 20   the outer list 
4ab0: 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69  Tcl_Obj is dupli
4ac0: 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68  cated..    ** Th
4ad0: 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f  e new Tcl_Obj co
4ae0: 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
4af0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
4b00: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  list elements. .
4b10: 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c      ** That way,
4b20: 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62   when Tcl_EvalOb
4b30: 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e 64 20  jv() is run and 
4b40: 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66 69 72  shimmers the fir
4b50: 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a  st element.    *
4b60: 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20 74 6f  * of the list to
4b70: 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c   tclCmdNameType,
4b80: 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74 65 20   that alternate 
4b90: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77  representation w
4ba0: 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 72  ill.    ** be pr
4bb0: 65 73 65 72 76 65 64 20 61 6e 64 20 72 65 75 73  eserved and reus
4bc0: 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69  ed on the next i
4bd0: 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  nvocation..    *
4be0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
4bf0: 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41  aArg;.    int nA
4c00: 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  rg;.    if( Tcl_
4c10: 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e  ListObjGetElemen
4c20: 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d  ts(p->interp, p-
4c30: 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72 67 2c  >pScript, &nArg,
4c40: 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20 20 20   &aArg) ){.     
4c50: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4c60: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
4c70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4c80: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
4c90: 31 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72  1); .      retur
4ca0: 6e 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a 20 20  n;.    }     .  
4cb0: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77    pCmd = Tcl_New
4cc0: 4c 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41  ListObj(nArg, aA
4cd0: 72 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  rg);.    Tcl_Inc
4ce0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4cf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4d00: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
4d10: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4d20: 2a 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  *pIn = argv[i];.
4d30: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
4d40: 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Val;.           
4d50: 20 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70   .      /* Set p
4d60: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
4d70: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
4d80: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
4d90: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
4da0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
4db0: 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pIn) ){.        
4dc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
4dd0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
4de0: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
4df0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
4e00: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
4e10: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  al = Tcl_NewByte
4e20: 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33  ArrayObj(sqlite3
4e30: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29  _value_blob(pIn)
4e40: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
4e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4e60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
4e70: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
4e80: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  : {.          sq
4e90: 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73  lite_int64 v = s
4ea0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
4eb0: 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  64(pIn);.       
4ec0: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
4ed0: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
4ee0: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
4ef0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
4f00: 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  _NewIntObj(v);. 
4f10: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
4f30: 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
4f40: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20  tObj(v);.       
4f50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
4f60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4f70: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4f80: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
4f90: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
4fa0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4fb0: 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20  double(pIn);.   
4fc0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
4fd0: 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
4fe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
4ff0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5000: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
5010: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
5020: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5030: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20  ewStringObj("", 
5040: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
5050: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5060: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
5070: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
5080: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
5090: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29  value_bytes(pIn)
50a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
50b0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
50c0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
50d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
50e0: 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  In), bytes);.   
50f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5110: 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c        rc = Tcl_L
5120: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5130: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
5140: 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  Cmd, pVal);.    
5150: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
5160: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
5170: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5180: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5190: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
51a0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
51b0: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
51c0: 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20  , -1); .        
51d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
51e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
51f0: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b  ->useEvalObjv ){
5200: 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76  .      /* Tcl_Ev
5210: 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61  alObjEx() will a
5220: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c  utomatically cal
5230: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  l Tcl_EvalObjv()
5240: 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a   if pCmd.      *
5250: 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68  * is a list with
5260: 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70  out a string rep
5270: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f  resentation.  To
5280: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
5290: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70  om.      ** happ
52a0: 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65  ening, make sure
52b0: 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69   pCmd has a vali
52c0: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
52d0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
52e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
52f0: 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cmd);.    }.    
5300: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
5310: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
5320: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
5330: 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ECT);.    Tcl_De
5340: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5350: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
5360: 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52  && rc!=TCL_RETUR
5370: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
5380: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
5390: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
53a0: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
53b0: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d  terp), -1); .  }
53c0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  else{.    Tcl_Ob
53d0: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
53e0: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
53f0: 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e  terp);.    int n
5400: 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a  ;.    u8 *data;.
5410: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20      char *zType 
5420: 3d 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20  = pVar->typePtr 
5430: 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d  ? pVar->typePtr-
5440: 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20  >name : "";.    
5450: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
5460: 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62  ];.    if( c=='b
5470: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
5480: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
5490: 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73  0 && pVar->bytes
54a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
54b0: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c  Only return a BL
54c0: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
54d0: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
54e0: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
54f0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73       ** has no s
5500: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
5510: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64  tion. */.      d
5520: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
5530: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
5540: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
5550: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
5560: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61  ob(context, data
5570: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
5580: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
5590: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
55a0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
55b0: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
55c0: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
55d0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
55e0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
55f0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
5600: 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  text, n);.    }e
5610: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
5620: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
5630: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
5640: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
5650: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
5660: 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  leFromObj(0, pVa
5670: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r, &r);.      sq
5680: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
5690: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  ble(context, r);
56a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
56b0: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
56c0: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
56d0: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
56e0: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
56f0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
5700: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54  )==0) ){.      T
5710: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
5720: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
5730: 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  ntFromObj(0, pVa
5740: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71  r, &v);.      sq
5750: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5760: 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a  64(context, v);.
5770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5780: 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65   data = (unsigne
5790: 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  d char *)Tcl_Get
57a0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56  StringFromObj(pV
57b0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
57c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
57d0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
57e0: 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c  r *)data, n, SQL
57f0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5800: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
5810: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5820: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
5830: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
5840: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
5850: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70  function.  It ap
5860: 70 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e  pends the authen
5870: 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65  tication.** type
5880: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77   code and the tw
5890: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a  o arguments to z
58a0: 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b  Cmd[] then invok
58b0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
58c0: 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   on the interpre
58d0: 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20  ter.  The reply 
58e0: 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64  is examined to d
58f0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a  etermine if the.
5900: 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ** authenticatio
5910: 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65  n fails or succe
5920: 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eds..*/.static i
5930: 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  nt auth_callback
5940: 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  (.  void *pArg,.
5950: 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f    int code,.  co
5960: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c  nst char *zArg1,
5970: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5980: 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg2,.  const ch
5990: 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e  ar *zArg3,.  con
59a0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29  st char *zArg4.)
59b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
59c0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
59d0: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
59e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70  const char *zRep
59f0: 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  ly;.  SqliteDb *
5a00: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
5a10: 29 70 41 72 67 3b 0a 0a 20 20 73 77 69 74 63 68  )pArg;..  switch
5a20: 28 20 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  ( code ){.    ca
5a30: 73 65 20 53 51 4c 49 54 45 5f 43 4f 50 59 20 20  se SQLITE_COPY  
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
5a50: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59  ode="SQLITE_COPY
5a60: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5a70: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
5a80: 5f 49 4e 44 45 58 20 20 20 20 20 20 3a 20 7a 43  _INDEX      : zC
5a90: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5aa0: 54 45 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  TE_INDEX"; break
5ab0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5ac0: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 20 20  E_CREATE_TABLE  
5ad0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5ae0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5af0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5b00: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
5b10: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43  _TEMP_INDEX : zC
5b20: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5b30: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20  TE_TEMP_INDEX"; 
5b40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5b50: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5b60: 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65  MP_TABLE : zCode
5b70: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5b80: 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  TEMP_TABLE"; bre
5b90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5ba0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5bb0: 54 52 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22  TRIGGER: zCode="
5bc0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5bd0: 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  MP_TRIGGER"; bre
5be0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5bf0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5c00: 56 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53  VIEW  : zCode="S
5c10: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5c20: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
5c30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5c40: 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 20 20  CREATE_TRIGGER  
5c50: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
5c60: 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52  E_CREATE_TRIGGER
5c70: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5c80: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
5c90: 5f 56 49 45 57 20 20 20 20 20 20 20 3a 20 7a 43  _VIEW       : zC
5ca0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5cb0: 54 45 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  TE_VIEW"; break;
5cc0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5cd0: 5f 44 45 4c 45 54 45 20 20 20 20 20 20 20 20 20  _DELETE         
5ce0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5cf0: 54 45 5f 44 45 4c 45 54 45 22 3b 20 62 72 65 61  TE_DELETE"; brea
5d00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5d10: 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20 20  TE_DROP_INDEX   
5d20: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5d30: 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22  LITE_DROP_INDEX"
5d40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5d50: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  e SQLITE_DROP_TA
5d60: 42 4c 45 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  BLE        : zCo
5d70: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
5d80: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
5d90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
5da0: 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20  ROP_TEMP_INDEX  
5db0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5dc0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
5dd0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5de0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
5df0: 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43  EMP_TABLE   : zC
5e00: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
5e10: 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72  _TEMP_TABLE"; br
5e20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5e30: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
5e40: 52 49 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22  RIGGER : zCode="
5e50: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
5e60: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
5e70: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5e80: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
5e90: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5ea0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
5eb0: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
5ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5ed0: 5f 54 52 49 47 47 45 52 20 20 20 20 20 20 3a 20  _TRIGGER      : 
5ee0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5ef0: 4f 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  OP_TRIGGER"; bre
5f00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5f10: 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 20 20 20  ITE_DROP_VIEW   
5f20: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5f30: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 22  QLITE_DROP_VIEW"
5f40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5f50: 65 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  e SQLITE_INSERT 
5f60: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
5f70: 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45 52  de="SQLITE_INSER
5f80: 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
5f90: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d  ase SQLITE_PRAGM
5fa0: 41 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  A            : z
5fb0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50 52 41  Code="SQLITE_PRA
5fc0: 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GMA"; break;.   
5fd0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
5fe0: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a  D              :
5ff0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52   zCode="SQLITE_R
6000: 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  EAD"; break;.   
6010: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c   case SQLITE_SEL
6020: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 3a  ECT            :
6030: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53   zCode="SQLITE_S
6040: 45 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20  ELECT"; break;. 
6050: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
6060: 52 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20  RANSACTION      
6070: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6080: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62  _TRANSACTION"; b
6090: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
60a0: 51 4c 49 54 45 5f 55 50 44 41 54 45 20 20 20 20  QLITE_UPDATE    
60b0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
60c0: 22 53 51 4c 49 54 45 5f 55 50 44 41 54 45 22 3b  "SQLITE_UPDATE";
60d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
60e0: 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20 20   SQLITE_ATTACH  
60f0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6100: 65 3d 22 53 51 4c 49 54 45 5f 41 54 54 41 43 48  e="SQLITE_ATTACH
6110: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6120: 73 65 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48  se SQLITE_DETACH
6130: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6140: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 54 41  ode="SQLITE_DETA
6150: 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CH"; break;.    
6160: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4c 54 45  case SQLITE_ALTE
6170: 52 5f 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20  R_TABLE       : 
6180: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c  zCode="SQLITE_AL
6190: 54 45 52 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  TER_TABLE"; brea
61a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
61b0: 54 45 5f 52 45 49 4e 44 45 58 20 20 20 20 20 20  TE_REINDEX      
61c0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
61d0: 4c 49 54 45 5f 52 45 49 4e 44 45 58 22 3b 20 62  LITE_REINDEX"; b
61e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
61f0: 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20  QLITE_ANALYZE   
6200: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6210: 22 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22  "SQLITE_ANALYZE"
6220: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6230: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6240: 56 54 41 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f  VTABLE     : zCo
6250: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6260: 45 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  E_VTABLE"; break
6270: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6280: 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 20 20 20  E_DROP_VTABLE   
6290: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
62a0: 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22  ITE_DROP_VTABLE"
62b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
62c0: 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f  e SQLITE_FUNCTIO
62d0: 4e 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  N          : zCo
62e0: 64 65 3d 22 53 51 4c 49 54 45 5f 46 55 4e 43 54  de="SQLITE_FUNCT
62f0: 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ION"; break;.   
6300: 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20   default        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
6320: 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62   zCode="????"; b
6330: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  reak;.  }.  Tcl_
6340: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
6350: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
6360: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
6370: 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20  ->zAuth, -1);.  
6380: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
6390: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
63a0: 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74  Code);.  Tcl_DSt
63b0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
63c0: 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20  t(&str, zArg1 ? 
63d0: 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54  zArg1 : "");.  T
63e0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
63f0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
6400: 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22  rg2 ? zArg2 : ""
6410: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
6420: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
6430: 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67  tr, zArg3 ? zArg
6440: 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  3 : "");.  Tcl_D
6450: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
6460: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20  ent(&str, zArg4 
6470: 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20  ? zArg4 : "");. 
6480: 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c   rc = Tcl_Global
6490: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
64a0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
64b0: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
64c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
64d0: 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54  r);.  zReply = T
64e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
64f0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
6500: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  .  if( strcmp(zR
6510: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22  eply,"SQLITE_OK"
6520: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
6530: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
6540: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6550: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45  Reply,"SQLITE_DE
6560: 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  NY")==0 ){.    r
6570: 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b  c = SQLITE_DENY;
6580: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6590: 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49  cmp(zReply,"SQLI
65a0: 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29  TE_IGNORE")==0 )
65b0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
65c0: 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73  E_IGNORE;.  }els
65d0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b  e{.    rc = 999;
65e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
65f0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6600: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
6610: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  IZATION */../*.*
6620: 2a 20 7a 54 65 78 74 20 69 73 20 61 20 70 6f 69  * zText is a poi
6630: 6e 74 65 72 20 74 6f 20 74 65 78 74 20 6f 62 74  nter to text obt
6640: 61 69 6e 65 64 20 76 69 61 20 61 6e 20 73 71 6c  ained via an sql
6650: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
6660: 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72  ().** or similar
6670: 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69 73   interface. This
6680: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
6690: 20 61 20 54 63 6c 20 73 74 72 69 6e 67 20 6f 62   a Tcl string ob
66a0: 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65  ject, .** refere
66b0: 6e 63 65 20 63 6f 75 6e 74 20 73 65 74 20 74 6f  nce count set to
66c0: 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   0, containing t
66d0: 68 65 20 74 65 78 74 2e 20 49 66 20 61 20 74 72  he text. If a tr
66e0: 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74  anslation.** bet
66f0: 77 65 65 6e 20 69 73 6f 38 38 35 39 20 61 6e 64  ween iso8859 and
6700: 20 55 54 46 2d 38 20 69 73 20 72 65 71 75 69 72   UTF-8 is requir
6710: 65 64 2c 20 69 74 20 69 73 20 70 72 65 66 6f 72  ed, it is prefor
6720: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  med..*/.static T
6730: 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f  cl_Obj *dbTextTo
6740: 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73 74 20 2a  Obj(char const *
6750: 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62  zText){.  Tcl_Ob
6760: 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66 20  j *pVal;.#ifdef 
6770: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
6780: 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f 44 53 74  NEEDED.  Tcl_DSt
6790: 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c  ring dCol;.  Tcl
67a0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 43  _DStringInit(&dC
67b0: 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72  ol);.  Tcl_Exter
67c0: 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28  nalToUtfDString(
67d0: 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  NULL, zText, -1,
67e0: 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20   &dCol);.  pVal 
67f0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
6800: 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  bj(Tcl_DStringVa
6810: 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b  lue(&dCol), -1);
6820: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
6830: 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65  ee(&dCol);.#else
6840: 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65  .  pVal = Tcl_Ne
6850: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74  wStringObj(zText
6860: 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
6870: 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a  return pVal;.}..
6880: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6890: 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20  ne reads a line 
68a0: 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c  of text from FIL
68b0: 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20  E in, stores.** 
68c0: 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f  the text in memo
68d0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
68e0: 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65   malloc() and re
68f0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
6900: 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20  ** to the text. 
6910: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
6920: 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65  d at end of file
6930: 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29  , or if malloc()
6940: 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  .** fails..**.**
6950: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
6960: 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e 65  s like "readline
6970: 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64  " but no command
6980: 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a  -line editing.**
6990: 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
69a0: 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68 65 6c  copied from shel
69b0: 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72  l.c from '.impor
69c0: 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74  t' command.*/.st
69d0: 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c  atic char *local
69e0: 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a  _getline(char *z
69f0: 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e  Prompt, FILE *in
6a00: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  ){.  char *zLine
6a10: 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20  ;.  int nLine;. 
6a20: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f   int n;.  int eo
6a30: 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30  l;..  nLine = 10
6a40: 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c  0;.  zLine = mal
6a50: 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20  loc( nLine );.  
6a60: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
6a70: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30  eturn 0;.  n = 0
6a80: 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77  ;.  eol = 0;.  w
6a90: 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20  hile( !eol ){.  
6aa0: 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e    if( n+100>nLin
6ab0: 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  e ){.      nLine
6ac0: 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30   = nLine*2 + 100
6ad0: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20  ;.      zLine = 
6ae0: 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e  realloc(zLine, n
6af0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
6b00: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
6b10: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
6b20: 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65  if( fgets(&zLine
6b30: 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20  [n], nLine - n, 
6b40: 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  in)==0 ){.      
6b50: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
6b60: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
6b70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6b80: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
6b90: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
6ba0: 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20       eol = 1;.  
6bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6bc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  .    while( zLin
6bd0: 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  e[n] ){ n++; }. 
6be0: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
6bf0: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29  ine[n-1]=='\n' )
6c00: 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  {.      n--;.   
6c10: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
6c20: 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a  .      eol = 1;.
6c30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e      }.  }.  zLin
6c40: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69  e = realloc( zLi
6c50: 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74  ne, n+1 );.  ret
6c60: 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f  urn zLine;.}.../
6c70: 2a 0a 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20  *.** Figure out 
6c80: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
6c90: 20 66 6f 72 20 74 68 65 20 64 61 74 61 20 72 65   for the data re
6ca0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 74  turned by the st
6cb0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 70 61 73 73 65  atement.** passe
6cc0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
6cd0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
6ce0: 49 66 20 70 61 72 61 6d 65 74 65 72 20 70 61 70  If parameter pap
6cf0: 43 6f 6c 4e 61 6d 65 20 69 73 20 6e 6f 74 20 4e  ColName is not N
6d00: 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 61 70 43 6f  ULL, then *papCo
6d10: 6c 4e 61 6d 65 20 69 73 20 73 65 74 20 74 6f 20  lName is set to 
6d20: 70 6f 69 6e 74 0a 2a 2a 20 61 74 20 61 6e 20 61  point.** at an a
6d30: 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 75  rray allocated u
6d40: 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29  sing Tcl_Alloc()
6d50: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
6d60: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
6d70: 74 79 0a 2a 2a 20 74 6f 20 66 72 65 65 20 74 68  ty.** to free th
6d80: 69 73 20 61 72 72 61 79 20 75 73 69 6e 67 20 54  is array using T
6d90: 63 6c 5f 46 72 65 65 28 29 2c 20 61 6e 64 20 74  cl_Free(), and t
6da0: 6f 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  o decrement the 
6db0: 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 63 6f 75  reference.** cou
6dc0: 6e 74 20 6f 66 20 65 61 63 68 20 54 63 6c 5f 4f  nt of each Tcl_O
6dd0: 62 6a 2a 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  bj* member of th
6de0: 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54  e array..**.** T
6df0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
6e00: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
6e10: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
6e20: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
6e30: 61 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79  a.** returned by
6e40: 20 70 53 74 6d 74 20 28 61 6e 64 20 68 65 6e 63   pStmt (and henc
6e50: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
6e60: 65 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 61 72  e *papColName ar
6e70: 72 61 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ray)..**.** If p
6e80: 41 72 72 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c  Array is not NUL
6e90: 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61  L, then it conta
6ea0: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
6eb0: 61 20 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76  a Tcl array.** v
6ec0: 61 72 69 61 62 6c 65 2e 20 54 68 65 20 22 2a 22  ariable. The "*"
6ed0: 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 69 73 20   member of this 
6ee0: 61 72 72 61 79 20 69 73 20 73 65 74 20 74 6f 20  array is set to 
6ef0: 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  a list containin
6f00: 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f  g.** the names o
6f10: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65  f the columns re
6f20: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 74  turned by the st
6f30: 61 74 65 6d 65 6e 74 2c 20 69 6e 20 6f 72 64 65  atement, in orde
6f40: 72 20 66 72 6f 6d 0a 2a 2a 20 6c 65 66 74 20 74  r from.** left t
6f50: 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66  o right. e.g. if
6f60: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
6f70: 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d  e returned colum
6f80: 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e 64 0a  ns are a, b and.
6f90: 2a 2a 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68  ** c, it does th
6fa0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
6fb0: 74 68 65 20 74 63 6c 20 63 6f 6d 6d 61 6e 64 3a  the tcl command:
6fc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74 20 24  .**.**     set $
6fd0: 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61 20 62  {pArray}(*) {a b
6fe0: 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   c}.*/.static in
6ff0: 74 0a 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e  t.computeColumnN
7000: 61 6d 65 73 28 0a 20 20 54 63 6c 5f 49 6e 74 65  ames(.  Tcl_Inte
7010: 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 73  rp *interp, .  s
7020: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
7030: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
7040: 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
7050: 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  t */.  Tcl_Obj *
7060: 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 2c 20 20 20  **papColName,   
7070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
7080: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
7090: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54 63 6c 5f   names */.  Tcl_
70a0: 4f 62 6a 20 2a 70 41 72 72 61 79 20 20 20 20 20  Obj *pArray     
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70c0: 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 76   Name of array v
70d0: 61 72 69 61 62 6c 65 20 28 6d 61 79 20 62 65 20  ariable (may be 
70e0: 6e 75 6c 6c 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  null) */.){.  in
70f0: 74 20 6e 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 43 6f  t nCol;..  /* Co
7100: 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  mpute column nam
7110: 65 73 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 73  es */.  nCol = s
7120: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
7130: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  unt(pStmt);.  if
7140: 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a  ( papColName ){.
7150: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54      int i;.    T
7160: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61  cl_Obj **apColNa
7170: 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29  me = (Tcl_Obj**)
7180: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
7190: 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c  f(Tcl_Obj*)*nCol
71a0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
71b0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
71c0: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
71d0: 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  ] = dbTextToObj(
71e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
71f0: 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
7200: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
7210: 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b  Count(apColName[
7220: 69 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  i]);.    }..    
7230: 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72  /* If results ar
7240: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69  e being stored i
7250: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61  n an array varia
7260: 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ble, then create
7270: 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61  .    ** the arra
7280: 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74  y(*) entry for t
7290: 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2f  hat array.    */
72a0: 0a 20 20 20 20 69 66 28 20 70 41 72 72 61 79 20  .    if( pArray 
72b0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  ){.      Tcl_Obj
72c0: 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c   *pColList = Tcl
72d0: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
72e0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20   Tcl_Obj *pStar 
72f0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
7300: 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 20 20 20  bj("*", -1);.   
7310: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
7320: 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20  unt(pColList);. 
7330: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7340: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7350: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
7360: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7370: 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61  erp, pColList, a
7380: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
7390: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
73a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74  IncrRefCount(pSt
73b0: 61 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  ar);.      Tcl_O
73c0: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
73d0: 2c 20 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c  , pArray, pStar,
73e0: 20 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20   pColList,0);.  
73f0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
7400: 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a  ount(pColList);.
7410: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
7420: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
7430: 20 20 20 7d 0a 20 20 20 20 2a 70 61 70 43 6f 6c     }.    *papCol
7440: 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65  Name = apColName
7450: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
7460: 6e 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  nCol;.}../*.** T
7470: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
7480: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
7490: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
74a0: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
74b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
74c0: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
74d0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
74e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
74f0: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
7500: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
7510: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
7520: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
7530: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
7540: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
7550: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
7560: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
7570: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
7580: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
7590: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
75a0: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
75b0: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
75c0: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
75d0: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
75e0: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
75f0: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
7600: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
7610: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
7620: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
7630: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
7640: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
7650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7660: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
7670: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
7680: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
7690: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
76a0: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
76b0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
76c0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
76d0: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
76e0: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
76f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
7700: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
7710: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
7720: 20 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 20       "busy",    
7730: 20 20 20 20 20 20 20 20 20 20 22 63 61 63 68 65            "cache
7740: 22 2c 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22  ",.    "changes"
7750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6c  ,            "cl
7760: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
7770: 20 20 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20    "collate",.   
7780: 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64   "collation_need
7790: 65 64 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68  ed",   "commit_h
77a0: 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d  ook",       "com
77b0: 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70  plete",.    "cop
77c0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
77d0: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
77e0: 78 74 65 6e 73 69 6f 6e 22 2c 22 65 72 72 6f 72  xtension","error
77f0: 63 6f 64 65 22 2c 0a 20 20 20 20 22 65 76 61 6c  code",.    "eval
7800: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7810: 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20 20   "exists",      
7820: 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22        "function"
7830: 2c 0a 20 20 20 20 22 69 6e 63 72 62 6c 6f 62 22  ,.    "incrblob"
7840: 2c 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 74  ,           "int
7850: 65 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20  errupt",        
7860: 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f   "last_insert_ro
7870: 77 69 64 22 2c 0a 20 20 20 20 22 6e 75 6c 6c 76  wid",.    "nullv
7880: 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20 20  alue",          
7890: 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20 20 20 20  "onecolumn",    
78a0: 20 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 0a       "profile",.
78b0: 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c 20      "progress", 
78c0: 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65 79            "rekey
78d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
78e0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a  rollback_hook",.
78f0: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20      "timeout",  
7900: 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c            "total
7910: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22  _changes",     "
7920: 74 72 61 63 65 22 2c 0a 20 20 20 20 22 74 72 61  trace",.    "tra
7930: 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  nsaction",      
7940: 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c    "update_hook",
7950: 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22         "version"
7960: 2c 0a 20 20 20 20 30 20 20 20 20 20 20 20 20 20  ,.    0         
7970: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b             .  };
7980: 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20  .  enum DB_enum 
7990: 7b 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49  {.    DB_AUTHORI
79a0: 5a 45 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42  ZER,        DB_B
79b0: 55 53 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  USY,            
79c0: 20 44 42 5f 43 41 43 48 45 2c 0a 20 20 20 20 44   DB_CACHE,.    D
79d0: 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20  B_CHANGES,      
79e0: 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20       DB_CLOSE,  
79f0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c            DB_COL
7a00: 4c 41 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c  LATE,.    DB_COL
7a10: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20  LATION_NEEDED,  
7a20: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20  DB_COMMIT_HOOK, 
7a30: 20 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45       DB_COMPLETE
7a40: 2c 0a 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20  ,.    DB_COPY,  
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45              DB_E
7a60: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
7a70: 53 49 4f 4e 2c 44 42 5f 45 52 52 4f 52 43 4f 44  SION,DB_ERRORCOD
7a80: 45 2c 0a 20 20 20 20 44 42 5f 45 56 41 4c 2c 20  E,.    DB_EVAL, 
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
7aa0: 45 58 49 53 54 53 2c 20 20 20 20 20 20 20 20 20  EXISTS,         
7ab0: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 0a 20    DB_FUNCTION,. 
7ac0: 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20     DB_INCRBLOB, 
7ad0: 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45           DB_INTE
7ae0: 52 52 55 50 54 2c 20 20 20 20 20 20 20 20 44 42  RRUPT,        DB
7af0: 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57  _LAST_INSERT_ROW
7b00: 49 44 2c 0a 20 20 20 20 44 42 5f 4e 55 4c 4c 56  ID,.    DB_NULLV
7b10: 41 4c 55 45 2c 20 20 20 20 20 20 20 20 20 44 42  ALUE,         DB
7b20: 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20  _ONECOLUMN,     
7b30: 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 0a 20     DB_PROFILE,. 
7b40: 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20     DB_PROGRESS, 
7b50: 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45           DB_REKE
7b60: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42  Y,            DB
7b70: 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a  _ROLLBACK_HOOK,.
7b80: 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20      DB_TIMEOUT, 
7b90: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54            DB_TOT
7ba0: 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 44  AL_CHANGES,    D
7bb0: 42 5f 54 52 41 43 45 2c 0a 20 20 20 20 44 42 5f  B_TRACE,.    DB_
7bc0: 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20  TRANSACTION,    
7bd0: 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f     DB_UPDATE_HOO
7be0: 4b 2c 20 20 20 20 20 20 44 42 5f 56 45 52 53 49  K,      DB_VERSI
7bf0: 4f 4e 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e  ON.  };.  /* don
7c00: 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e  't leave trailin
7c10: 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65  g commas on DB_e
7c20: 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73  num, it confuses
7c30: 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d   the AIX xlc com
7c40: 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20  piler */..  if( 
7c50: 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
7c60: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7c70: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7c80: 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  "SUBCOMMAND ..."
7c90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
7ca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
7cb0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
7cc0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
7cd0: 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c  bjv[1], DB_strs,
7ce0: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63   "option", 0, &c
7cf0: 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65  hoice) ){.    re
7d00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7d10: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28    }..  switch( (
7d20: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f  enum DB_enum)cho
7d30: 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20  ice ){..  /*    
7d40: 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f  $db authorizer ?
7d50: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
7d60: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
7d70: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f  iven callback to
7d80: 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20   authorize each 
7d90: 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  SQL operation as
7da0: 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70   it is.  ** comp
7db0: 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e  iled.  5 argumen
7dc0: 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20  ts are appended 
7dd0: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
7de0: 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a  before it is.  *
7df0: 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a  * invoked:.  **.
7e00: 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61    **   (1) The a
7e10: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
7e20: 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52  e (ex: SQLITE_CR
7e30: 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49  EATE_TABLE, SQLI
7e40: 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a  TE_INSERT, ...).
7e50: 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74    **   (2) First
7e60: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
7e70: 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75  e (depends on au
7e80: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
7e90: 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63  ).  **   (3) Sec
7ea0: 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20  ond descriptive 
7eb0: 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20  name.  **   (4) 
7ec0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
7ed0: 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  base (ex: "main"
7ee0: 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20  , "temp").  **  
7ef0: 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69   (5) Name of tri
7f00: 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69  gger that is doi
7f10: 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20  ng the access.  
7f20: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
7f30: 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75  back should retu
7f40: 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  rn on of the fol
7f50: 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20  lowing strings: 
7f60: 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20  SQLITE_OK,.  ** 
7f70: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f  SQLITE_IGNORE, o
7f80: 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20  r SQLITE_DENY.  
7f90: 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
7fa0: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72   value is an err
7fb0: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  or..  **.  ** If
7fc0: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   this method is 
7fd0: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20  invoked with no 
7fe0: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63  arguments, the c
7ff0: 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61  urrent authoriza
8000: 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61  tion.  ** callba
8010: 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74  ck string is ret
8020: 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  urned..  */.  ca
8030: 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52  se DB_AUTHORIZER
8040: 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
8050: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
8060: 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70  TION.    Tcl_App
8070: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8080: 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  , "authorization
8090: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
80a0: 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
80b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
80c0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
80d0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
80e0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
80f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8100: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
8110: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
8120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
8140: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
8150: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
8160: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
8170: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8180: 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29  , pDb->zAuth, 0)
8190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
81a0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
81b0: 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e  *zAuth;.      in
81c0: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
81d0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
81e0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
81f0: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20  pDb->zAuth);.   
8200: 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68     }.      zAuth
8210: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
8220: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
8230: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
8240: 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30  ( zAuth && len>0
8250: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
8260: 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c  >zAuth = Tcl_All
8270: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
8280: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
8290: 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c  b->zAuth, zAuth,
82a0: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
82b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
82c0: 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->zAuth = 0;.  
82d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
82e0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
82f0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
8300: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
8310: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
8320: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
8330: 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63  db, auth_callbac
8340: 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  k, pDb);.      }
8350: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8360: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
8370: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
8380: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
8390: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
83a0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
83b0: 20 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c    $db busy ?CALL
83c0: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
83d0: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
83e0: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20   callback if an 
83f0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74  SQL statement at
8400: 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20  tempts to open. 
8410: 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74   ** a locked dat
8420: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
8430: 0a 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a  .  case DB_BUSY:
8440: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
8450: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
8460: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8470: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41  rp, 2, objv, "CA
8480: 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20  LLBACK");.      
8490: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
84a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
84b0: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
84c0: 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
84d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
84e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
84f0: 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20  rp, pDb->zBusy, 
8500: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
8510: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
8520: 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20  r *zBusy;.      
8530: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
8540: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
8550: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
8560: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
8570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75       }.      zBu
8580: 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  sy = Tcl_GetStri
8590: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
85a0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
85b0: 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e  if( zBusy && len
85c0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
85d0: 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41  b->zBusy = Tcl_A
85e0: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
85f0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
8600: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73  pDb->zBusy, zBus
8610: 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  y, len+1);.     
8620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8630: 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a  pDb->zBusy = 0;.
8640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8650: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
8660: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
8670: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
8680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
8690: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
86a0: 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65  db, DbBusyHandle
86b0: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
86c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
86d0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
86e0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
86f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8700: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8710: 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61  .  /*     $db ca
8720: 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20  che flush.  **  
8730: 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a     $db cache siz
8740: 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c  e n.  **.  ** Fl
8750: 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64  ush the prepared
8760: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65   statement cache
8770: 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78  , or set the max
8780: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
8790: 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65   ** cached state
87a0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  ments..  */.  ca
87b0: 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20  se DB_CACHE: {. 
87c0: 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b     char *subCmd;
87d0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20  .    int n;..   
87e0: 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a   if( objc<=2 ){.
87f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
8800: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
8810: 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f  , objv, "cache o
8820: 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20  ption ?arg?");. 
8830: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8840: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8850: 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65   subCmd = Tcl_Ge
8860: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20  tStringFromObj( 
8870: 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20  objv[2], 0 );.  
8880: 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27    if( *subCmd=='
8890: 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62  f' && strcmp(sub
88a0: 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20  Cmd,"flush")==0 
88b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
88c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
88d0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
88e0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
88f0: 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20  , "flush");.    
8900: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8910: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
8920: 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  e{.        flush
8930: 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
8940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8950: 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d  lse if( *subCmd=
8960: 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73  ='s' && strcmp(s
8970: 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30  ubCmd,"size")==0
8980: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
8990: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  jc!=4 ){.       
89a0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
89b0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
89c0: 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20  v, "size n");.  
89d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
89e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
89f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
8a00: 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f   TCL_ERROR==Tcl_
8a10: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
8a20: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
8a30: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
8a40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8a50: 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  ( interp, "canno
8a60: 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a  t convert \"", .
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
8a80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8a90: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20  Obj(objv[3],0), 
8aa0: 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c  "\" to integer",
8ab0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   0);.          r
8ac0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8ad0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8ae0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c            if( n<
8af0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8b00: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
8b10: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20   pDb );.        
8b20: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
8b30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
8b40: 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54  >MAX_PREPARED_ST
8b50: 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MTS ){.         
8b60: 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41     n = MAX_PREPA
8b70: 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20  RED_STMTS;.     
8b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b90: 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20   pDb->maxStmt = 
8ba0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
8bb0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8bc0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
8bd0: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
8be0: 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c  "bad option \"",
8bf0: 20 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f   .          Tcl_
8c00: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8c10: 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22  (objv[2],0), "\"
8c20: 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20  : must be flush 
8c30: 6f 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20  or size", 0);.  
8c40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8c50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8c60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
8c70: 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73       $db changes
8c80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
8c90: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8ca0: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
8cb0: 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
8cc0: 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79  d, or deleted by
8cd0: 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72  .  ** the most r
8ce0: 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50  ecent INSERT, UP
8cf0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
8d00: 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e  tatement, not in
8d10: 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e  cluding .  ** an
8d20: 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  y changes made b
8d30: 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
8d40: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ms..  */.  case 
8d50: 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  DB_CHANGES: {.  
8d60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
8d70: 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
8d80: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
8d90: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8da0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
8db0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
8dc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8dd0: 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
8de0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
8df0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
8e00: 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
8e10: 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ult, sqlite3_cha
8e20: 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
8e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
8e40: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73    /*    $db clos
8e50: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74  e.  **.  ** Shut
8e60: 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73  down the databas
8e70: 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  e.  */.  case DB
8e80: 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63  _CLOSE: {.    Tc
8e90: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28  l_DeleteCommand(
8ea0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
8eb0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8ec0: 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62  v[0], 0));.    b
8ed0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
8ee0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
8ef0: 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54  late NAME SCRIPT
8f00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
8f10: 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c  e a new SQL coll
8f20: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63  ation function c
8f30: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
8f40: 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  never.  ** that 
8f50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
8f60: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
8f70: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
8f80: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
8f90: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41  .  case DB_COLLA
8fa0: 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c  TE: {.    SqlCol
8fb0: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a  late *pCollate;.
8fc0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
8fd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69  .    char *zScri
8fe0: 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72  pt;.    int nScr
8ff0: 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ipt;.    if( obj
9000: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
9010: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
9020: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
9030: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
9040: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9050: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9060: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
9070: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9080: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
9090: 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65  zScript = Tcl_Ge
90a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
90b0: 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74  bjv[3], &nScript
90c0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20  );.    pCollate 
90d0: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54  = (SqlCollate*)T
90e0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
90f0: 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53  (*pCollate) + nS
9100: 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20  cript + 1 );.   
9110: 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30   if( pCollate==0
9120: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9130: 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ROR;.    pCollat
9140: 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  e->interp = inte
9150: 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  rp;.    pCollate
9160: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
9170: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f  Collate;.    pCo
9180: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d  llate->zScript =
9190: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74   (char*)&pCollat
91a0: 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70  e[1];.    pDb->p
91b0: 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61  Collate = pColla
91c0: 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  te;.    memcpy(p
91d0: 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74  Collate->zScript
91e0: 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69  , zScript, nScri
91f0: 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73  pt+1);.    if( s
9200: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
9210: 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  llation(pDb->db,
9220: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55   zName, SQLITE_U
9230: 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43  TF8, .        pC
9240: 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f  ollate, tclSqlCo
9250: 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
9260: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
9270: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
9280: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
9290: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
92a0: 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ILE);.      retu
92b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
92c0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
92d0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
92e0: 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f    $db collation_
92f0: 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20  needed SCRIPT.  
9300: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
9310: 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
9320: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
9330: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
9340: 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
9350: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
9360: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
9370: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
9380: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
9390: 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  case DB_COLLATIO
93a0: 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20  N_NEEDED: {.    
93b0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
93c0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
93d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
93e0: 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
93f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
9400: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9410: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f      if( pDb->pCo
9420: 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
9430: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
9440: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
9450: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
9460: 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  }.    pDb->pColl
9470: 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f  ateNeeded = Tcl_
9480: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
9490: 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49  v[2]);.    Tcl_I
94a0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
94b0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
94c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
94d0: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70  llation_needed(p
94e0: 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c  Db->db, pDb, tcl
94f0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
9500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9510: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
9520: 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
9530: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
9540: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
9550: 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
9560: 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
9570: 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
9580: 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
9590: 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
95a0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
95b0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
95c0: 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
95d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
95e0: 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
95f0: 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
9600: 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
9610: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
9620: 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
9630: 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
9640: 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
9650: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
9660: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9670: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
9680: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
9690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
96a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
96b0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
96c0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
96d0: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
96e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
96f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
9700: 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20  >zCommit, 0);.  
9710: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
9720: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
9730: 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  mmit;.      int 
9740: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
9750: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
9760: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
9770: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
9780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f       }.      zCo
9790: 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  mmit = Tcl_GetSt
97a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
97b0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
97c0: 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26    if( zCommit &&
97d0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
97e0: 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d    pDb->zCommit =
97f0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
9800: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
9810: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d  emcpy(pDb->zComm
9820: 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e  it, zCommit, len
9830: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
9840: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
9850: 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  Commit = 0;.    
9860: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
9870: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  b->zCommit ){.  
9880: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
9890: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
98a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
98b0: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
98c0: 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72   DbCommitHandler
98d0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
98e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
98f0: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
9900: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
9910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
9930: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c   /*    $db compl
9940: 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a  ete SQL.  **.  *
9950: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
9960: 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65   SQL is a comple
9970: 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  te SQL statement
9980: 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
9990: 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e  if.  ** addition
99a0: 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75  al lines of inpu
99b0: 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54  t are needed.  T
99c0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
99d0: 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74  o the.  ** built
99e0: 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65  -in "info comple
99f0: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54  te" command of T
9a00: 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  cl..  */.  case 
9a10: 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23  DB_COMPLETE: {.#
9a20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9a30: 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20  IT_COMPLETE.    
9a40: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
9a50: 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70  ;.    int isComp
9a60: 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62  lete;.    if( ob
9a70: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
9a80: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9a90: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
9aa0: 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72   "SQL");.      r
9ab0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9ac0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d  .    }.    isCom
9ad0: 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  plete = sqlite3_
9ae0: 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65  complete( Tcl_Ge
9af0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9b00: 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20  bjv[2], 0) );.  
9b10: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
9b20: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
9b30: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
9b40: 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73  tBooleanObj(pRes
9b50: 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29  ult, isComplete)
9b60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  ;.#endif.    bre
9b70: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
9b80: 20 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69   $db copy confli
9b90: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62  ct-algorithm tab
9ba0: 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50  le filename ?SEP
9bb0: 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44  ARATOR? ?NULLIND
9bc0: 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a  ICATOR?.  **.  *
9bd0: 2a 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f  * Copy data into
9be0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65   table from file
9bf0: 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79  name, optionally
9c00: 20 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52   using SEPARATOR
9c10: 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20  .  ** as column 
9c20: 73 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20  separators.  If 
9c30: 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  a column contain
9c40: 73 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c  s a null string,
9c50: 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c   or the.  ** val
9c60: 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41  ue of NULLINDICA
9c70: 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69  TOR, a NULL is i
9c80: 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68 65 20  nserted for the 
9c90: 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e  column..  ** con
9ca0: 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
9cb0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71  is one of the sq
9cc0: 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c  lite conflict al
9cd0: 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20  gorithms:.  **  
9ce0: 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72    rollback, abor
9cf0: 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c  t, fail, ignore,
9d00: 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e   replace.  ** On
9d10: 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
9d20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
9d30: 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20  ines processed, 
9d40: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
9d50: 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62  same.  ** as 'db
9d60: 20 63 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f   changes' due to
9d70: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
9d80: 74 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20  thm selected..  
9d90: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64  **.  ** This cod
9da0: 65 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61  e is basically a
9db0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
9dc0: 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a  /enhancement of.
9dd0: 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
9de0: 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72   shell.c ".impor
9df0: 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a  t" command..  **
9e00: 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  .  ** This comma
9e10: 6e 64 20 75 73 61 67 65 20 69 73 20 65 71 75 69  nd usage is equi
9e20: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71  valent to the sq
9e30: 6c 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61  lite2.x COPY sta
9e40: 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69  tement,.  ** whi
9e50: 63 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20  ch imports file 
9e60: 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c  data into a tabl
9e70: 65 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74  e using the Post
9e80: 67 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65  greSQL COPY file
9e90: 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20   format:.  **   
9ea0: 24 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69  $db copy $confli
9eb0: 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61  t_algo $table_na
9ec0: 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20  me $filename \t 
9ed0: 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  \\N.  */.  case 
9ee0: 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63  DB_COPY: {.    c
9ef0: 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20  har *zTable;    
9f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9f10: 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
9f20: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  his table */.   
9f30: 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20   char *zFile;   
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9f50: 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68  The file from wh
9f60: 69 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 64  ich to extract d
9f70: 61 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ata */.    char 
9f80: 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20  *zConflict;     
9f90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
9fa0: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
9fb0: 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73   to use */.    s
9fc0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
9fd0: 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  mt;        /* A 
9fe0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
9ff0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a010: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
a020: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a040: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
a050: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
a060: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
a070: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a080: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a090: 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c   bytes in an SQL
a0a0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69   string */.    i
a0b0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
a0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a0d0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
a0e0: 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20     int nSep;    
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a100: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
a110: 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20  s in zSep[] */. 
a120: 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20     int nNull;   
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a140: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
a150: 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a  s in zNull[] */.
a160: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20      char *zSql; 
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d  /* An SQL statem
a190: 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ent */.    char 
a1a0: 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  *zLine;         
a1b0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
a1c0: 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74  le line of input
a1d0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a   from the file *
a1e0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43  /.    char **azC
a1f0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
a200: 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f    /* zLine[] bro
a210: 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75  ken up into colu
a220: 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  mns */.    char 
a230: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
a240: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
a250: 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20   commit changes 
a260: 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b  */.    FILE *in;
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
a290: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  file */.    int 
a2a0: 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20  lineno = 0;     
a2b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
a2c0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  number of input 
a2d0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
a2e0: 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20   zLineNum[80];  
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
a300: 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66  number print buf
a310: 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  fer */.    Tcl_O
a320: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20  bj *pResult;    
a330: 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70         /* interp
a340: 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20   result */..    
a350: 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20  char *zSep;.    
a360: 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20  char *zNull;.   
a370: 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f   if( objc<5 || o
a380: 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54  bjc>7 ){.      T
a390: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
a3a0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
a3b0: 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46   .         "CONF
a3c0: 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54  LICT-ALGORITHM T
a3d0: 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53  ABLE FILENAME ?S
a3e0: 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49  EPARATOR? ?NULLI
a3f0: 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20  NDICATOR?");.   
a400: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a410: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
a420: 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20  f( objc>=6 ){.  
a430: 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47      zSep = Tcl_G
a440: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a450: 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20  objv[5], 0);.   
a460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
a470: 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d  ep = "\t";.    }
a480: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37  .    if( objc>=7
a490: 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20   ){.      zNull 
a4a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
a4b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20  romObj(objv[6], 
a4c0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
a4d0: 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b       zNull = "";
a4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66  .    }.    zConf
a4f0: 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  lict = Tcl_GetSt
a500: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
a510: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61  [2], 0);.    zTa
a520: 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ble = Tcl_GetStr
a530: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
a540: 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c  3], 0);.    zFil
a550: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
a560: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d  gFromObj(objv[4]
a570: 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
a580: 20 73 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20   strlen(zSep);. 
a590: 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65     nNull = strle
a5a0: 6e 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66  n(zNull);.    if
a5b0: 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20  ( nSep==0 ){.   
a5c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a5d0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
a5e0: 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61  r: non-null sepa
a5f0: 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66  rator required f
a600: 6f 72 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20  or copy",0);.   
a610: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a620: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
a630: 66 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  f(sqlite3StrICmp
a640: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c  (zConflict, "rol
a650: 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a  lback") != 0 &&.
a660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
a670: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
a680: 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20   "abort"   ) != 
a690: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
a6a0: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
a6b0: 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20  lict, "fail"    
a6c0: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
a6d0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a6e0: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f  zConflict, "igno
a6f0: 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20  re"  ) != 0 &&. 
a700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
a710: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
a720: 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30  "replace" ) != 0
a730: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
a740: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a750: 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c  rp, "Error: \"",
a760: 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20   zConflict, .   
a770: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
a780: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
a790: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
a7a0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
a7b0: 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
a7c0: 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
a7d0: 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a  r replace", 0);.
a7e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
a7f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
a800: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
a810: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
a820: 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
a830: 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
a840: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
a850: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a860: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
a870: 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  : no such table:
a880: 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a   ", zTable, 0);.
a890: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
a8a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
a8b0: 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e    nByte = strlen
a8c0: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
a8d0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
a8e0: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
a8f0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
a900: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a910: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
a920: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
a930: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a940: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
a950: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
a960: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
a970: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
a980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
a990: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
a9a0: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
a9b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
a9c0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
a9d0: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
a9e0: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
a9f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
aa00: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
aa10: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
aa20: 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
aa30: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
aa40: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
aa50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
aa60: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
aa70: 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b  t malloc()", 0);
aa80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
aa90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
aaa0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
aab0: 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53  ntf(nByte+50, zS
aac0: 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25  ql, "INSERT OR %
aad0: 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55  q INTO '%q' VALU
aae0: 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20  ES(?",.         
aaf0: 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c  zConflict, zTabl
ab00: 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
ab10: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  en(zSql);.    fo
ab20: 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
ab30: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
ab40: 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
ab50: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
ab60: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
ab70: 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
ab80: 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
ab90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
aba0: 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
abb0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
abc0: 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  t, 0);.    free(
abd0: 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
abe0: 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
abf0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ac00: 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
ac10: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
ac20: 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
ac30: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
ac40: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
ac50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ac60: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20  R;.    }.    in 
ac70: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
ac80: 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
ac90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
aca0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
acb0: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
acc0: 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
acd0: 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  ", zFile, NULL);
ace0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
acf0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
ad00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ad10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
ad20: 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63    azCol = malloc
ad30: 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30  ( sizeof(azCol[0
ad40: 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20  ])*(nCol+1) );. 
ad50: 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
ad60: 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  ) {.      Tcl_Ap
ad70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ad80: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74  p, "Error: can't
ad90: 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a   malloc()", 0);.
ada0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
adb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
adc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
add0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
ade0: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
adf0: 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
ae00: 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d  );.    zCommit =
ae10: 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77   "COMMIT";.    w
ae20: 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c  hile( (zLine = l
ae30: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20  ocal_getline(0, 
ae40: 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  in))!=0 ){.     
ae50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
ae60: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e  i = 0;.      lin
ae70: 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43  eno++;.      azC
ae80: 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20  ol[0] = zLine;. 
ae90: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d       for(i=0, z=
aea0: 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  zLine; *z; z++){
aeb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d  .        if( *z=
aec0: 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e  =zSep[0] && strn
aed0: 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65  cmp(z, zSep, nSe
aee0: 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)==0 ){.       
aef0: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
af00: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
af10: 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29      if( i<nCol )
af20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
af30: 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70  Col[i] = &z[nSep
af40: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ];.            z
af50: 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20   += nSep-1;.    
af60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
af70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
af80: 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b  if( i+1!=nCol ){
af90: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
afa0: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Err;.        int
afb0: 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 28 7a   nErr = strlen(z
afc0: 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20  File) + 200;.   
afd0: 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c       zErr = mall
afe0: 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20  oc(nErr);.      
aff0: 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
b000: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b010: 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a  snprintf(nErr, z
b020: 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Err,.           
b030: 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e    "Error: %s lin
b040: 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
b050: 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
b060: 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c  a but found %d",
b070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  .             zF
b080: 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f  ile, lineno, nCo
b090: 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
b0a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b0b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
b0c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
b0d0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
b0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43      }.        zC
b0f0: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
b100: 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
b110: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
b120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
b130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b140: 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c  /* check for nul
b150: 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62  l data, if so, b
b160: 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20  ind as null */. 
b170: 20 20 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c         if ((nNul
b180: 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a  l>0 && strcmp(az
b190: 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d  Col[i], zNull)==
b1a0: 30 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43  0) || strlen(azC
b1b0: 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20  ol[i])==0) {.   
b1c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
b1d0: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
b1e0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  i+1);.        }e
b1f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
b200: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
b210: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43  (pStmt, i+1, azC
b220: 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  ol[i], -1, SQLIT
b230: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
b240: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b250: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
b260: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63  pStmt);.      rc
b270: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
b280: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66  (pStmt);.      f
b290: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
b2a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b2b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
b2c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b2d0: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22  interp,"Error: "
b2e0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
b2f0: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
b300: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
b310: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
b320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b330: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
b340: 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66  ee(azCol);.    f
b350: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73  close(in);.    s
b360: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
b370: 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69  pStmt);.    (voi
b380: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
b390: 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c  Db->db, zCommit,
b3a0: 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20   0, 0, 0);..    
b3b0: 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d  if( zCommit[0] =
b3c0: 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f  = 'C' ){.      /
b3d0: 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72  * success, set r
b3e0: 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20  esult as number 
b3f0: 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
b400: 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ed */.      pRes
b410: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
b420: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
b430: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74        Tcl_SetInt
b440: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e  Obj(pResult, lin
b450: 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eno);.      rc =
b460: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
b470: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69  se{.      /* fai
b480: 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e  lure, append lin
b490: 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64  eno where failed
b4a0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
b4b0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
b4c0: 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69  f(zLineNum), zLi
b4d0: 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e  neNum,"%d",linen
b4e0: 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  o);.      Tcl_Ap
b4f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b500: 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c  p,", failed whil
b510: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e  e processing lin
b520: 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29  e: ",zLineNum,0)
b530: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
b540: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
b550: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
b560: 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
b570: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
b580: 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a  sion BOOLEAN.  *
b590: 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20  *.  ** Turn the 
b5a0: 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e  extension loadin
b5b0: 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20  g feature on or 
b5c0: 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20  off.  It if off 
b5d0: 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e  by.  ** default.
b5e0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
b5f0: 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
b600: 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66  NSION: {.#ifndef
b610: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
b620: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
b630: 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69  int onoff;.    i
b640: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
b650: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
b660: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
b670: 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29  objv, "BOOLEAN")
b680: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
b690: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
b6a0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
b6b0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
b6c0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
b6d0: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20  onoff) ){.      
b6e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b6f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b700: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
b710: 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64  extension(pDb->d
b720: 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62  b, onoff);.    b
b730: 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20  reak;.#else.    
b740: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b750: 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73  (interp, "extens
b760: 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74  ion loading is t
b770: 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d  urned off at com
b780: 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20  pile-time",.    
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
b7b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69  TCL_ERROR;.#endi
b7c0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  f.  }..  /*.  **
b7d0: 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64      $db errorcod
b7e0: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  e.  **.  ** Retu
b7f0: 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65  rn the numeric e
b800: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77  rror code that w
b810: 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  as returned by t
b820: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20  he most recent. 
b830: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
b840: 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f  te3_exec()..  */
b850: 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52  .  case DB_ERROR
b860: 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  CODE: {.    Tcl_
b870: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b880: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b890: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  bj(sqlite3_errco
b8a0: 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  de(pDb->db)));. 
b8b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
b8c0: 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24   .  /*.  **    $
b8d0: 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72  db eval $sql ?ar
b8e0: 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65  ray? ?{  ...code
b8f0: 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24  ... }?.  **    $
b900: 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71  db onecolumn $sq
b910: 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  l.  **.  ** The 
b920: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
b930: 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74   $sql is evaluat
b940: 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f  ed.  For each ro
b950: 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  w, the values ar
b960: 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e  e.  ** placed in
b970: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
b980: 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72   array named "ar
b990: 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65  ray" and ...code
b9a0: 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e  ... is executed.
b9b0: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
b9c0: 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20   and "code" are 
b9d0: 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f  omitted, then no
b9e0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65   callback is eve
b9f0: 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a  ry invoked..  **
ba00: 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61   If "array" is a
ba10: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
ba20: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20  then the values 
ba30: 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61  are placed in va
ba40: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61  riables.  ** tha
ba50: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
ba60: 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c  name as the fiel
ba70: 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ds extracted by 
ba80: 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  the query..  **.
ba90: 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75    ** The onecolu
baa0: 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65  mn method is the
bab0: 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a   equivalent of:.
bac0: 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20    **     lindex 
bad0: 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20  [$db eval $sql] 
bae0: 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  0.  */.  case DB
baf0: 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61  _ONECOLUMN:.  ca
bb00: 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20 63 61  se DB_EVAL:.  ca
bb10: 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20 7b 0a  se DB_EXISTS: {.
bb20: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
bb30: 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65  zSql;      /* Ne
bb40: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
bb50: 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20   to execute */. 
bb60: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
bb70: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57 68 61  Left;     /* Wha
bb80: 74 20 69 73 20 6c 65 66 74 20 61 66 74 65 72 20  t is left after 
bb90: 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20 7a 53  first stmt in zS
bba0: 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ql */.    sqlite
bbb0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
bbc0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c   /* Compiled SQL
bbd0: 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20   statment */.   
bbe0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
bbf0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
bc00: 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20 77 68  of array into wh
bc10: 69 63 68 20 72 65 73 75 6c 74 73 20 61 72 65 20  ich results are 
bc20: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54  written */.    T
bc30: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
bc40: 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20        /* Script 
bc50: 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20  to run for each 
bc60: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
bc70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61    Tcl_Obj **apPa
bc80: 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 61  rm;      /* Para
bc90: 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65 65 64  meters that need
bca0: 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   a Tcl_DecrRefCo
bcb0: 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  unt() */.    int
bcc0: 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20   nParm;         
bcd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bce0: 20 65 6e 74 72 69 65 73 20 75 73 65 64 20 69 6e   entries used in
bcf0: 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20   apParm[] */.   
bd00: 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b   Tcl_Obj *aParm[
bd10: 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74 69  10];    /* Stati
bd20: 63 20 73 70 61 63 65 20 66 6f 72 20 61 70 50 61  c space for apPa
bd30: 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d  rm[] in the comm
bd40: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 54  on case */.    T
bd50: 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20  cl_Obj *pRet;   
bd60: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
bd70: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f  o be returned */
bd80: 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64  .    SqlPrepared
bd90: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20  Stmt *pPreStmt; 
bda0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
bdb0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
bdc0: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ent */.    int r
bdd0: 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63 68 6f  c2;..    if( cho
bde0: 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29 7b 0a  ice==DB_EVAL ){.
bdf0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33        if( objc<3
be00: 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20   || objc>5 ){.  
be10: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
be20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
be30: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52  , objv, "SQL ?AR
be40: 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50  RAY-NAME? ?SCRIP
be50: 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  T?");.        re
be60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
be70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
be80: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
be90: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
bea0: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
beb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bec0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
bed0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
bee0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
bef0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22  , 2, objv, "SQL"
bf00: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
bf10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
bf20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
bf30: 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53  hoice==DB_EXISTS
bf40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74   ){.        pRet
bf50: 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61   = Tcl_NewBoolea
bf60: 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20 20 20  nObj(0);.       
bf70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
bf80: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d  t(pRet);.      }
bf90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 52  else{.        pR
bfa0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
bfb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
bfc0: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70  jc==3 ){.      p
bfd0: 41 72 72 61 79 20 3d 20 70 53 63 72 69 70 74 20  Array = pScript 
bfe0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
bff0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
c000: 20 20 20 20 70 41 72 72 61 79 20 3d 20 30 3b 0a      pArray = 0;.
c010: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
c020: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c  objv[3];.    }el
c030: 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79  se{.      pArray
c040: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
c050: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53 74 72    if( Tcl_GetStr
c060: 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d 3d 3d  ing(pArray)[0]==
c070: 30 20 29 20 70 41 72 72 61 79 20 3d 20 30 3b 0a  0 ) pArray = 0;.
c080: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
c090: 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a  objv[4];.    }..
c0a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
c0b0: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ount(objv[2]);. 
c0c0: 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65     zSql = Tcl_Ge
c0d0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
c0e0: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
c0f0: 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f  while( rc==TCL_O
c100: 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a  K && zSql[0] ){.
c110: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c140: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
c150: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
c160: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c170: 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72  f bind parameter
c180: 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74 20 2a  s in the pStmt *
c190: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  /.      int nCol
c1a0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
c1b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c1c0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
c1d0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
c1e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
c1f0: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 2f 2a  olName = 0;   /*
c200: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
c210: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20   names */.      
c220: 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  int len;        
c230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
c240: 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66 20 7a  ring length of z
c250: 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20  Sql */.  .      
c260: 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
c270: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
c280: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
c290: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 6e  been compiled an
c2a0: 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68  d.      ** which
c2b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 65 78   matches the nex
c2c0: 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20 53 51  t sequence of SQ
c2d0: 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  L..      */.    
c2e0: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
c2f0: 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28     len = strlen(
c300: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72  zSql);.      for
c310: 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d  (pPreStmt = pDb-
c320: 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53  >stmtList; pPreS
c330: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
c340: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
c350: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
c360: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a  pPreStmt->nSql;.
c370: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
c380: 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =n .            
c390: 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74  && memcmp(pPreSt
c3a0: 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  mt->zSql, zSql, 
c3b0: 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
c3c0: 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30    && (zSql[n]==0
c3d0: 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27   || zSql[n-1]=='
c3e0: 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ;').        ){. 
c3f0: 20 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d           pStmt =
c400: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
c410: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65 66  ;.          zLef
c420: 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74  t = &zSql[pPreSt
c430: 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20  mt->nSql];..    
c440: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20        /* When a 
c450: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
c460: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c  nt is found, unl
c470: 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ink it from the.
c480: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63            ** cac
c490: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
c4a0: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
c4b0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
c4c0: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  inning.         
c4d0: 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65   ** of the cache
c4e0: 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74   list in order t
c4f0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20  o implement LRU 
c500: 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20  replacement..   
c510: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c520: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
c530: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
c540: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
c550: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
c560: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
c570: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
c580: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
c590: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
c5a0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
c5b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c5c0: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
c5d0: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
c5e0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
c5f0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
c600: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
c610: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
c620: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
c630: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
c640: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
c650: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c660: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
c670: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  --;.          br
c680: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
c690: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
c6a0: 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65  /* If no prepare
c6b0: 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  d statement was 
c6c0: 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20  found.  Compile 
c6d0: 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20 20  the SQL text.   
c6e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c6f0: 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pStmt==0 ){.    
c700: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
c710: 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61  K!=sqlite3_prepa
c720: 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a  re_v2(pDb->db, z
c730: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
c740: 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20 20   &zLeft) ){.    
c750: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
c760: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
c770: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
c780: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
c790: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b)));.          
c7a0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
c7b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c7c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c7d0: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
c7e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
c7f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
c800: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
c810: 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >db) ){.        
c820: 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65      /* A compile
c830: 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74  -time error in t
c840: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  he statement.   
c850: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
c860: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
c870: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
c880: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
c890: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
c8a0: 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >db)));.        
c8b0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
c8c0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
c8d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
c8e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c8f0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
c900: 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70  ment was a no-op
c910: 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74  .  Continue to t
c920: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
c930: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
c940: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69   in the SQL stri
c950: 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng..            
c960: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  */.            z
c970: 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20  Sql = zLeft;.   
c980: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
c990: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
c9a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c9b0: 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d   assert( pPreStm
c9c0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  t==0 );.      }.
c9d0: 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 76  .      /* Bind v
c9e0: 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74  alues to paramet
c9f0: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
ca00: 69 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20 20  ith $ or :.     
ca10: 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61 72   */  .      nVar
ca20: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
ca30: 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
ca40: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50  pStmt);.      nP
ca50: 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  arm = 0;.      i
ca60: 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61  f( nVar>sizeof(a
ca70: 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61  Parm)/sizeof(aPa
ca80: 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  rm[0]) ){.      
ca90: 20 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f    apParm = (Tcl_
caa0: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
cab0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50 61  nVar*sizeof(apPa
cac0: 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d  rm[0]));.      }
cad0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70  else{.        ap
cae0: 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20  Parm = aParm;.  
caf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
cb00: 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b  i=1; i<=nVar; i+
cb10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
cb20: 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73  t char *zVar = s
cb30: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
cb40: 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74  meter_name(pStmt
cb50: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
cb60: 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56  ( zVar!=0 && (zV
cb70: 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56  ar[0]=='$' || zV
cb80: 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56  ar[0]==':' || zV
cb90: 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20  ar[0]=='@') ){. 
cba0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a           Tcl_Obj
cbb0: 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74   *pVar = Tcl_Get
cbc0: 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26  Var2Ex(interp, &
cbd0: 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a  zVar[1], 0, 0);.
cbe0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 56            if( pV
cbf0: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ar ){.          
cc00: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
cc10: 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20       u8 *data;. 
cc20: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
cc30: 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74  *zType = pVar->t
cc40: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
cc50: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
cc60: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ";.            c
cc70: 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d  har c = zType[0]
cc80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
cc90: 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c  ( zVar[0]=='@' |
cca0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
ccb0: 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63   (c=='b' && strc
ccc0: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
ccd0: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
cce0: 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20  ->bytes==0) ){. 
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd00: 4c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65  Load a BLOB type
cd10: 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69   if the Tcl vari
cd20: 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72  able is a bytear
cd30: 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ray and.        
cd40: 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
cd50: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
cd60: 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68 65 20  entation or the 
cd70: 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  host.           
cd80: 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
cd90: 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
cda0: 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20   "@". */.       
cdb0: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63         data = Tc
cdc0: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
cdd0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
cde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
cdf0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
ce00: 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c  (pStmt, i, data,
ce10: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
ce20: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
ce30: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
ce40: 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20  nt(pVar);.      
ce50: 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b 6e          apParm[n
ce60: 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a  Parm++] = pVar;.
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
ce80: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
ce90: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
cea0: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
cec0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
ced0: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b  terp, pVar, &n);
cee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
cef0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
cf00: 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20  pStmt, i, n);.  
cf10: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
cf20: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
cf30: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
cf40: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
cf50: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
cf60: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
cf70: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
cf80: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
cf90: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20  ar, &r);.       
cfa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
cfb0: 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  ind_double(pStmt
cfc0: 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  , i, r);.       
cfd0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
cfe0: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
cff0: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
d000: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
d010: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
d020: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
d030: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
d040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
d050: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
d060: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
d070: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
d080: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
d090: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &v);.           
d0a0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
d0b0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20  int64(pStmt, i, 
d0c0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
d0d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d0e0: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
d0f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
d100: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
d110: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
d120: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d130: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
d140: 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29 64  mt, i, (char *)d
d150: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
d160: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
d170: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
d180: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
d190: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
d1a0: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
d1b0: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
d1c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
d1d0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
d1e0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
d1f0: 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a 20 20  ( pStmt, i );.  
d200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d210: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
d220: 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68     /* Execute th
d230: 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20  e SQL.      */. 
d240: 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
d250: 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20  TCL_OK && pStmt 
d260: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
d270: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
d280: 74 29 20 29 7b 0a 0a 09 2f 2a 20 43 6f 6d 70 75  t) ){.../* Compu
d290: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  te column names.
d2a0: 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
d2b0: 6e 65 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ne after the fir
d2c0: 73 74 20 73 75 63 63 65 73 73 66 75 6c 0a 09 2a  st successful..*
d2d0: 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
d2e0: 33 5f 73 74 65 70 28 29 2c 20 69 6e 20 63 61 73  3_step(), in cas
d2f0: 65 20 74 68 65 20 71 75 65 72 79 20 69 73 20 72  e the query is r
d300: 65 63 6f 6d 70 69 6c 65 64 20 61 6e 64 20 74 68  ecompiled and th
d310: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
d320: 62 65 72 20 6f 72 20 6e 61 6d 65 73 20 6f 66 20  ber or names of 
d330: 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c  the returned col
d340: 75 6d 6e 73 20 63 68 61 6e 67 65 73 2e 20 0a 20  umns changes. . 
d350: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
d360: 20 20 61 73 73 65 72 74 28 21 70 41 72 72 61 79    assert(!pArray
d370: 7c 7c 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  ||pScript);.    
d380: 20 20 20 20 69 66 20 28 6e 43 6f 6c 20 3c 20 30      if (nCol < 0
d390: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  ) {.          Tc
d3a0: 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20 3d 20 28 70  l_Obj ***ap = (p
d3b0: 53 63 72 69 70 74 3f 26 61 70 43 6f 6c 4e 61 6d  Script?&apColNam
d3c0: 65 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e:0);.          
d3d0: 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75 74 65 43 6f  nCol = computeCo
d3e0: 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e 74 65 72 70  lumnNames(interp
d3f0: 2c 20 70 53 74 6d 74 2c 20 61 70 2c 20 70 41 72  , pStmt, ap, pAr
d400: 72 61 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ray);.        }.
d410: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
d420: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
d430: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
d440: 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20  j *pVal;.       
d450: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a     .          /*
d460: 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e   Set pVal to con
d470: 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f  tain the i'th co
d480: 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77  lumn of this row
d490: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
d4a0: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
d4b0: 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
d4c0: 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , i) ){.        
d4d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d4e0: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
d4f0: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
d500: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
d510: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 29  _bytes(pStmt, i)
d520: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d530: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pVal = Tcl_NewBy
d540: 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74  teArrayObj(sqlit
d550: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
d560: 53 74 6d 74 2c 20 69 29 2c 20 62 79 74 65 73 29  Stmt, i), bytes)
d570: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
d590: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
d5a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
d5b0: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGER: {.        
d5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74        sqlite_int
d5d0: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63  64 v = sqlite3_c
d5e0: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
d5f0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
d600: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
d610: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
d620: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
d630: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
d640: 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a   = Tcl_NewIntObj
d650: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d670: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
d680: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
d690: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
d6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d6b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d6c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d6d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
d6e0: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
d6f0: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
d700: 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
d710: 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
d720: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
d730: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
d740: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
d760: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
d770: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  }.            ca
d780: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
d790: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d7a0: 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f  pVal = dbTextToO
d7b0: 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  bj(pDb->zNull);.
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
d7d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
d7e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   }.            d
d7f0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
d800: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64          pVal = d
d810: 62 54 65 78 74 54 6f 4f 62 6a 28 28 63 68 61 72  bTextToObj((char
d820: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
d830: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29  n_text(pStmt, i)
d840: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d860: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d870: 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 69  }.  .          i
d880: 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20  f( pScript ){.  
d890: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
d8a0: 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rray==0 ){.     
d8b0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a           Tcl_Obj
d8c0: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
d8d0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c  apColName[i], 0,
d8e0: 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20   pVal, 0);.     
d8f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
d910: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
d920: 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43 6f 6c  p, pArray, apCol
d930: 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20 30  Name[i], pVal, 0
d940: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
d950: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
d960: 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
d970: 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  ONECOLUMN ){.   
d980: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
d990: 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20   pRet==0 );.    
d9a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 74          if( pRet
d9b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
d9c0: 20 20 20 20 20 70 52 65 74 20 3d 20 70 56 61 6c       pRet = pVal
d9d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d9e0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
d9f0: 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  (pRet);.        
da00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
da10: 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b    rc = TCL_BREAK
da20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 20  ;.            i 
da30: 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = nCol;.        
da40: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69    }else if( choi
da50: 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20 29 7b  ce==DB_EXISTS ){
da60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
da70: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
da80: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
da90: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42   pRet = Tcl_NewB
daa0: 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 3b 0a 20 20  ooleanObj(1);.  
dab0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
dac0: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
dad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
dae0: 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20   = TCL_BREAK;.  
daf0: 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43            i = nC
db00: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ol;.          }e
db10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
db20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
db30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
db40: 2c 20 70 52 65 74 2c 20 70 56 61 6c 29 3b 0a 20  , pRet, pVal);. 
db50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
db60: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
db70: 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20  if( pScript ){. 
db80: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 63           rc = Tc
db90: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
dba0: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
dbb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
dbc0: 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 20  c==TCL_CONTINUE 
dbd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
dbe0: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
dbf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dc00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
dc10: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
dc20: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
dc30: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20  = TCL_OK;.      
dc40: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  }..      /* Free
dc50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
dc60: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20   objects */.    
dc70: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
dc80: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
dc90: 68 65 20 71 75 65 72 79 20 72 65 74 75 72 6e 65  he query returne
dca0: 64 20 6e 6f 20 72 6f 77 73 2c 20 62 75 74 20 61  d no rows, but a
dcb0: 6e 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  n array variable
dcc0: 20 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   was .        **
dcd0: 20 73 70 65 63 69 66 69 65 64 2c 20 63 61 6c 6c   specified, call
dce0: 20 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61   computeColumnNa
dcf0: 6d 65 73 28 29 20 6e 6f 77 20 74 6f 20 70 6f 70  mes() now to pop
dd00: 75 6c 61 74 65 20 74 68 65 20 0a 20 20 20 20 20  ulate the .     
dd10: 20 20 20 2a 2a 20 61 72 72 61 79 6e 61 6d 65 28     ** arrayname(
dd20: 2a 29 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20  *) variable..   
dd30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
dd40: 69 66 20 28 70 41 72 72 61 79 20 26 26 20 6e 43  if (pArray && nC
dd50: 6f 6c 20 3c 20 30 29 20 7b 0a 20 20 20 20 20 20  ol < 0) {.      
dd60: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 61      Tcl_Obj ***a
dd70: 70 20 3d 20 28 70 53 63 72 69 70 74 3f 26 61 70  p = (pScript?&ap
dd80: 43 6f 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20 20 20  ColName:0);.    
dd90: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 63 6f 6d        nCol = com
dda0: 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  puteColumnNames(
ddb0: 69 6e 74 65 72 70 2c 20 70 53 74 6d 74 2c 20 61  interp, pStmt, a
ddc0: 70 2c 20 70 41 72 72 61 79 29 3b 0a 20 20 20 20  p, pArray);.    
ddd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
dde0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
ddf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
de00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
de10: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
de20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de30: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
de40: 29 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  )apColName);.   
de50: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
de60: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
de70: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
de80: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
de90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61    for(i=0; i<nPa
dea0: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
deb0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
dec0: 6e 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20  nt(apParm[i]);. 
ded0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dee0: 20 61 70 50 61 72 6d 21 3d 61 50 61 72 6d 20 29   apParm!=aParm )
def0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
df00: 65 65 28 28 63 68 61 72 2a 29 61 70 50 61 72 6d  ee((char*)apParm
df10: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
df20: 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 73    /* Reset the s
df30: 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 74 68  tatement.  If th
df40: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 69 73  e result code is
df50: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20   SQLITE_SCHEMA, 
df60: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c  then.      ** fl
df70: 75 73 68 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ush the statemen
df80: 74 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20  t cache and try 
df90: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 67  the statement ag
dfa0: 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ain..      */.  
dfb0: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
dfc0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
dfd0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
dfe0: 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20 20 20  _OK!=rc2 ){.    
dff0: 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75 6e 2d      /* If a run-
e000: 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72  time error occur
e010: 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65 72  s, report the er
e020: 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72 65 61  ror and stop rea
e030: 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
e040: 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20 20 20  the SQL.        
e050: 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  */.        Tcl_S
e060: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
e070: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
e080: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
e090: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20  Db->db)));.     
e0a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
e0b0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
e0c0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
e0d0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OR;.        if( 
e0e0: 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46  pPreStmt ) Tcl_F
e0f0: 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65 53  ree((char*)pPreS
e100: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  tmt);.        br
e110: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
e120: 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74 6d   if( pDb->maxStm
e130: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t<=0 ){.        
e140: 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
e150: 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64  is turned off, d
e160: 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73  eallocated the s
e170: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
e180: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
e190: 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61   ) Tcl_Free((cha
e1a0: 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  r*)pPreStmt);.  
e1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
e1c0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
e1d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e1e0: 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68 69 6e      /* Everythin
e1f0: 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74 68 65  g worked and the
e200: 20 63 61 63 68 65 20 69 73 20 6f 70 65 72 61 74   cache is operat
e210: 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a  ional..        *
e220: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
e230: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 73  qlPreparedStmt s
e240: 74 72 75 63 74 75 72 65 20 69 66 20 77 65 20 6e  tructure if we n
e250: 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20 20 20  eed one..       
e260: 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72 65 61   ** (If we alrea
e270: 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65 20 63  dy have one we c
e280: 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20 69 74  an just reuse it
e290: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .).        */.  
e2a0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
e2b0: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt==0 ){.       
e2c0: 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74 20 2d     len = zLeft -
e2d0: 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 20   zSql;.         
e2e0: 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c   pPreStmt = (Sql
e2f0: 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63  PreparedStmt*)Tc
e300: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
e310: 2a 70 50 72 65 53 74 6d 74 29 20 29 3b 0a 20 20  *pPreStmt) );.  
e320: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
e330: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
e340: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e350: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
e360: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
e370: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
e380: 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20  t->nSql = len;. 
e390: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
e3a0: 74 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  t->zSql = sqlite
e3b0: 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
e3c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e3d0: 73 74 72 6c 65 6e 28 70 50 72 65 53 74 6d 74 2d  strlen(pPreStmt-
e3e0: 3e 7a 53 71 6c 29 3d 3d 6c 65 6e 20 29 3b 0a 20  >zSql)==len );. 
e3f0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
e400: 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72 65 53   0==memcmp(pPreS
e410: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
e420: 20 6c 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 20   len) );.       
e430: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
e440: 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64 20  dd the prepared 
e450: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
e460: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
e470: 65 20 63 61 63 68 65 20 6c 69 73 74 0a 20 20 20  e cache list.   
e480: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
e490: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20  pPreStmt->pNext 
e4a0: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
e4b0: 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d  .        pPreStm
e4c0: 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  t->pPrev = 0;.  
e4d0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73        if( pDb->s
e4e0: 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  tmtList ){.     
e4f0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
e500: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
e510: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tmt;.        }. 
e520: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
e530: 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b  List = pPreStmt;
e540: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62  .        if( pDb
e550: 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b  ->stmtLast==0 ){
e560: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
e570: 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30  t( pDb->nStmt==0
e580: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44   );.          pD
e590: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50  b->stmtLast = pP
e5a0: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  reStmt;.        
e5b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e5c0: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
e5d0: 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  tmt>0 );.       
e5e0: 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e   }.        pDb->
e5f0: 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20  nStmt++;.   .   
e600: 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61       /* If we ha
e610: 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74  ve too many stat
e620: 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20  ement in cache, 
e630: 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c  remove the surpl
e640: 75 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  us from the.    
e650: 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
e660: 65 20 63 61 63 68 65 20 6c 69 73 74 2e 0a 20 20  e cache list..  
e670: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e680: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74   while( pDb->nSt
e690: 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20  mt>pDb->maxStmt 
e6a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e6b0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44  ite3_finalize(pD
e6c0: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74  b->stmtLast->pSt
e6d0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
e6e0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
e6f0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50  Db->stmtLast->pP
e700: 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54  rev;.          T
e710: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
e720: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e  Db->stmtLast->pN
e730: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ext);.          
e740: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
e750: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
e760: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
e770: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e780: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72    }..      /* Pr
e790: 6f 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78  oceed to the nex
e7a0: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  t statement */. 
e7b0: 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
e7c0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  t;.    }.    Tcl
e7d0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62  _DecrRefCount(ob
e7e0: 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28  jv[2]);..    if(
e7f0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
e800: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
e810: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
e820: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
e830: 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d  , pRet);.      }
e840: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
e850: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
e860: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
e870: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
e880: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
e890: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a  (interp);.    }.
e8a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
e8b0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
e8c0: 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20  b function NAME 
e8d0: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
e8e0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
e8f0: 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  L function calle
e900: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
e910: 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  r that function 
e920: 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20  is.  ** called, 
e930: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
e940: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
e950: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
e960: 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a  ase DB_FUNCTION:
e970: 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a   {.    SqlFunc *
e980: 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f  pFunc;.    Tcl_O
e990: 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20  bj *pScript;.   
e9a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
e9b0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
e9c0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
e9d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e9e0: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
e9f0: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
ea00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ea10: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
ea20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
ea30: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
ea40: 20 30 29 3b 0a 20 20 20 20 70 53 63 72 69 70 74   0);.    pScript
ea50: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
ea60: 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46  pFunc = findSqlF
ea70: 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b  unc(pDb, zName);
ea80: 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d  .    if( pFunc==
ea90: 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
eaa0: 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46  RROR;.    if( pF
eab0: 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a  unc->pScript ){.
eac0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
ead0: 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53  fCount(pFunc->pS
eae0: 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20  cript);.    }.  
eaf0: 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74    pFunc->pScript
eb00: 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20   = pScript;.    
eb10: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
eb20: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  (pScript);.    p
eb30: 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a  Func->useEvalObj
eb40: 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61  v = safeToUseEva
eb50: 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53  lObjv(interp, pS
eb60: 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d  cript);.    rc =
eb70: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
eb80: 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62  function(pDb->db
eb90: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
eba0: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
ebb0: 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46    pFunc, tclSqlF
ebc0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
ebd0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ebe0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
ebf0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
ec00: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
ec10: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
ec20: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
ec30: 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41  b->db), TCL_VOLA
ec40: 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  TILE);.    }.   
ec50: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
ec60: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69  *.  **     $db i
ec70: 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e  ncrblob ?-readon
ec80: 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43  ly? ?DB? TABLE C
ec90: 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f  OLUMN ROWID.  */
eca0: 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42  .  case DB_INCRB
ecb0: 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  LOB: {.#ifdef SQ
ecc0: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
ecd0: 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  OB.    Tcl_Appen
ece0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ecf0: 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76  "incrblob not av
ed00: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20  ailable in this 
ed10: 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20  build", 0);.    
ed20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ed30: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20  ;.#else.    int 
ed40: 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a  isReadonly = 0;.
ed50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ed60: 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
ed70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ed80: 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
ed90: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20  char *zColumn;. 
eda0: 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20     sqlite_int64 
edb0: 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  iRow;..    /* Ch
edc0: 65 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65 61  eck for the -rea
edd0: 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a  donly option */.
ede0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 26      if( objc>3 &
edf0: 26 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74  & strcmp(Tcl_Get
ee00: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
ee10: 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
ee20: 20 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61 64   ){.      isRead
ee30: 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  only = 1;.    }.
ee40: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 28  .    if( objc!=(
ee50: 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26  5+isReadonly) &&
ee60: 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61 64   objc!=(6+isRead
ee70: 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 54  only) ){.      T
ee80: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
ee90: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
eea0: 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44   "?-readonly? ?D
eeb0: 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20  B? TABLE COLUMN 
eec0: 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20 72  ROWID");.      r
eed0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
eee0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
eef0: 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f  objc==(6+isReado
ef00: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 44  nly) ){.      zD
ef10: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
ef20: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
ef30: 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54  }.    zTable = T
ef40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ef50: 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20  v[objc-3]);.    
ef60: 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65  zColumn = Tcl_Ge
ef70: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
ef80: 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  c-2]);.    rc = 
ef90: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
efa0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
efb0: 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f  jv[objc-1], &iRo
efc0: 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  w);..    if( rc=
efd0: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
efe0: 20 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63 72   rc = createIncr
eff0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20  blobChannel(.   
f000: 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 70         interp, p
f010: 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c  Db, zDb, zTable,
f020: 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20   zColumn, iRow, 
f030: 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20  isReadonly.     
f040: 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
f050: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f060: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
f070: 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a  db interrupt.  *
f080: 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74  *.  ** Interrupt
f090: 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f   the execution o
f0a0: 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  f the inner-most
f0b0: 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72   SQL interpreter
f0c0: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75  .  This.  ** cau
f0d0: 73 65 73 20 74 68 65 20 53 51 4c 20 73 74 61 74  ses the SQL stat
f0e0: 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20  ement to return 
f0f0: 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49  an error of SQLI
f100: 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20  TE_INTERRUPT..  
f110: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54  */.  case DB_INT
f120: 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71  ERRUPT: {.    sq
f130: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
f140: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72  pDb->db);.    br
f150: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
f160: 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c   **     $db null
f170: 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20  value ?STRING?. 
f180: 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20   **.  ** Change 
f190: 74 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61  text used when a
f1a0: 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b   NULL comes back
f1b0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
f1c0: 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a  se. If ?STRING?.
f1d0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73    ** is not pres
f1e0: 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ent, then the cu
f1f0: 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65  rrent string use
f200: 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65  d for NULL is re
f210: 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20  turned..  ** If 
f220: 53 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e  STRING is presen
f230: 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69  t, then STRING i
f240: 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
f250: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
f260: 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20  NULLVALUE: {.   
f270: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
f280: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
f290: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f2a0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
f2b0: 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b  v, "NULLVALUE");
f2c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f2d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
f2e0: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
f2f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  {.      int len;
f300: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  .      char *zNu
f310: 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ll = Tcl_GetStri
f320: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
f330: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
f340: 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29  if( pDb->zNull )
f350: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
f360: 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  ee(pDb->zNull);.
f370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f380: 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30  ( zNull && len>0
f390: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
f3a0: 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c  >zNull = Tcl_All
f3b0: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
f3c0: 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 70         strncpy(p
f3d0: 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c  Db->zNull, zNull
f3e0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  , len);.        
f3f0: 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20  pDb->zNull[len] 
f400: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65  = '\0';.      }e
f410: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
f420: 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  ->zNull = 0;.   
f430: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54     }.    }.    T
f440: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
f450: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
f460: 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29  Obj(pDb->zNull))
f470: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
f480: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
f490: 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  $db last_insert_
f4a0: 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rowid .  **.  **
f4b0: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
f4c0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
f4d0: 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f  ROWID for the mo
f4e0: 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74  st recent insert
f4f0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
f500: 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57  _LAST_INSERT_ROW
f510: 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ID: {.    Tcl_Ob
f520: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
f530: 54 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69  Tcl_WideInt rowi
f540: 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  d;.    if( objc!
f550: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
f560: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f570: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
f580: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f590: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f5a0: 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c  .    rowid = sql
f5b0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
f5c0: 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b  _rowid(pDb->db);
f5d0: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
f5e0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
f5f0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
f600: 5f 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70  _SetWideIntObj(p
f610: 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a  Result, rowid);.
f620: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f630: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42    /*.  ** The DB
f640: 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f  _ONECOLUMN metho
f650: 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  d is implemented
f660: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 44   together with D
f670: 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20  B_EVAL..  */..  
f680: 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65  /*    $db progre
f690: 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a  ss ?N CALLBACK?.
f6a0: 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b    ** .  ** Invok
f6b0: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
f6c0: 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72  back every N vir
f6d0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63  tual machine opc
f6e0: 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75  odes while execu
f6f0: 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65  ting.  ** querie
f700: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
f710: 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20  B_PROGRESS: {.  
f720: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
f730: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f740: 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
f750: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
f760: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
f770: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29  b->zProgress, 0)
f780: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
f790: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
f7a0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
f7b0: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20  Progress;.      
f7c0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
f7d0: 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt N;.      if( 
f7e0: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
f7f0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
f800: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29  , objv[2], &N) )
f810: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f820: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f830: 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70    };.      if( p
f840: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
f850: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
f860: 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  e(pDb->zProgress
f870: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f880: 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c   zProgress = Tcl
f890: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f8a0: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29  j(objv[3], &len)
f8b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f  ;.      if( zPro
f8c0: 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29  gress && len>0 )
f8d0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
f8e0: 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41  Progress = Tcl_A
f8f0: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
f900: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
f910: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20  pDb->zProgress, 
f920: 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31  zProgress, len+1
f930: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f940: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
f950: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
f960: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
f970: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
f980: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20  _CALLBACK.      
f990: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
f9a0: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ss ){.        pD
f9b0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
f9c0: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
f9d0: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
f9e0: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c  dler(pDb->db, N,
f9f0: 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
fa00: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
fa10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
fa20: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
fa30: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
fa40: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
fa50: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
fa60: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
fa70: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
fa80: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20  rp, 2, objv, "N 
fa90: 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
faa0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fab0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
fac0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
fad0: 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43    $db profile ?C
fae0: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
faf0: 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
fb00: 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
fb10: 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
fb20: 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53  ine after each S
fb30: 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
fb40: 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20  * that has run. 
fb50: 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
fb60: 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f   SQL and the amo
fb70: 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69  unt of elapse ti
fb80: 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65  me are.  ** appe
fb90: 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
fba0: 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69   before the scri
fbb0: 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a  pt is run..  */.
fbc0: 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c    case DB_PROFIL
fbd0: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
fbe0: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
fbf0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
fc00: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
fc10: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
fc20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fc30: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
fc40: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
fc50: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
fc60: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
fc70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
fc80: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
fc90: 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20  zProfile, 0);.  
fca0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
fcb0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
fcc0: 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74  ofile;.      int
fcd0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
fce0: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
fcf0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
fd00: 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29  e(pDb->zProfile)
fd10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fd20: 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47  zProfile = Tcl_G
fd30: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
fd40: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
fd50: 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69        if( zProfi
fd60: 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  le && len>0 ){. 
fd70: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
fd80: 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  file = Tcl_Alloc
fd90: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
fda0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
fdb0: 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66  >zProfile, zProf
fdc0: 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ile, len+1);.   
fdd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fde0: 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20    pDb->zProfile 
fdf0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
fe00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fe10: 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28  _TRACE.      if(
fe20: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
fe30: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
fe40: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
fe50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
fe60: 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c  profile(pDb->db,
fe70: 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65   DbProfileHandle
fe80: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
fe90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
fea0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44  lite3_profile(pD
feb0: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
fec0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
fed0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
fee0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
fef0: 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20   $db rekey KEY. 
ff00: 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20   **.  ** Change 
ff10: 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b  the encryption k
ff20: 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ey on the curren
ff30: 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73  tly open databas
ff40: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
ff50: 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69  B_REKEY: {.    i
ff60: 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69  nt nKey;.    voi
ff70: 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28  d *pKey;.    if(
ff80: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
ff90: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
ffa0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
ffb0: 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20  jv, "KEY");.    
ffc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ffd0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b  OR;.    }.    pK
ffe0: 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ey = Tcl_GetByte
fff0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
10000 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69  v[2], &nKey);.#i
10010 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
10020 43 4f 44 45 43 0a 20 20 20 20 72 63 20 3d 20 73  CODEC.    rc = s
10030 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62  qlite3_rekey(pDb
10040 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  ->db, pKey, nKey
10050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
10060 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10070 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10080 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
10090 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20  ), 0);.      rc 
100a0 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
100b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
100c0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
100d0 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65   **     $db time
100e0 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53  out MILLESECONDS
100f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79  .  **.  ** Delay
10100 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20   for the number 
10110 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
10120 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 61  specified when a
10130 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e   file is locked.
10140 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
10150 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69  TIMEOUT: {.    i
10160 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f  nt ms;.    if( o
10170 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
10180 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10190 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
101a0 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22  , "MILLISECONDS"
101b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
101c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
101d0 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
101e0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
101f0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29  p, objv[2], &ms)
10200 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
10210 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
10220 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44  _busy_timeout(pD
10230 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20  b->db, ms);.    
10240 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  break;.  }.  .  
10250 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
10260 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20  total_changes.  
10270 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
10280 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
10290 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69  s that were modi
102a0 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20  fied, inserted, 
102b0 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a  or deleted .  **
102c0 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
102d0 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63  ase handle was c
102e0 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  reated..  */.  c
102f0 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41  ase DB_TOTAL_CHA
10300 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  NGES: {.    Tcl_
10310 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
10320 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
10330 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
10340 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10350 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
10360 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10370 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10380 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
10390 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
103a0 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
103b0 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73  ntObj(pResult, s
103c0 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
103d0 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
103e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
103f0 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63    /*    $db trac
10400 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  e ?CALLBACK?.  *
10410 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61  *.  ** Make arra
10420 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f  ngements to invo
10430 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20  ke the CALLBACK 
10440 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68  routine for each
10450 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20   SQL statement. 
10460 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65 63   ** that is exec
10470 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74 20  uted.  The text 
10480 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 70  of the SQL is ap
10490 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41  pended to CALLBA
104a0 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69  CK before.  ** i
104b0 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  t is executed.. 
104c0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52   */.  case DB_TR
104d0 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ACE: {.    if( o
104e0 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
104f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10500 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10510 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
10520 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10530 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
10540 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
10550 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
10560 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  zTrace ){.      
10570 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10580 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
10590 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20  zTrace, 0);.    
105a0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
105b0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63       char *zTrac
105c0 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e;.      int len
105d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
105e0 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
105f0 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
10600 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20  >zTrace);.      
10610 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d  }.      zTrace =
10620 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10630 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
10640 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
10650 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20  zTrace && len>0 
10660 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
10670 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c  zTrace = Tcl_All
10680 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
10690 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
106a0 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63  b->zTrace, zTrac
106b0 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  e, len+1);.     
106c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
106d0 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b  pDb->zTrace = 0;
106e0 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
106f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
10700 43 45 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CE.      if( pDb
10710 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
10720 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
10730 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
10740 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
10750 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65  pDb->db, DbTrace
10760 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
10770 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10780 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
10790 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  e(pDb->db, 0, 0)
107a0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
107b0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
107c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
107d0 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b  db transaction [
107e0 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64  -deferred|-immed
107f0 69 61 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d  iate|-exclusive]
10800 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
10810 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20 74 72  * Start a new tr
10820 61 6e 73 61 63 74 69 6f 6e 20 28 69 66 20 77 65  ansaction (if we
10830 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
10840 20 69 6e 20 74 68 65 20 6d 69 64 73 74 20 6f 66   in the midst of
10850 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74   a.  ** transact
10860 69 6f 6e 29 20 61 6e 64 20 65 78 65 63 75 74 65  ion) and execute
10870 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
10880 53 43 52 49 50 54 2e 20 20 41 66 74 65 72 20 53  SCRIPT.  After S
10890 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c  CRIPT.  ** compl
108a0 65 74 65 73 2c 20 65 69 74 68 65 72 20 63 6f 6d  etes, either com
108b0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
108c0 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74 20 62  ion or roll it b
108d0 61 63 6b 20 69 66 20 53 43 52 49 50 54 0a 20 20  ack if SCRIPT.  
108e0 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ** throws an exc
108f0 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66 20 6e  eption.  Or if n
10900 6f 20 6e 65 77 20 74 72 61 6e 73 61 74 69 6f 6e  o new transation
10910 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 64 6f   was started, do
10920 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 70   nothing..  ** p
10930 61 73 73 20 74 68 65 20 65 78 63 65 70 74 69 6f  ass the exceptio
10940 6e 20 6f 6e 20 75 70 20 74 68 65 20 73 74 61 63  n on up the stac
10950 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  k..  **.  ** Thi
10960 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 69 6e  s command was in
10970 73 70 69 72 65 64 20 62 79 20 44 61 76 65 20 54  spired by Dave T
10980 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f 6e 20  homas's talk on 
10990 52 75 62 79 20 61 74 20 74 68 65 0a 20 20 2a 2a  Ruby at the.  **
109a0 20 32 30 30 35 20 4f 27 52 65 69 6c 6c 79 20 4f   2005 O'Reilly O
109b0 70 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e 76 65  pen Source Conve
109c0 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20  ntion (OSCON).. 
109d0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52   */.  case DB_TR
109e0 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  ANSACTION: {.   
109f0 20 69 6e 74 20 69 6e 54 72 61 6e 73 3b 0a 20 20   int inTrans;.  
10a00 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
10a10 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pt;.    const ch
10a20 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22 42 45  ar *zBegin = "BE
10a30 47 49 4e 22 3b 0a 20 20 20 20 69 66 28 20 6f 62  GIN";.    if( ob
10a40 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
10a50 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
10a60 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10a70 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59  p, 2, objv, "[TY
10a80 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20  PE] SCRIPT");.  
10a90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10aa0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10ab0 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
10ac0 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
10ad0 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 7d 20 65 6c  bjv[2];.    } el
10ae0 73 65 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  se {.      stati
10af0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54  c const char *TT
10b00 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  YPE_strs[] = {. 
10b10 20 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64         "deferred
10b20 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22  ",   "exclusive"
10b30 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20  ,  "immediate", 
10b40 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
10b50 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d   enum TTYPE_enum
10b60 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45   {.        TTYPE
10b70 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45  _DEFERRED, TTYPE
10b80 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50  _EXCLUSIVE, TTYP
10b90 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20  E_IMMEDIATE.    
10ba0 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74    };.      int t
10bb0 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20  type;.      if( 
10bc0 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
10bd0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
10be0 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c  [2], TTYPE_strs,
10bf0 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79   "transaction ty
10c00 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pe",.           
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b     0, &ttype) ){
10c30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10c40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
10c50 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28   }.      switch(
10c60 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75   (enum TTYPE_enu
10c70 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20  m)ttype ){.     
10c80 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45     case TTYPE_DE
10c90 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f  FERRED:    /* no
10ca0 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20  -op */;         
10cb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10cc0 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
10cd0 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a  E_EXCLUSIVE:   z
10ce0 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45  Begin = "BEGIN E
10cf0 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61  XCLUSIVE";  brea
10d00 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
10d10 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a  TTYPE_IMMEDIATE:
10d20 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47     zBegin = "BEG
10d30 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20  IN IMMEDIATE";  
10d40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
10d50 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
10d60 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20  bjv[3];.    }.  
10d70 20 20 69 6e 54 72 61 6e 73 20 3d 20 21 73 71 6c    inTrans = !sql
10d80 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
10d90 6d 69 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  mit(pDb->db);.  
10da0 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73 20 29    if( !inTrans )
10db0 7b 0a 20 20 20 20 20 20 28 76 6f 69 64 29 73 71  {.      (void)sq
10dc0 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
10dd0 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30  db, zBegin, 0, 0
10de0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
10df0 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
10e00 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
10e10 70 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  pt, 0);.    if( 
10e20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  !inTrans ){.    
10e30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
10e40 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  nd;.      if( rc
10e50 3d 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20  ==TCL_ERROR ){. 
10e60 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 52         zEnd = "R
10e70 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
10e80 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
10e90 20 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22   zEnd = "COMMIT"
10ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10eb0 69 66 28 20 73 71 6c 69 74 65 33 5f 65 78 65 63  if( sqlite3_exec
10ec0 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20  (pDb->db, zEnd, 
10ed0 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  0, 0, 0) ){.    
10ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
10ef0 28 70 44 62 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42  (pDb->db, "ROLLB
10f00 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ACK", 0, 0, 0);.
10f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10f20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
10f30 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75  /*.  **    $db u
10f40 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69  pdate_hook ?scri
10f50 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  pt?.  **    $db 
10f60 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73  rollback_hook ?s
10f70 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
10f80 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f  se DB_UPDATE_HOO
10f90 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 52 4f  K: .  case DB_RO
10fa0 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a  LLBACK_HOOK: {..
10fb0 20 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f      /* set ppHoo
10fc0 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55  k to point at pU
10fd0 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f  pdateHook or pRo
10fe0 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65  llbackHook, depe
10ff0 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a  nding on .    **
11000 20 77 68 65 74 68 65 72 20 5b 24 64 62 20 75 70   whether [$db up
11010 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24  date_hook] or [$
11020 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  db rollback_hook
11030 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20  ] was invoked.. 
11040 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62     */.    Tcl_Ob
11050 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20  j **ppHook; .   
11060 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
11070 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20  UPDATE_HOOK ){. 
11080 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70       ppHook = &p
11090 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b  Db->pUpdateHook;
110a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
110b0 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d    ppHook = &pDb-
110c0 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a  >pRollbackHook;.
110d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
110e0 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
110f0 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f  3 ){.       Tcl_
11100 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
11110 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
11120 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
11130 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11140 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
11150 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20  ( *ppHook ){.   
11160 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
11170 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48  ult(interp, *ppH
11180 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ook);.      if( 
11190 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
111a0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
111b0 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
111c0 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20        *ppHook = 
111d0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
111e0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
111f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11200 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a  ( !(*ppHook) );.
11210 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
11220 74 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76  tCharLength(objv
11230 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  [2])>0 ){.      
11240 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76    *ppHook = objv
11250 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  [2];.        Tcl
11260 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70  _IncrRefCount(*p
11270 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pHook);.      }.
11280 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
11290 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70  e3_update_hook(p
112a0 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55  Db->db, (pDb->pU
112b0 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61  pdateHook?DbUpda
112c0 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44  teHandler:0), pD
112d0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  b);.    sqlite3_
112e0 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44  rollback_hook(pD
112f0 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c  b->db,(pDb->pRol
11300 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c  lbackHook?DbRoll
11310 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70  backHandler:0),p
11320 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b  Db);..    break;
11330 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
11340 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20  b version.  **. 
11350 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76   ** Return the v
11360 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f  ersion string fo
11370 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
11380 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11390 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54  VERSION: {.    T
113a0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
113b0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
113c0 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
113d0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
113e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
113f0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74  .  } /* End of t
11400 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d  he SWITCH statem
11410 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ent */.  return 
11420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73  rc;.}../*.**   s
11430 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49  qlite3 DBNAME FI
11440 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53  LENAME ?-vfs VFS
11450 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f  NAME? ?-key KEY?
11460 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c   ?-readonly BOOL
11470 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20  EAN?.**         
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 20 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45    ?-create BOOLE
114a0 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  AN?.**.** This i
114b0 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63  s the main Tcl c
114c0 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68  ommand.  When th
114d0 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63  e "sqlite" Tcl c
114e0 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76  ommand is.** inv
114f0 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  oked, this routi
11500 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65  ne runs to proce
11510 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e  ss that command.
11520 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
11530 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d   argument, DBNAM
11540 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61  E, is an arbitra
11550 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ry name for a ne
11560 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  w.** database co
11570 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  nnection.  This 
11580 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20  command creates 
11590 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61  a new command na
115a0 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68  med.** DBNAME th
115b0 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
115c0 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65  ntrol that conne
115d0 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61  ction.  The data
115e0 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
115f0 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68  on is deleted wh
11600 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f  en the DBNAME co
11610 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64  mmand is deleted
11620 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
11630 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
11640 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
11650 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
11660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
11670 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20  bMain(void *cd, 
11680 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11690 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c  rp, int objc,Tcl
116a0 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
116b0 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
116c0 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d  ;.  void *pKey =
116d0 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d   0;.  int nKey =
116e0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
116f0 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a   *zArg;.  char *
11700 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69  zErrMsg;.  int i
11710 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
11720 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zFile;.  const c
11730 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20  har *zVfs = 0;. 
11740 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c   int flags = SQL
11750 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
11760 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
11770 5f 43 52 45 41 54 45 3b 0a 20 20 54 63 6c 5f 44  _CREATE;.  Tcl_D
11780 53 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65  String translate
11790 64 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 66 28  dFilename;.  if(
117a0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
117b0 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
117c0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
117d0 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [1], 0);.    if(
117e0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76   strcmp(zArg,"-v
117f0 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  ersion")==0 ){. 
11800 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
11810 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
11820 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b  ite3_version,0);
11830 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11840 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
11850 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
11860 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30  "-has-codec")==0
11870 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
11880 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
11890 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
118a0 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29  lt(interp,"1",0)
118b0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
118c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
118d0 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65  nterp,"0",0);.#e
118e0 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
118f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
11900 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69    }.  for(i=3; i
11910 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a  +1<objc; i+=2){.
11920 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47      zArg = Tcl_G
11930 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d  etString(objv[i]
11940 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
11950 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d  p(zArg,"-key")==
11960 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20  0 ){.      pKey 
11970 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
11980 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69  ayFromObj(objv[i
11990 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20  +1], &nKey);.   
119a0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
119b0 70 28 7a 41 72 67 2c 20 22 2d 76 66 73 22 29 3d  p(zArg, "-vfs")=
119c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  =0 ){.      i++;
119d0 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63  .      zVfs = Tc
119e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
119f0 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
11a00 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
11a10 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
11a20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
11a30 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
11a40 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
11a50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
11a60 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
11a70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11a80 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20    if( b ){.     
11a90 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
11aa0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
11ab0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
11ac0 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20  CREATE);.       
11ad0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
11ae0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
11af0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11b00 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
11b10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11b20 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  NLY;.        fla
11b30 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
11b40 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
11b50 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
11b60 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
11b70 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b  "-create")==0 ){
11b80 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
11b90 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
11ba0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
11bb0 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
11bc0 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
11bd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
11be0 66 28 20 62 20 26 26 20 28 66 6c 61 67 73 20 26  f( b && (flags &
11bf0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
11c00 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  DONLY)==0 ){.   
11c10 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
11c20 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11c30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11c40 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
11c50 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  ~SQLITE_OPEN_CRE
11c60 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
11c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
11c80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11c90 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20  nterp, "unknown 
11ca0 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c  option: ", zArg,
11cb0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
11cc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11cd0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
11ce0 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f  if( objc<3 || (o
11cf0 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20  bjc&1)!=1 ){.   
11d00 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
11d10 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
11d20 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  v, .      "HANDL
11d30 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73  E FILENAME ?-vfs
11d40 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64   VFSNAME? ?-read
11d50 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  only BOOLEAN? ?-
11d60 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22  create BOOLEAN?"
11d70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
11d80 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22  AS_CODEC.      "
11d90 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f   ?-key CODECKEY?
11da0 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a  ".#endif.    );.
11db0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11dc0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  RROR;.  }.  zErr
11dd0 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28  Msg = 0;.  p = (
11de0 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c  SqliteDb*)Tcl_Al
11df0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
11e00 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
11e10 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
11e20 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c  lt(interp, "mall
11e30 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f  oc failed", TCL_
11e40 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
11e50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11e60 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
11e70 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
11e80 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
11e90 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
11ea0 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69  jv[2], 0);.  zFi
11eb0 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61  le = Tcl_Transla
11ec0 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72  teFileName(inter
11ed0 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73  p, zFile, &trans
11ee0 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
11ef0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76    sqlite3_open_v
11f00 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 2c  2(zFile, &p->db,
11f10 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20   flags, zVfs);. 
11f20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
11f30 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65  (&translatedFile
11f40 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 51 4c  name);.  if( SQL
11f50 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
11f60 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29  errcode(p->db) )
11f70 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  {.    zErrMsg = 
11f80 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
11f90 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
11fa0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
11fb0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
11fc0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  p->db);.    p->d
11fd0 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  b = 0;.  }.#ifde
11fe0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
11ff0 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20  if( p->db ){.   
12000 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f   extern int Md5_
12010 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
12020 2a 29 3b 0a 20 20 20 20 69 66 28 20 4d 64 35 5f  *);.    if( Md5_
12030 52 65 67 69 73 74 65 72 28 70 2d 3e 64 62 29 3d  Register(p->db)=
12040 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
12050 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  .      zErrMsg =
12060 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12070 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
12080 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
12090 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
120a0 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  se(p->db);.     
120b0 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20   p->db = 0;.    
120c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a 23  }.  }.#endif  .#
120d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
120e0 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e  _CODEC.  if( p->
120f0 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  db ){.    sqlite
12100 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65  3_key(p->db, pKe
12110 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65  y, nKey);.  }.#e
12120 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62  ndif.  if( p->db
12130 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
12140 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
12150 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f   zErrMsg, TCL_VO
12160 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c  LATILE);.    Tcl
12170 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b  _Free((char*)p);
12180 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12190 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
121a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
121b0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74  ;.  }.  p->maxSt
121c0 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45  mt = NUM_PREPARE
121d0 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e  D_STMTS;.  p->in
121e0 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
121f0 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
12200 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
12210 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  v[1], 0);.  Tcl_
12220 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
12230 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
12240 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
12250 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
12260 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  ;.}../*.** Provi
12280 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49  de a dummy Tcl_I
12290 6e 69 74 53 74 75 62 73 20 69 66 20 77 65 20 61  nitStubs if we a
122a0 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 61 73  re using this as
122b0 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62   a static.** lib
122c0 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rary..*/.#ifndef
122d0 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23   USE_TCL_STUBS.#
122e0 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74   undef  Tcl_Init
122f0 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54  Stubs.# define T
12300 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62  cl_InitStubs(a,b
12310 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
12320 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
12330 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45  ave a PACKAGE_VE
12340 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69  RSION macro defi
12350 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ned.  This will 
12360 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75  be.** defined au
12370 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74  tomatically by t
12380 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e  he TEA makefile.
12390 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65    But other make
123a0 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  files.** do not 
123b0 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69  define it..*/.#i
123c0 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45  fndef PACKAGE_VE
123d0 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50  RSION.# define P
123e0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53  ACKAGE_VERSION S
123f0 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65  QLITE_VERSION.#e
12400 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ndif../*.** Init
12410 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
12420 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  le..**.** This T
12430 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69  cl module contai
12440 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ns only a single
12450 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
12460 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e   named "sqlite".
12470 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65  .** (Hence there
12480 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65   is no namespace
12490 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70  .  There is no p
124a0 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20  oint in using a 
124b0 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20  namespace.** if 
124c0 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e  the extension on
124d0 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20  ly supplies one 
124e0 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20  new name!)  The 
124f0 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
12500 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f   is.** used to o
12510 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65  pen a new SQLite
12520 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65 20   database.  See 
12530 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75  the DbMain() rou
12540 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f  tine above.** fo
12550 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
12560 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45 58 54  ormation..*/.EXT
12570 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
12580 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
12590 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f  *interp){.  Tcl_
125a0 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
125b0 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54  , "8.4", 0);.  T
125c0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
125d0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  and(interp, "sql
125e0 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43  ite3", (Tcl_ObjC
125f0 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20  mdProc*)DbMain, 
12600 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67  0, 0);.  Tcl_Pkg
12610 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20  Provide(interp, 
12620 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41  "sqlite3", PACKA
12630 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 54  GE_VERSION);.  T
12640 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
12650 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  and(interp, "sql
12660 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d  ite", (Tcl_ObjCm
12670 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30  dProc*)DbMain, 0
12680 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50  , 0);.  Tcl_PkgP
12690 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
126a0 73 71 6c 69 74 65 22 2c 20 50 41 43 4b 41 47 45  sqlite", PACKAGE
126b0 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72 65 74  _VERSION);.  ret
126c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58  urn TCL_OK;.}.EX
126d0 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
126e0 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
126f0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
12700 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
12710 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54  t(interp); }.EXT
12720 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
12730 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
12740 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
12750 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
12760 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
12770 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63  ite3_SafeInit(Tc
12780 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12790 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
127a0 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ; }..#ifndef SQL
127b0 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c  ITE_3_SUFFIX_ONL
127c0 59 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  Y.EXTERN int Sql
127d0 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ite_Init(Tcl_Int
127e0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
127f0 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
12800 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54  t(interp); }.EXT
12810 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74  ERN int Tclsqlit
12820 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
12830 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
12840 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
12850 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52  interp); }.EXTER
12860 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66  N int Sqlite_Saf
12870 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
12880 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
12890 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
128a0 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
128b0 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
128c0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
128d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
128e0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54  #endif..#ifdef T
128f0 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  CLSH./**********
12900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12940 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ***.** The code 
12950 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20  that follows is 
12960 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74  used to build st
12970 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74  andalone TCL int
12980 65 72 70 72 65 74 65 72 73 0a 2a 2a 20 74 68 61  erpreters.** tha
12990 74 20 61 72 65 20 73 74 61 74 69 63 61 6c 6c 79  t are statically
129a0 20 6c 69 6e 6b 65 64 20 77 69 74 68 20 53 51 4c   linked with SQL
129b0 69 74 65 2e 20 20 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ite.  .*/../*.**
129c0 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43   If the macro TC
129d0 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e  LSH is one, then
129e0 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69   put in code thi
129f0 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61  s for the.** "ma
12a00 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74  in" routine that
12a10 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65   will initialize
12a20 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e   Tcl and take in
12a30 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e  put from.** stan
12a40 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72 20 69  dard input, or i
12a50 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61 6d 65  f a file is name
12a60 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
12a70 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c   line.** the TCL
12a80 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 61   interpreter rea
12a90 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74 65 73  ds and evaluates
12aa0 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23   that file..*/.#
12ab0 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74  if TCLSH==1.stat
12ac0 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f  ic char zMainloo
12ad0 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e  p[] =.  "set lin
12ae0 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65  e {}\n".  "while
12af0 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20   {![eof stdin]} 
12b00 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c  {\n".    "if {$l
12b10 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ine!=\"\"} {\n".
12b20 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
12b30 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22  ewline \"> \"\n"
12b40 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e  .    "} else {\n
12b50 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
12b60 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c  onewline \"% \"\
12b70 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20  n".    "}\n".   
12b80 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e   "flush stdout\n
12b90 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69  ".    "append li
12ba0 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c  ne [gets stdin]\
12bb0 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66  n".    "if {[inf
12bc0 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65  o complete $line
12bd0 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69  ]} {\n".      "i
12be0 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76  f {[catch {uplev
12bf0 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73  el #0 $line} res
12c00 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ult]} {\n".     
12c10 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20     "puts stderr 
12c20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74  \"Error: $result
12c30 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65  \"\n".      "} e
12c40 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d  lseif {$result!=
12c50 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  \"\"} {\n".     
12c60 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74     "puts $result
12c70 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a  \n".      "}\n".
12c80 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20        "set line 
12c90 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73  {}\n".    "} els
12ca0 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70  e {\n".      "ap
12cb0 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22  pend line \\n\n"
12cc0 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c  .    "}\n".  "}\
12cd0 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  n".;.#endif../*.
12ce0 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
12cf0 54 43 4c 53 48 20 69 73 20 74 77 6f 2c 20 74 68  TCLSH is two, th
12d00 65 6e 20 67 65 74 20 74 68 65 20 6d 61 69 6e 20  en get the main 
12d10 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f 66  loop code out of
12d20 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 65  .** the separate
12d30 20 66 69 6c 65 20 22 73 70 61 63 65 61 6e 61 6c   file "spaceanal
12d40 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20  _tcl.h"..*/.#if 
12d50 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20  TCLSH==2.static 
12d60 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d  char zMainloop[]
12d70 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70   = .#include "sp
12d80 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b  aceanal_tcl.h".;
12d90 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
12da0 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e   TCLSH_MAIN main
12db0 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20     /* Needed to 
12dc0 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70  fake out mktclap
12dd0 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d  p */.int TCLSH_M
12de0 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  AIN(int argc, ch
12df0 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63  ar **argv){.  Tc
12e00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12e10 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63  ;.  Tcl_FindExec
12e20 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b  utable(argv[0]);
12e30 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f  .  interp = Tcl_
12e40 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a  CreateInterp();.
12e50 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69    Sqlite3_Init(i
12e60 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53  nterp);.#ifdef S
12e70 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
12e80 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64     extern int Md
12e90 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  5_Init(Tcl_Inter
12ea0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
12eb0 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66 69 67  int Sqliteconfig
12ec0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12ed0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
12ee0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49  nt Sqlitetest1_I
12ef0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
12f00 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
12f10 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
12f20 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
12f30 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
12f40 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
12f50 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
12f60 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
12f70 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63  itetest4_Init(Tc
12f80 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
12f90 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
12fa0 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f  etest5_Init(Tcl_
12fb0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
12fc0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
12fd0 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est6_Init(Tcl_In
12fe0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
12ff0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13000 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t7_Init(Tcl_Inte
13010 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13020 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 38   int Sqlitetest8
13030 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
13040 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
13050 6e 74 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49  nt Sqlitetest9_I
13060 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
13070 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
13080 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63   Sqlitetestasync
13090 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
130a0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
130b0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75  nt Sqlitetest_au
130c0 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49  toext_Init(Tcl_I
130d0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
130e0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
130f0 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63  st_hexio_Init(Tc
13100 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13110 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13120 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69  etest_malloc_Ini
13130 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
13140 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
13150 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f  qlitetestschema_
13160 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
13170 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
13180 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f  t Sqlitetestsse_
13190 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
131a0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
131b0 74 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76  t Sqlitetesttclv
131c0 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ar_Init(Tcl_Inte
131d0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
131e0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54   int SqlitetestT
131f0 68 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49  hread_Init(Tcl_I
13200 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
13210 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
13220 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29  stOnefile_Init()
13230 3b 0a 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74 28  ;..    Md5_Init(
13240 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
13250 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69  iteconfig_Init(i
13260 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13270 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74  tetest1_Init(int
13280 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
13290 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72  test2_Init(inter
132a0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
132b0 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st3_Init(interp)
132c0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
132d0 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  4_Init(interp);.
132e0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f      Sqlitetest5_
132f0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
13300 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e    Sqlitetest6_In
13310 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13320 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
13330 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13340 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 69  litetest8_Init(i
13350 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13360 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69 6e 74  tetest9_Init(int
13370 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
13380 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 69  testasync_Init(i
13390 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
133a0 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
133b0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
133c0 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69   Sqlitetest_hexi
133d0 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  o_Init(interp);.
133e0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d      Sqlitetest_m
133f0 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72  alloc_Init(inter
13400 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
13410 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e  stschema_Init(in
13420 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
13430 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
13440 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13450 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49  litetestThread_I
13460 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
13470 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69   SqlitetestOnefi
13480 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  le_Init(interp);
13490 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
134a0 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65  SSE.    Sqlitete
134b0 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72  stsse_Init(inter
134c0 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  p);.#endif.  }.#
134d0 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67 63  endif.  if( argc
134e0 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20  >=2 || TCLSH==2 
134f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
13500 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d    char zArgc[32]
13510 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
13520 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
13530 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64  rgc), zArgc, "%d
13540 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48  ", argc-(3-TCLSH
13550 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56  ));.    Tcl_SetV
13560 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22  ar(interp,"argc"
13570 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f  , zArgc, TCL_GLO
13580 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
13590 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
135a0 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d  ,"argv0",argv[1]
135b0 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59  ,TCL_GLOBAL_ONLY
135c0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
135d0 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c  r(interp,"argv",
135e0 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f   "", TCL_GLOBAL_
135f0 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69  ONLY);.    for(i
13600 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63  =3-TCLSH; i<argc
13610 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
13620 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
13630 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d   "argv", argv[i]
13640 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f  ,.          TCL_
13650 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43  GLOBAL_ONLY | TC
13660 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c  L_LIST_ELEMENT |
13670 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55   TCL_APPEND_VALU
13680 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
13690 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63  ( TCLSH==1 && Tc
136a0 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72  l_EvalFile(inter
136b0 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c  p, argv[1])!=TCL
136c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  _OK ){.      con
136d0 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d  st char *zInfo =
136e0 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65   Tcl_GetVar(inte
136f0 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c  rp, "errorInfo",
13700 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
13710 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  );.      if( zIn
13720 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20  fo==0 ) zInfo = 
13730 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a  interp->result;.
13740 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
13750 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c  derr,"%s: %s\n",
13760 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a   *argv, zInfo);.
13770 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
13780 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13790 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c 53 48  argc<=1 || TCLSH
137a0 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47  ==2 ){.    Tcl_G
137b0 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70  lobalEval(interp
137c0 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20  , zMainloop);.  
137d0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
137e0 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20  #endif /* TCLSH 
137f0 2a 2f 0a                                         */.