/ Hex Artifact Content
Login

Artifact 8a472804b901d4559213eeda538c2eadb2ad7f2a:


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 33 38 20 32 30 30 39  e.c,v 1.238 2009
0220: 2f 30 33 2f 31 36 20 31 33 3a 31 39 3a 33 36 20  /03/16 13:19:36 
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 69 6e 74 20 64 69 73 61 62 6c 65 41  /.  int disableA
0e60: 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f  uth;           /
0e70: 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 61 75  * Disable the au
0e80: 74 68 6f 72 69 7a 65 72 20 69 66 20 69 74 20 65  thorizer if it e
0e90: 78 69 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  xists */.  char 
0ea0: 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zNull;         
0eb0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f        /* Text to
0ec0: 20 73 75 62 73 74 69 74 75 74 65 20 66 6f 72 20   substitute for 
0ed0: 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75  an SQL NULL valu
0ee0: 65 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a  e */.  SqlFunc *
0ef0: 70 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20  pFunc;          
0f00: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c    /* List of SQL
0f10: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
0f20: 54 63 6c 5f 4f 62 6a 20 2a 70 55 70 64 61 74 65  Tcl_Obj *pUpdate
0f30: 48 6f 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 55 70  Hook;      /* Up
0f40: 64 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70 74  date hook script
0f50: 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54   (if any) */.  T
0f60: 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62 61 63  cl_Obj *pRollbac
0f70: 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52 6f 6c  kHook;    /* Rol
0f80: 6c 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72 69 70  lback hook scrip
0f90: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
0fa0: 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b  Tcl_Obj *pUnlock
0fb0: 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a 20 55 6e  Notify;    /* Un
0fc0: 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73 63 72 69  lock notify scri
0fd0: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
0fe0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
0ff0: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
1000: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
1010: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
1020: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1040: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
1050: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1060: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
1070: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
1080: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
1090: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
10a0: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
10b0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
10c0: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
10d0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
10e0: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
10f0: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
1100: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
1110: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
1120: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
1130: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1140: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
1150: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
1160: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
1170: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1190: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
11a0: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
11b0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
11c0: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
11d0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
11e0: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
11f0: 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  annels */.  int 
1200: 6e 53 74 65 70 2c 20 6e 53 6f 72 74 3b 20 20 20  nStep, nSort;   
1210: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
1220: 74 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65  tics for most re
1230: 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  cent operation *
1240: 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63  /.  int nTransac
1250: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
1260: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74  * Number of nest
1270: 65 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d  ed [transaction]
1280: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 7d 3b 0a 0a   methods */.};..
1290: 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43  struct IncrblobC
12a0: 68 61 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74  hannel {.  sqlit
12b0: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20  e3_blob *pBlob; 
12c0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20       /* sqlite3 
12d0: 62 6c 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  blob handle */. 
12e0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20   SqliteDb *pDb; 
12f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
1300: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
1310: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1320: 20 20 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20    int iSeek;    
1330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1340: 75 72 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73  urrent seek offs
1350: 65 74 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e  et */.  Tcl_Chan
1360: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20  nel channel;    
1370: 20 20 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65    /* Channel ide
1380: 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63  ntifier */.  Inc
1390: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e  rblobChannel *pN
13a0: 65 78 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64  ext;   /* Linked
13b0: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65   list of all ope
13c0: 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  n incrblob chann
13d0: 65 6c 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  els */.  Incrblo
13e0: 62 43 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b  bChannel *pPrev;
13f0: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
1400: 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e  t of all open in
1410: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20  crblob channels 
1420: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.};../*.** Com
1430: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65  pute a string le
1440: 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d  ngth that is lim
1450: 69 74 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e  ited to what can
1460: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   be stored in.**
1470: 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f   lower 30 bits o
1480: 66 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65  f a 32-bit signe
1490: 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  d integer..*/.st
14a0: 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33  atic int strlen3
14b0: 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  0(const char *z)
14c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
14d0: 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28  z2 = z;.  while(
14e0: 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a   *z2 ){ z2++; }.
14f0: 20 20 72 65 74 75 72 6e 20 30 78 33 66 66 66 66    return 0x3ffff
1500: 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d  fff & (int)(z2 -
1510: 20 7a 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66   z);.}...#ifndef
1520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1530: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  RBLOB./*.** Clos
1540: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63  e all incrblob c
1550: 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75  hannels opened u
1560: 73 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  sing database co
1570: 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a  nnection pDb..**
1580: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
1590: 77 68 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f  when shutting do
15a0: 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  wn the database 
15b0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
15c0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
15d0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
15e0: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b  (SqliteDb *pDb){
15f0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1600: 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f  el *p;.  Incrblo
1610: 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b  bChannel *pNext;
1620: 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70  ..  for(p=pDb->p
1630: 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70  Incrblob; p; p=p
1640: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
1650: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
1660: 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69    /* Note: Calli
1670: 6e 67 20 75 6e 72 65 67 69 73 74 65 72 20 68 65  ng unregister he
1680: 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73  re call Tcl_Clos
1690: 65 20 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f  e on the incrblo
16a0: 62 20 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20  b channel, .    
16b0: 2a 2a 20 77 68 69 63 68 20 64 65 6c 65 74 65 73  ** which deletes
16c0: 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61   the IncrblobCha
16d0: 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 61  nnel structure a
16e0: 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a  t *p. So do not.
16f0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f      ** call Tcl_
1700: 46 72 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20  Free() here..   
1710: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65   */.    Tcl_Unre
1720: 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44  gisterChannel(pD
1730: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68  b->interp, p->ch
1740: 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  annel);.  }.}../
1750: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e  *.** Close an in
1760: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1770: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1780: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c  c int incrblobCl
1790: 6f 73 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  ose(ClientData i
17a0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c  nstanceData, Tcl
17b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
17c0: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
17d0: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
17e0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
17f0: 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20  anceData;.  int 
1800: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
1810: 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62  b_close(p->pBlob
1820: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
1830: 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a   = p->pDb->db;..
1840: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1850: 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65  channel from the
1860: 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62   SqliteDb.pIncrb
1870: 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69  lob list. */.  i
1880: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
1890: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
18a0: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
18b0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65   }.  if( p->pPre
18c0: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
18d0: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
18e0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
18f0: 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  ->pDb->pIncrblob
1900: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44  ==p ){.    p->pD
1910: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70  b->pIncrblob = p
1920: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  ->pNext;.  }..  
1930: 2f 2a 20 46 72 65 65 20 74 68 65 20 49 6e 63 72  /* Free the Incr
1940: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75  blobChannel stru
1950: 63 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46  cture */.  Tcl_F
1960: 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a  ree((char *)p);.
1970: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1980: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
1990: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
19a0: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
19b0: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43  3_errmsg(db), TC
19c0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
19d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19e0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
19f0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1a00: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
1a10: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
1a20: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
1a30: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
1a40: 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65  lobInput(.  Clie
1a50: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1a60: 61 74 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75  ata, .  char *bu
1a70: 66 2c 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a  f, .  int bufSiz
1a80: 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  e,.  int *errorC
1a90: 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72  odePtr.){.  Incr
1aa0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d  blobChannel *p =
1ab0: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
1ac0: 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61  l *)instanceData
1ad0: 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
1ae0: 62 75 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bufSize;        
1af0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1b00: 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
1b10: 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20   int nBlob;     
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b30: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
1b40: 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74  he blob */.  int
1b50: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1b70: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
1b80: 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c  /..  nBlob = sql
1b90: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
1ba0: 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  p->pBlob);.  if(
1bb0: 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64   (p->iSeek+nRead
1bc0: 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e  )>nBlob ){.    n
1bd0: 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e  Read = nBlob-p->
1be0: 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  iSeek;.  }.  if(
1bf0: 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20   nRead<=0 ){.   
1c00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1c10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1c20: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f  lob_read(p->pBlo
1c30: 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20  b, (void *)buf, 
1c40: 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29  nRead, p->iSeek)
1c50: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72  TE_OK ){.    *er
1c70: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b  rorCodePtr = rc;
1c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1c90: 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20    }..  p->iSeek 
1ca0: 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75  += nRead;.  retu
1cb0: 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  rn nRead;.}../*.
1cc0: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f  ** Write data to
1cd0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1ce0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f  blob channel..*/
1cf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1d00: 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c  blobOutput(.  Cl
1d10: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1d20: 65 44 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20  eData, .  CONST 
1d30: 63 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e  char *buf, .  in
1d40: 74 20 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74  t toWrite,.  int
1d50: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29   *errorCodePtr.)
1d60: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
1d70: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
1d80: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
1d90: 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20  anceData;.  int 
1da0: 6e 57 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65  nWrite = toWrite
1db0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1dc0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77  er of bytes to w
1dd0: 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  rite */.  int nB
1de0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
1df0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1e00: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
1e10: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72     /* sqlite err
1e40: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42  or code */..  nB
1e50: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  lob = sqlite3_bl
1e60: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
1e70: 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53  b);.  if( (p->iS
1e80: 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f  eek+nWrite)>nBlo
1e90: 62 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  b ){.    *errorC
1ea0: 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b  odePtr = EINVAL;
1eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1ec0: 20 20 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65    }.  if( nWrite
1ed0: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
1ee0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  n 0;.  }..  rc =
1ef0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
1f00: 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76  ite(p->pBlob, (v
1f10: 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74  oid *)buf, nWrit
1f20: 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20  e, p->iSeek);.  
1f30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f40: 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  K ){.    *errorC
1f50: 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20  odePtr = EIO;.  
1f60: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
1f70: 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20  ..  p->iSeek += 
1f80: 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
1f90: 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a   nWrite;.}../*.*
1fa0: 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d  * Seek an increm
1fb0: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
1fc0: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1fd0: 74 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a  t incrblobSeek(.
1fe0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
1ff0: 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f  tanceData, .  lo
2000: 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74  ng offset,.  int
2010: 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74   seekMode,.  int
2020: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29   *errorCodePtr.)
2030: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2040: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
2050: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
2060: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69  anceData;..  swi
2070: 74 63 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b  tch( seekMode ){
2080: 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53  .    case SEEK_S
2090: 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65  ET:.      p->iSe
20a0: 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ek = offset;.   
20b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
20c0: 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20  se SEEK_CUR:.   
20d0: 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f     p->iSeek += o
20e0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65  ffset;.      bre
20f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45  ak;.    case SEE
2100: 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e  K_END:.      p->
2110: 69 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f  iSeek = sqlite3_
2120: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
2130: 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20  lob) + offset;. 
2140: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2150: 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
2160: 28 21 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22  (!"Bad seekMode"
2170: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2180: 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73   p->iSeek;.}...s
2190: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62  tatic void incrb
21a0: 6c 6f 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44  lobWatch(ClientD
21b0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
21c0: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20  , int mode){ .  
21d0: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73  /* NO-OP */ .}.s
21e0: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
21f0: 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44  obHandle(ClientD
2200: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
2210: 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e  , int dir, Clien
2220: 74 44 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20  tData *hPtr){.  
2230: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2240: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f  ;.}..static Tcl_
2250: 43 68 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72  ChannelType Incr
2260: 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20  blobChannelType 
2270: 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22  = {.  "incrblob"
2280: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2290: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65           /* type
22a0: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45   */.  TCL_CHANNE
22d0: 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20  L_VERSION_2,    
22e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73           /* vers
22f0: 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c   */.  incrblobCl
2320: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2330: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
2340: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e   */.  incrblobIn
2370: 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  put,            
2380: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75           /* inpu
2390: 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  tProc           
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75   */.  incrblobOu
23c0: 74 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  tput,           
23d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70           /* outp
23e0: 75 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  utProc          
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65   */.  incrblobSe
2410: 65 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ek,             
2420: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b           /* seek
2430: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f           /* setO
2480: 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20  ptionProc       
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f           /* getO
24d0: 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20  ptionProc       
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61   */.  incrblobWa
2500: 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
2510: 20 20 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63           /* watc
2520: 68 50 72 6f 63 20 28 74 68 69 73 20 69 73 20 61  hProc (this is a
2530: 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20   no-op)         
2540: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61   */.  incrblobHa
2550: 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  ndle,           
2560: 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48           /* getH
2570: 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79  andleProc (alway
2580: 73 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29  s returns error)
2590: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
25c0: 65 32 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  e2Proc          
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63           /* bloc
2610: 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20  kModeProc       
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73           /* flus
2660: 68 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  hProc           
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64           /* hand
26b0: 6c 65 72 50 72 6f 63 20 20 20 20 20 20 20 20 20  lerProc         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65           /* wide
2700: 53 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20  SeekProc        
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72   */.};../*.** Cr
2730: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62  eate a new incrb
2740: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
2750: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
2760: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
2770: 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  (.  Tcl_Interp *
2780: 69 6e 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74  interp, .  Sqlit
2790: 65 44 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e  eDb *pDb, .  con
27a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20  st char *zDb,.  
27b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
27c0: 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  le, .  const cha
27d0: 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73  r *zColumn, .  s
27e0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77  qlite_int64 iRow
27f0: 2c 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ,.  int isReadon
2800: 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  ly.){.  Incrblob
2810: 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71  Channel *p;.  sq
2820: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d  lite3 *db = pDb-
2830: 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  >db;.  sqlite3_b
2840: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
2850: 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67  t rc;.  int flag
2860: 73 20 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  s = TCL_READABLE
2870: 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30  |(isReadonly ? 0
2880: 20 3a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29   : TCL_WRITABLE)
2890: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72  ;..  /* This var
28a0: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
28b0: 20 6e 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65   name the channe
28c0: 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69  ls: "incrblob_[i
28d0: 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20  ncr count]" */. 
28e0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e   static int coun
28f0: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43  t = 0;.  char zC
2900: 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72  hannel[64];..  r
2910: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
2920: 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a  _open(db, zDb, z
2930: 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  Table, zColumn, 
2940: 69 52 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c  iRow, !isReadonl
2950: 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66  y, &pBlob);.  if
2960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2970: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
2980: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2990: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
29a0: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
29b0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
29c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29d0: 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49  R;.  }..  p = (I
29e0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
29f0: 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f  )Tcl_Alloc(sizeo
2a00: 66 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  f(IncrblobChanne
2a10: 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20  l));.  p->iSeek 
2a20: 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20  = 0;.  p->pBlob 
2a30: 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69  = pBlob;..  sqli
2a40: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2a50: 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a  eof(zChannel), z
2a60: 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c  Channel, "incrbl
2a70: 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29  ob_%d", ++count)
2a80: 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d  ;.  p->channel =
2a90: 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e   Tcl_CreateChann
2aa0: 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e  el(&IncrblobChan
2ab0: 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65  nelType, zChanne
2ac0: 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  l, p, flags);.  
2ad0: 54 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e  Tcl_RegisterChan
2ae0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63  nel(interp, p->c
2af0: 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c  hannel);..  /* L
2b00: 69 6e 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e  ink the new chan
2b10: 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c  nel into the Sql
2b20: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
2b30: 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e  list. */.  p->pN
2b40: 65 78 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72  ext = pDb->pIncr
2b50: 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76  blob;.  p->pPrev
2b60: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70   = 0;.  if( p->p
2b70: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
2b80: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
2b90: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63  .  }.  pDb->pInc
2ba0: 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e  rblob = p;.  p->
2bb0: 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63  pDb = pDb;..  Tc
2bc0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
2bd0: 72 70 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f  rp, (char *)Tcl_
2be0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70  GetChannelName(p
2bf0: 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f  ->channel), TCL_
2c00: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74  VOLATILE);.  ret
2c10: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2c20: 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61  lse  /* else cla
2c30: 75 73 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66  use for "#ifndef
2c40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2c50: 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66  RBLOB" */.  #def
2c60: 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  ine closeIncrblo
2c70: 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23  bChannels(pDb).#
2c80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  endif../*.** Loo
2c90: 6b 20 61 74 20 74 68 65 20 73 63 72 69 70 74 20  k at the script 
2ca0: 70 72 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20  prefix in pCmd. 
2cb0: 20 57 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63   We will be exec
2cc0: 75 74 69 6e 67 20 74 68 69 73 20 73 63 72 69 70  uting this scrip
2cd0: 74 0a 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74  t.** after first
2ce0: 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f   appending one o
2cf0: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
2d00: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2d10: 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20  analyzes.** the 
2d20: 73 63 72 69 70 74 20 74 6f 20 73 65 65 20 69 66  script to see if
2d30: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75   it is safe to u
2d40: 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  se Tcl_EvalObjv(
2d50: 29 20 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a  ) on the script.
2d60: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74  ** rather than t
2d70: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2d80: 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54  Tcl_EvalEx().  T
2d90: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73  cl_EvalObjv() is
2da0: 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e   much.** faster.
2db0: 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74  .**.** Scripts t
2dc0: 68 61 74 20 61 72 65 20 73 61 66 65 20 74 6f 20  hat are safe to 
2dd0: 75 73 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61  use with Tcl_Eva
2de0: 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73  lObjv() consists
2df0: 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   of a.** command
2e00: 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62   name followed b
2e10: 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61  y zero or more a
2e20: 72 67 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f  rguments with no
2e30: 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f   [...] or $.** o
2e40: 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20  r {...} or ; to 
2e50: 62 65 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65  be seen anywhere
2e60: 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b  .  Most callback
2e70: 20 73 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74   scripts consist
2e80: 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69  .** of just a si
2e90: 6e 67 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e  ngle procedure n
2ea0: 61 6d 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65  ame and they mee
2eb0: 74 20 74 68 69 73 20 72 65 71 75 69 72 65 6d 65  t this requireme
2ec0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
2ed0: 74 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  t safeToUseEvalO
2ee0: 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  bjv(Tcl_Interp *
2ef0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20  interp, Tcl_Obj 
2f00: 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20  *pCmd){.  /* We 
2f10: 63 6f 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20  could try to do 
2f20: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54  something with T
2f30: 63 6c 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74  cl_Parse().  But
2f40: 20 77 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64   we will instead
2f50: 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20  .  ** just do a 
2f60: 73 65 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69  search for forbi
2f70: 64 64 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e  dden characters.
2f80: 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20    If any of the 
2f90: 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63  forbidden.  ** c
2fa0: 68 61 72 61 63 74 65 72 73 20 61 70 70 65 61 72  haracters appear
2fb0: 20 69 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c   in pCmd, we wil
2fc0: 6c 20 72 65 70 6f 72 74 20 74 68 65 20 73 74 72  l report the str
2fd0: 69 6e 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20  ing as unsafe.. 
2fe0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2ff0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *z;.  int n;.  
3000: 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  z = Tcl_GetStrin
3010: 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26  gFromObj(pCmd, &
3020: 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  n);.  while( n--
3030: 20 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20   > 0 ){.    int 
3040: 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  c = *(z++);.    
3050: 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d  if( c=='$' || c=
3060: 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29  ='[' || c==';' )
3070: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3080: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
3090: 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46  .** Find an SqlF
30a0: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 69  unc structure wi
30b0: 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d  th the given nam
30c0: 65 2e 20 20 4f 72 20 63 72 65 61 74 65 20 61 20  e.  Or create a 
30d0: 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e  new.** one if an
30e0: 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61   existing one ca
30f0: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20  nnot be found.  
3100: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
3110: 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63   to the.** struc
3120: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
3130: 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c  SqlFunc *findSql
3140: 46 75 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70  Func(SqliteDb *p
3150: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
3160: 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e  zName){.  SqlFun
3170: 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69  c *p, *pNew;.  i
3180: 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20 3d 20 28  nt i;.  pNew = (
3190: 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c  SqlFunc*)Tcl_All
31a0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
31b0: 29 20 2b 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61  ) + strlen30(zNa
31c0: 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65  me) + 1 );.  pNe
31d0: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  w->zName = (char
31e0: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f  *)&pNew[1];.  fo
31f0: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
3200: 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61   i++){ pNew->zNa
3210: 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  me[i] = tolower(
3220: 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20 70  zName[i]); }.  p
3230: 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20  New->zName[i] = 
3240: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e  0;.  for(p=pDb->
3250: 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70  pFunc; p; p=p->p
3260: 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28 20  Next){ .    if( 
3270: 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c  strcmp(p->zName,
3280: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30   pNew->zName)==0
3290: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72   ){.      Tcl_Fr
32a0: 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b  ee((char*)pNew);
32b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b  .      return p;
32c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
32d0: 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  w->interp = pDb-
32e0: 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d  >interp;.  pNew-
32f0: 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20  >pScript = 0;.  
3300: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44  pNew->pNext = pD
3310: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d  b->pFunc;.  pDb-
3320: 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20  >pFunc = pNew;. 
3330: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3340: 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  ./*.** Finalize 
3350: 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20  and free a list 
3360: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
3370: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
3380: 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43   void flushStmtC
3390: 61 63 68 65 28 20 53 71 6c 69 74 65 44 62 20 2a  ache( SqliteDb *
33a0: 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65 70  pDb ){.  SqlPrep
33b0: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
33c0: 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20 70  mt;..  while(  p
33d0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a  Db->stmtList ){.
33e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
33f0: 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74 4c  lize( pDb->stmtL
3400: 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
3410: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62    pPreStmt = pDb
3420: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
3430: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
3440: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
3450: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
3460: 65 65 28 20 28 63 68 61 72 2a 29 70 50 72 65 53  ee( (char*)pPreS
3470: 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44 62  tmt );.  }.  pDb
3480: 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->nStmt = 0;.  p
3490: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30  Db->stmtLast = 0
34a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63  ;.}../*.** TCL c
34b0: 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65 64  alls this proced
34c0: 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c 69  ure when an sqli
34d0: 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f 6d  te3 database com
34e0: 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74  mand is.** delet
34f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
3500: 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76  id DbDeleteCmd(v
3510: 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69  oid *db){.  Sqli
3520: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3530: 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75  iteDb*)db;.  flu
3540: 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29  shStmtCache(pDb)
3550: 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  ;.  closeIncrblo
3560: 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b 0a  bChannels(pDb);.
3570: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
3580: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c  pDb->db);.  whil
3590: 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b  e( pDb->pFunc ){
35a0: 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
35b0: 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63  unc = pDb->pFunc
35c0: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63  ;.    pDb->pFunc
35d0: 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b   = pFunc->pNext;
35e0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
35f0: 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
3600: 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46  ript);.    Tcl_F
3610: 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63  ree((char*)pFunc
3620: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
3630: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b  pDb->pCollate ){
3640: 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  .    SqlCollate 
3650: 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d  *pCollate = pDb-
3660: 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70  >pCollate;.    p
3670: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70  Db->pCollate = p
3680: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a  Collate->pNext;.
3690: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
36a0: 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  ar*)pCollate);. 
36b0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42   }.  if( pDb->zB
36c0: 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  usy ){.    Tcl_F
36d0: 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b  ree(pDb->zBusy);
36e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
36f0: 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63  zTrace ){.    Tc
3700: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
3710: 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ce);.  }.  if( p
3720: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
3730: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3740: 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d  ->zProfile);.  }
3750: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74  .  if( pDb->zAut
3760: 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  h ){.    Tcl_Fre
3770: 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20  e(pDb->zAuth);. 
3780: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e   }.  if( pDb->zN
3790: 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ull ){.    Tcl_F
37a0: 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  ree(pDb->zNull);
37b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
37c0: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20  pUpdateHook ){. 
37d0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
37e0: 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65  unt(pDb->pUpdate
37f0: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3800: 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48   pDb->pRollbackH
3810: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
3820: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3830: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
3840: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3850: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29  pCollateNeeded )
3860: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3870: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
3880: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d  lateNeeded);.  }
3890: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
38a0: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
38b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
38c0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
38d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
38e0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
38f0: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
3900: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
3910: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
3920: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e  ler(void *cd, in
3930: 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c  t nTries){.  Sql
3940: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3950: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3960: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61  t rc;.  char zVa
3970: 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  l[30];..  sqlite
3980: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
3990: 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22  f(zVal), zVal, "
39a0: 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20  %d", nTries);.  
39b0: 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c  rc = Tcl_VarEval
39c0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
39d0: 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a  b->zBusy, " ", z
39e0: 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Val, (char*)0);.
39f0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
3a00: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
3a10: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
3a20: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
3a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3a40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23    return 1;.}..#
3a50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3a60: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
3a70: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
3a80: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
3a90: 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72  ed as the 'progr
3aa0: 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f  ess callback' fo
3ab0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  r the database..
3ac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
3ad0: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  ProgressHandler(
3ae0: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
3af0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3b00: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3b10: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3b20: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
3b30: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  );.  rc = Tcl_Ev
3b40: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
3b50: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b  pDb->zProgress);
3b60: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
3b70: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
3b80: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
3b90: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
3ba0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
3bb0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
3bc0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
3bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
3be0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3bf0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
3c00: 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63   the SQLite trac
3c10: 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76  e handler whenev
3c20: 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63  er a new.** bloc
3c30: 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63  k of SQL is exec
3c40: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
3c50: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54  cript in pDb->zT
3c60: 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64  race is executed
3c70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3c80: 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28   DbTraceHandler(
3c90: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
3ca0: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53  char *zSql){.  S
3cb0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3cc0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
3cd0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
3ce0: 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ..  Tcl_DStringI
3cf0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
3d00: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
3d10: 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  str, pDb->zTrace
3d20: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
3d30: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
3d40: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
3d50: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
3d60: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
3d70: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
3d80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
3d90: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
3da0: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
3db0: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
3dc0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
3dd0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
3de0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3df0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
3e00: 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20   SQLite profile 
3e10: 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20  handler after a 
3e20: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c  statement.** SQL
3e30: 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20   has executed.  
3e40: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
3e50: 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  n pDb->zProfile 
3e60: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  is evaluated..*/
3e70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
3e80: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f  rofileHandler(vo
3e90: 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68  id *cd, const ch
3ea0: 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65  ar *zSql, sqlite
3eb0: 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53  _uint64 tm){.  S
3ec0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3ed0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
3ee0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
3ef0: 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d  .  char zTm[100]
3f00: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
3f10: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d  rintf(sizeof(zTm
3f20: 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22  )-1, zTm, "%lld"
3f30: 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , tm);.  Tcl_DSt
3f40: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
3f50: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
3f60: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
3f70: 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  Profile, -1);.  
3f80: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
3f90: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
3fa0: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Sql);.  Tcl_DStr
3fb0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
3fc0: 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54  (&str, zTm);.  T
3fd0: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
3fe0: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
3ff0: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
4000: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
4010: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73  &str);.  Tcl_Res
4020: 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  etResult(pDb->in
4030: 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  terp);.}.#endif.
4040: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4050: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
4060: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
4070: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20   is committed.  
4080: 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70  The.** TCL scrip
4090: 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  t in pDb->zCommi
40a0: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
40b0: 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f  If it returns no
40c0: 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20  n-zero or.** if 
40d0: 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  it throws an exc
40e0: 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e  eption, the tran
40f0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
4100: 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a  d back instead.*
4110: 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * of being commi
4120: 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tted..*/.static 
4130: 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  int DbCommitHand
4140: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
4150: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4160: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
4170: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
4180: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
4190: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
41a0: 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
41b0: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
41c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
41d0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
41e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
41f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4200: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
4210: 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  d DbRollbackHand
4220: 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74  ler(void *client
4230: 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44  Data){.  SqliteD
4240: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4250: 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  Db*)clientData;.
4260: 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52    assert(pDb->pR
4270: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20  ollbackHook);.  
4280: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
4290: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
42a0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c  nterp, pDb->pRol
42b0: 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b  lbackHook, 0) ){
42c0: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
42d0: 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e  undError(pDb->in
42e0: 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  terp);.  }.}..#i
42f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
4310: 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  TestUnlockNotify
4320: 56 61 72 73 28 54 63 6c 5f 49 6e 74 65 72 70 20  Vars(Tcl_Interp 
4330: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 69 41 72  *interp, int iAr
4340: 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20  g, int nArg){.  
4350: 63 68 61 72 20 7a 42 75 66 5b 36 34 5d 3b 0a 20  char zBuf[64];. 
4360: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
4370: 25 64 22 2c 20 69 41 72 67 29 3b 0a 20 20 54 63  %d", iArg);.  Tc
4380: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
4390: 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f   "sqlite_unlock_
43a0: 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20 7a 42 75  notify_arg", zBu
43b0: 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  f, TCL_GLOBAL_ON
43c0: 4c 59 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  LY);.  sprintf(z
43d0: 42 75 66 2c 20 22 25 64 22 2c 20 6e 41 72 67 29  Buf, "%d", nArg)
43e0: 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69  ;.  Tcl_SetVar(i
43f0: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 75  nterp, "sqlite_u
4400: 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67  nlock_notify_arg
4410: 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c 20 54 43  count", zBuf, TC
4420: 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
4430: 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
4440: 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e  e setTestUnlockN
4450: 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c 7a 29  otifyVars(x,y,z)
4460: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
4470: 76 6f 69 64 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74  void DbUnlockNot
4480: 69 66 79 28 76 6f 69 64 20 2a 2a 61 70 41 72 67  ify(void **apArg
4490: 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69  , int nArg){.  i
44a0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
44b0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
44c0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
44d0: 67 73 20 3d 20 28 54 43 4c 5f 45 56 41 4c 5f 47  gs = (TCL_EVAL_G
44e0: 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44  LOBAL|TCL_EVAL_D
44f0: 49 52 45 43 54 29 3b 0a 20 20 20 20 53 71 6c 69  IRECT);.    Sqli
4500: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
4510: 69 74 65 44 62 20 2a 29 61 70 41 72 67 5b 69 5d  iteDb *)apArg[i]
4520: 3b 0a 20 20 20 20 73 65 74 54 65 73 74 55 6e 6c  ;.    setTestUnl
4530: 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 70 44  ockNotifyVars(pD
4540: 62 2d 3e 69 6e 74 65 72 70 2c 20 69 2c 20 6e 41  b->interp, i, nA
4550: 72 67 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rg);.    assert(
4560: 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
4570: 69 66 79 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76  ify);.    Tcl_Ev
4580: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
4590: 65 72 70 2c 20 70 44 62 2d 3e 70 55 6e 6c 6f 63  erp, pDb->pUnloc
45a0: 6b 4e 6f 74 69 66 79 2c 20 66 6c 61 67 73 29 3b  kNotify, flags);
45b0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
45c0: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
45d0: 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 70  ckNotify);.    p
45e0: 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
45f0: 79 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  y = 0;.  }.}..st
4600: 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64 61  atic void DbUpda
4610: 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69  teHandler(.  voi
4620: 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c  d *p, .  int op,
4630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4640: 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  Db, .  const cha
4650: 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69  r *zTbl, .  sqli
4660: 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a 29  te_int64 rowid.)
4670: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
4680: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
4690: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  p;.  Tcl_Obj *pC
46a0: 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  md;..  assert( p
46b0: 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20  Db->pUpdateHook 
46c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  );.  assert( op=
46d0: 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c  =SQLITE_INSERT |
46e0: 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44  | op==SQLITE_UPD
46f0: 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54  ATE || op==SQLIT
4700: 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70  E_DELETE );..  p
4710: 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Cmd = Tcl_Duplic
4720: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64  ateObj(pDb->pUpd
4730: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f  ateHook);.  Tcl_
4740: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
4750: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
4760: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
4770: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
4780: 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20  tringObj(.    ( 
4790: 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45  (op==SQLITE_INSE
47a0: 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70  RT)?"INSERT":(op
47b0: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 29  ==SQLITE_UPDATE)
47c0: 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c 45 54  ?"UPDATE":"DELET
47d0: 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  E"), -1));.  Tcl
47e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
47f0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
4800: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4810: 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  zDb, -1));.  Tcl
4820: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4830: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
4840: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4850: 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zTbl, -1));.  Tc
4860: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4870: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4880: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
4890: 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c  j(rowid));.  Tcl
48a0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
48b0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
48c0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
48d0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  }..static void t
48e0: 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28  clCollateNeeded(
48f0: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
4900: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
4910: 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74  int enc,.  const
4920: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
4930: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
4940: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43  = (SqliteDb *)pC
4950: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
4960: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70  Script = Tcl_Dup
4970: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
4980: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
4990: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
49a0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54  nt(pScript);.  T
49b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
49c0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69  Element(0, pScri
49d0: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
49e0: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
49f0: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
4a00: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
4a10: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63  Script, 0);.  Tc
4a20: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
4a30: 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Script);.}../*.*
4a40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4a50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
4a60: 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c  uate an SQL coll
4a70: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
4a80: 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73  mplemented.** us
4a90: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a  ing TCL script..
4aa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
4ab0: 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76  lSqlCollate(.  v
4ac0: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
4ad0: 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nA,.  const voi
4ae0: 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
4af0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
4b00: 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  B.){.  SqlCollat
4b10: 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  e *p = (SqlColla
4b20: 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  te *)pCtx;.  Tcl
4b30: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70  _Obj *pCmd;..  p
4b40: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
4b50: 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70  ingObj(p->zScrip
4b60: 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  t, -1);.  Tcl_In
4b70: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
4b80: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
4b90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
4ba0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
4bb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
4bc0: 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c  A, nA));.  Tcl_L
4bd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4be0: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
4bf0: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4c00: 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a  ngObj(zB, nB));.
4c10: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
4c20: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
4c30: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
4c40: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
4c50: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72  Count(pCmd);.  r
4c60: 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f  eturn (atoi(Tcl_
4c70: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
4c80: 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a  p->interp)));.}.
4c90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4ca0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
4cb0: 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c   evaluate an SQL
4cc0: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
4cd0: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54  ented.** using T
4ce0: 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  CL script..*/.st
4cf0: 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71 6c  atic void tclSql
4d00: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
4d10: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
4d20: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
4d30: 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20  _value**argv){. 
4d40: 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71   SqlFunc *p = sq
4d50: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
4d60: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f  context);.  Tcl_
4d70: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74  Obj *pCmd;.  int
4d80: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
4d90: 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a   if( argc==0 ){.
4da0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
4db0: 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  are no arguments
4dc0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
4dd0: 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  , call Tcl_EvalO
4de0: 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20 20  bjEx on the.    
4df0: 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74  ** script object
4e00: 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
4e10: 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c 20   allows the TCL 
4e20: 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e 65  compiler to gene
4e30: 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  rate.    ** byte
4e40: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  code for the com
4e50: 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72 73  mand on the firs
4e60: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
4e70: 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a   thus make.    *
4e80: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  * subsequent inv
4e90: 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66 61  ocations much fa
4ea0: 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d  ster. */.    pCm
4eb0: 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a  d = p->pScript;.
4ec0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
4ed0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
4ee0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
4ef0: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
4f00: 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  md, 0);.    Tcl_
4f10: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
4f20: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
4f30: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
4f40: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
4f50: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65  e function, make
4f60: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20   a shallow copy 
4f70: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63  of the.    ** sc
4f80: 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70  ript object, lap
4f90: 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e  pend the argumen
4fa0: 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  ts, then evaluat
4fb0: 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  e the copy..    
4fc0: 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73 68  **.    ** By "sh
4fd0: 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65 20  allow" copy, we 
4fe0: 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20  mean a only the 
4ff0: 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f  outer list Tcl_O
5000: 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65 64  bj is duplicated
5010: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65 77  ..    ** The new
5020: 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e   Tcl_Obj contain
5030: 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  s pointers to th
5040: 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  e original list 
5050: 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a  elements. .    *
5060: 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e  * That way, when
5070: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
5080: 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d  is run and shimm
5090: 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65 6c  ers the first el
50a0: 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20  ement.    ** of 
50b0: 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43  the list to tclC
50c0: 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74  mdNameType, that
50d0: 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65   alternate repre
50e0: 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20  sentation will. 
50f0: 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76     ** be preserv
5100: 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  ed and reused on
5110: 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61   the next invoca
5120: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
5130: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b   Tcl_Obj **aArg;
5140: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
5150: 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f     if( Tcl_ListO
5160: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d  bjGetElements(p-
5170: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72  >interp, p->pScr
5180: 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72  ipt, &nArg, &aAr
5190: 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  g) ){.      sqli
51a0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
51b0: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
51c0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
51d0: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
51e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
51f0: 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43 6d    }     .    pCm
5200: 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  d = Tcl_NewListO
5210: 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a  bj(nArg, aArg);.
5220: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5230: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5240: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
5250: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
5260: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20  ite3_value *pIn 
5270: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20  = argv[i];.     
5280: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
5290: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
52a0: 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74     /* Set pVal t
52b0: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27  o contain the i'
52c0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69  th column of thi
52d0: 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  s row. */.      
52e0: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
52f0: 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20  value_type(pIn) 
5300: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
5310: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
5320: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
5330: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
5340: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
5350: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
5360: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
5370: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  Obj(sqlite3_valu
5380: 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74  e_blob(pIn), byt
5390: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
53a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
53b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
53c0: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
53d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
53e0: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
53f0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49  3_value_int64(pI
5400: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n);.          if
5410: 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37  ( v>=-2147483647
5420: 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34   && v<=214748364
5430: 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  7 ){.           
5440: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49   pVal = Tcl_NewI
5450: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
5460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5470: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
5480: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
5490: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  v);.          }.
54a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
54b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
54c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
54d0: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  LOAT: {.        
54e0: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c    double r = sql
54f0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
5500: 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  e(pIn);.        
5510: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
5520: 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20  DoubleObj(r);.  
5530: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5550: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
5560: 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  L: {.          p
5570: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
5580: 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a 20  ingObj("", 0);. 
5590: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
55a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
55b0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
55c0: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
55d0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
55e0: 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20  _bytes(pIn);.   
55f0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
5600: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
5610: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
5620: 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c 20  alue_text(pIn), 
5630: 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20  bytes);.        
5640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5650: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5660: 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62   rc = Tcl_ListOb
5670: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
5680: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5690: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
56a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54   rc ){.        T
56b0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
56c0: 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 73  pCmd);.        s
56d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
56e0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c  ror(context, Tcl
56f0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
5700: 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29  (p->interp), -1)
5710: 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ; .        retur
5720: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
5730: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73 65  .    if( !p->use
5740: 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20  EvalObjv ){.    
5750: 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a    /* Tcl_EvalObj
5760: 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61  Ex() will automa
5770: 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c  tically call Tcl
5780: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20 70  _EvalObjv() if p
5790: 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  Cmd.      ** is 
57a0: 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20 61  a list without a
57b0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
57c0: 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76  tation.  To prev
57d0: 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  ent this from.  
57e0: 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67      ** happening
57f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d 64  , make sure pCmd
5800: 20 68 61 73 20 61 20 76 61 6c 69 64 20 73 74 72   has a valid str
5810: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
5820: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f  on */.      Tcl_
5830: 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29 3b  GetString(pCmd);
5840: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
5850: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
5860: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
5870: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
5880: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
5890: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d  Count(pCmd);.  }
58a0: 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63  ..  if( rc && rc
58b0: 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a  !=TCL_RETURN ){.
58c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
58d0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
58e0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
58f0: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
5900: 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b  , -1); .  }else{
5910: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  .    Tcl_Obj *pV
5920: 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  ar = Tcl_GetObjR
5930: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
5940: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
5950: 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 63   u8 *data;.    c
5960: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61  har *zType = pVa
5970: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
5980: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
5990: 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20   : "";.    char 
59a0: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
59b0: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
59c0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
59d0: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
59e0: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29  pVar->bytes==0 )
59f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  {.      /* Only 
5a00: 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79  return a BLOB ty
5a10: 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61  pe if the Tcl va
5a20: 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65  riable is a byte
5a30: 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20  array and.      
5a40: 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  ** has no string
5a50: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
5a60: 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20 3d   */.      data =
5a70: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
5a80: 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  yFromObj(pVar, &
5a90: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
5aa0: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
5ab0: 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20  ntext, data, n, 
5ac0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5ad0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
5ae0: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
5af0: 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e  p(zType,"boolean
5b00: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
5b10: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
5b20: 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  (0, pVar, &n);. 
5b30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5b40: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
5b50: 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   n);.    }else i
5b60: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
5b70: 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c  cmp(zType,"doubl
5b80: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
5b90: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20  double r;.      
5ba0: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
5bb0: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72  mObj(0, pVar, &r
5bc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5bd0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
5be0: 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20  ontext, r);.    
5bf0: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77  }else if( (c=='w
5c00: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
5c10: 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29  e,"wideInt")==0)
5c20: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63   ||.          (c
5c30: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
5c40: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
5c50: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69   ){.      Tcl_Wi
5c60: 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54  deInt v;.      T
5c70: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
5c80: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76  mObj(0, pVar, &v
5c90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5ca0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
5cb0: 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d  ntext, v);.    }
5cc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74 61  else{.      data
5cd0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
5ce0: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
5cf0: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
5d00: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
5d10: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
5d20: 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 64  ntext, (char *)d
5d30: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54  ata, n, SQLITE_T
5d40: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
5d50: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
5d60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5d70: 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  ORIZATION./*.** 
5d80: 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68  This is the auth
5d90: 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74  entication funct
5da0: 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73  ion.  It appends
5db0: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
5dc0: 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65  ion.** type code
5dd0: 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67   and the two arg
5de0: 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d  uments to zCmd[]
5df0: 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68   then invokes th
5e00: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74  e result.** on t
5e10: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  he interpreter. 
5e20: 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78   The reply is ex
5e30: 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d  amined to determ
5e40: 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75  ine if the.** au
5e50: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69  thentication fai
5e60: 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a  ls or succeeds..
5e70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
5e80: 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  th_callback(.  v
5e90: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
5ea0: 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63   code,.  const c
5eb0: 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f  har *zArg1,.  co
5ec0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c  nst char *zArg2,
5ed0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5ee0: 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg3,.  const ch
5ef0: 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63  ar *zArg4.){.  c
5f00: 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63  har *zCode;.  Tc
5f10: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
5f20: 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
5f30: 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20   char *zReply;. 
5f40: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
5f50: 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67   (SqliteDb*)pArg
5f60: 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73  ;.  if( pDb->dis
5f70: 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72  ableAuth ) retur
5f80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
5f90: 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a  switch( code ){.
5fa0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5fb0: 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20  COPY            
5fc0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
5fd0: 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a  E_COPY"; break;.
5fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5ff0: 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20  CREATE_INDEX    
6000: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6010: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b  E_CREATE_INDEX";
6020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6030: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6040: 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64  ABLE      : zCod
6050: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
6060: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
6070: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6080: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
6090: 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  X : zCode="SQLIT
60a0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
60b0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
60c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
60d0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a  ATE_TEMP_TABLE :
60e0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
60f0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
6100: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6110: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6120: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a  _TEMP_TRIGGER: z
6130: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
6140: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
6150: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6160: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6170: 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43  _TEMP_VIEW  : zC
6180: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6190: 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  TE_TEMP_VIEW"; b
61a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
61b0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
61c0: 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d  GGER    : zCode=
61d0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
61e0: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
61f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6200: 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20  CREATE_VIEW     
6210: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6220: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20  E_CREATE_VIEW"; 
6230: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6240: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20  SQLITE_DELETE   
6250: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6260: 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22  ="SQLITE_DELETE"
6270: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6280: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  e SQLITE_DROP_IN
6290: 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  DEX        : zCo
62a0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
62b0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
62c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
62d0: 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20  ROP_TABLE       
62e0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
62f0: 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72  _DROP_TABLE"; br
6300: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6310: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
6320: 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22  NDEX   : zCode="
6330: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6340: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
6350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6360: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20  DROP_TEMP_TABLE 
6370: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6380: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
6390: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
63a0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
63b0: 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a  TEMP_TRIGGER : z
63c0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
63d0: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  P_TEMP_TRIGGER";
63e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
63f0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
6400: 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64  P_VIEW    : zCod
6410: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
6420: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
6430: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6440: 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20  E_DROP_TRIGGER  
6450: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6460: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
6470: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6480: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
6490: 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43  IEW         : zC
64a0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
64b0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
64c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
64d0: 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20  NSERT           
64e0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
64f0: 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b  _INSERT"; break;
6500: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6510: 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20  _PRAGMA         
6520: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6530: 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61  TE_PRAGMA"; brea
6540: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6550: 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  TE_READ         
6560: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6570: 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61  LITE_READ"; brea
6580: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6590: 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20  TE_SELECT       
65a0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
65b0: 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72  LITE_SELECT"; br
65c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
65d0: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
65e0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
65f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
6600: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
6610: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41  case SQLITE_UPDA
6620: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
6630: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50  zCode="SQLITE_UP
6640: 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  DATE"; break;.  
6650: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54    case SQLITE_AT
6660: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
6670: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6680: 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  ATTACH"; break;.
6690: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
66a0: 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20  DETACH          
66b0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
66c0: 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b  E_DETACH"; break
66d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
66e0: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20  E_ALTER_TABLE   
66f0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6700: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22  ITE_ALTER_TABLE"
6710: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6720: 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  e SQLITE_REINDEX
6730: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6740: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44  de="SQLITE_REIND
6750: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
6760: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c  case SQLITE_ANAL
6770: 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20  YZE           : 
6780: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e  zCode="SQLITE_AN
6790: 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20  ALYZE"; break;. 
67a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
67b0: 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20  REATE_VTABLE    
67c0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
67d0: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b  _CREATE_VTABLE";
67e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
67f0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41   SQLITE_DROP_VTA
6800: 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  BLE       : zCod
6810: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
6820: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
6830: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
6840: 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20  UNCTION         
6850: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6860: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61  _FUNCTION"; brea
6870: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6880: 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20  TE_SAVEPOINT    
6890: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
68a0: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b  LITE_SAVEPOINT";
68b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
68c0: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
68d0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
68e0: 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b  e="????"; break;
68f0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69  .  }.  Tcl_DStri
6900: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
6910: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
6920: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75  d(&str, pDb->zAu
6930: 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  th, -1);.  Tcl_D
6940: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
6950: 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29  ent(&str, zCode)
6960: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
6970: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
6980: 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31  r, zArg1 ? zArg1
6990: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
69a0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
69b0: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f  nt(&str, zArg2 ?
69c0: 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20   zArg2 : "");.  
69d0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
69e0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
69f0: 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22  Arg3 ? zArg3 : "
6a00: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
6a10: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
6a20: 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72  str, zArg4 ? zAr
6a30: 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d  g4 : "");.  rc =
6a40: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
6a50: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
6a60: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
6a70: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
6a80: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
6a90: 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65   zReply = Tcl_Ge
6aa0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
6ab0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  b->interp);.  if
6ac0: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
6ad0: 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20  "SQLITE_OK")==0 
6ae0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
6af0: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
6b00: 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79  f( strcmp(zReply
6b10: 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d  ,"SQLITE_DENY")=
6b20: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
6b30: 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65  QLITE_DENY;.  }e
6b40: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6b50: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47  Reply,"SQLITE_IG
6b60: 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20  NORE")==0 ){.   
6b70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e   rc = SQLITE_IGN
6b80: 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ORE;.  }else{.  
6b90: 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a    rc = 999;.  }.
6ba0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
6bb0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6bc0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
6bd0: 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65  ON */../*.** zTe
6be0: 78 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  xt is a pointer 
6bf0: 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
6c00: 20 76 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f   via an sqlite3_
6c10: 72 65 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a  result_text().**
6c20: 20 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65   or similar inte
6c30: 72 66 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74  rface. This rout
6c40: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 54 63  ine returns a Tc
6c50: 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c  l string object,
6c60: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63   .** reference c
6c70: 6f 75 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63  ount set to 0, c
6c80: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
6c90: 78 74 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61  xt. If a transla
6ca0: 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20  tion.** between 
6cb0: 69 73 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d  iso8859 and UTF-
6cc0: 38 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69  8 is required, i
6cd0: 74 20 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a  t is preformed..
6ce0: 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  */.static Tcl_Ob
6cf0: 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63  j *dbTextToObj(c
6d00: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
6d10: 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
6d20: 61 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54  al;.#ifdef UTF_T
6d30: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
6d40: 44 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  D.  Tcl_DString 
6d50: 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72  dCol;.  Tcl_DStr
6d60: 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a  ingInit(&dCol);.
6d70: 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f    Tcl_ExternalTo
6d80: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c  UtfDString(NULL,
6d90: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f   zText, -1, &dCo
6da0: 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c  l);.  pVal = Tcl
6db0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
6dc0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
6dd0: 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63  dCol), -1);.  Tc
6de0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
6df0: 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56  Col);.#else.  pV
6e00: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
6e10: 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29  ngObj(zText, -1)
6e20: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
6e30: 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pVal;.}../*.**
6e40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
6e50: 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65  ads a line of te
6e60: 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c  xt from FILE in,
6e70: 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74   stores.** the t
6e80: 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ext in memory ob
6e90: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
6ea0: 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73  oc() and returns
6eb0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6ec0: 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c   the text.  NULL
6ed0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20   is returned at 
6ee0: 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20  end of file, or 
6ef0: 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66  if malloc().** f
6f00: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails..**.** The 
6f10: 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b  interface is lik
6f20: 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74  e "readline" but
6f30: 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   no command-line
6f40: 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64   editing.** is d
6f50: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65  one..**.** copie
6f60: 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66  d from shell.c f
6f70: 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f  rom '.import' co
6f80: 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20  mmand.*/.static 
6f90: 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c  char *local_getl
6fa0: 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70  ine(char *zPromp
6fb0: 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  t, FILE *in){.  
6fc0: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69  char *zLine;.  i
6fd0: 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  nt nLine;.  int 
6fe0: 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20  n;.  int eol;.. 
6ff0: 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20   nLine = 100;.  
7000: 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  zLine = malloc( 
7010: 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a  nLine );.  if( z
7020: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
7030: 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65   0;.  n = 0;.  e
7040: 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ol = 0;.  while(
7050: 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28   !eol ){.    if(
7060: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
7070: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
7080: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
7090: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
70a0: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
70b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
70c0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
70d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
70e0: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
70f0: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
7100: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
7110: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
7120: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
7130: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7140: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
7150: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
7160: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  eol = 1;.      b
7170: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7180: 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20  while( zLine[n] 
7190: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ n++; }.    if
71a0: 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e  ( n>0 && zLine[n
71b0: 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  -1]=='\n' ){.   
71c0: 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c     n--;.      zL
71d0: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
71e0: 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d    eol = 1;.    }
71f0: 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72  .  }.  zLine = r
7200: 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e  ealloc( zLine, n
7210: 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  +1 );.  return z
7220: 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Line;.}.../*.** 
7230: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 63  Figure out the c
7240: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
7250: 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
7260: 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
7270: 6e 74 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  nt.** passed as 
7280: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
7290: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ent..**.** If pa
72a0: 72 61 6d 65 74 65 72 20 70 61 70 43 6f 6c 4e 61  rameter papColNa
72b0: 6d 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  me is not NULL, 
72c0: 74 68 65 6e 20 2a 70 61 70 43 6f 6c 4e 61 6d 65  then *papColName
72d0: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
72e0: 0a 2a 2a 20 61 74 20 61 6e 20 61 72 72 61 79 20  .** at an array 
72f0: 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
7300: 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 49 74 20  Tcl_Alloc(). It 
7310: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
7320: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
7330: 20 74 6f 20 66 72 65 65 20 74 68 69 73 20 61 72   to free this ar
7340: 72 61 79 20 75 73 69 6e 67 20 54 63 6c 5f 46 72  ray using Tcl_Fr
7350: 65 65 28 29 2c 20 61 6e 64 20 74 6f 20 64 65 63  ee(), and to dec
7360: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
7370: 65 6e 63 65 0a 2a 2a 20 63 6f 75 6e 74 20 6f 66  ence.** count of
7380: 20 65 61 63 68 20 54 63 6c 5f 4f 62 6a 2a 20 6d   each Tcl_Obj* m
7390: 65 6d 62 65 72 20 6f 66 20 74 68 65 20 61 72 72  ember of the arr
73a0: 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ay..**.** The re
73b0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
73c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
73d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
73e0: 75 6d 6e 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20  umns of data.** 
73f0: 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d  returned by pStm
7400: 74 20 28 61 6e 64 20 68 65 6e 63 65 20 74 68 65  t (and hence the
7410: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 2a 70 61   size of the *pa
7420: 70 43 6f 6c 4e 61 6d 65 20 61 72 72 61 79 29 2e  pColName array).
7430: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79  .**.** If pArray
7440: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
7450: 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74  en it contains t
7460: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c  he name of a Tcl
7470: 20 61 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62   array.** variab
7480: 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62  le. The "*" memb
7490: 65 72 20 6f 66 20 74 68 69 73 20 61 72 72 61 79  er of this array
74a0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73   is set to a lis
74b0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  t containing.** 
74c0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
74d0: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
74e0: 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
74f0: 6e 74 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f  nt, in order fro
7500: 6d 0a 2a 2a 20 6c 65 66 74 20 74 6f 20 72 69 67  m.** left to rig
7510: 68 74 2e 20 65 2e 67 2e 20 69 66 20 74 68 65 20  ht. e.g. if the 
7520: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 72 65 74  names of the ret
7530: 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  urned columns ar
7540: 65 20 61 2c 20 62 20 61 6e 64 0a 2a 2a 20 63 2c  e a, b and.** c,
7550: 20 69 74 20 64 6f 65 73 20 74 68 65 20 65 71 75   it does the equ
7560: 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65 20 74  ivalent of the t
7570: 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  cl command:.**.*
7580: 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72  *     set ${pArr
7590: 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a  ay}(*) {a b c}.*
75a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 63 6f 6d  /.static int.com
75b0: 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  puteColumnNames(
75c0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
75d0: 6e 74 65 72 70 2c 20 0a 20 20 73 71 6c 69 74 65  nterp, .  sqlite
75e0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20  3_stmt *pStmt,  
75f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7600: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
7610: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70    Tcl_Obj ***pap
7620: 43 6f 6c 4e 61 6d 65 2c 20 20 20 20 20 20 20 20  ColName,        
7630: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61      /* OUT: Arra
7640: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
7650: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
7660: 70 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20  pArray          
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
7680: 20 6f 66 20 61 72 72 61 79 20 76 61 72 69 61 62   of array variab
7690: 6c 65 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  le (may be null)
76a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f   */.){.  int nCo
76b0: 6c 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  l;..  /* Compute
76c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
76d0: 0a 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65  .  nCol = sqlite
76e0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
76f0: 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 61 70  Stmt);.  if( pap
7700: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69  ColName ){.    i
7710: 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  nt i;.    Tcl_Ob
7720: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
7730: 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41  (Tcl_Obj**)Tcl_A
7740: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c  lloc( sizeof(Tcl
7750: 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20  _Obj*)*nCol );. 
7760: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
7770: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
7780: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64  apColName[i] = d
7790: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
77a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
77b0: 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20  Stmt,i));.      
77c0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
77d0: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
77e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
77f0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69   results are bei
7800: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20  ng stored in an 
7810: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20  array variable, 
7820: 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20  then create.    
7830: 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20  ** the array(*) 
7840: 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61  entry for that a
7850: 72 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rray.    */.    
7860: 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a 20 20  if( pArray ){.  
7870: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f      Tcl_Obj *pCo
7880: 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  lList = Tcl_NewO
7890: 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  bj();.      Tcl_
78a0: 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c  Obj *pStar = Tcl
78b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a  _NewStringObj("*
78c0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 54 63  ", -1);.      Tc
78d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
78e0: 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ColList);.      
78f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
7900: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54   i++){.        T
7910: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7920: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
7930: 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e  pColList, apColN
7940: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ame[i]);.      }
7950: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
7960: 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a  efCount(pStar);.
7970: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
7980: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72  Var2(interp, pAr
7990: 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c  ray, pStar, pCol
79a0: 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 54  List,0);.      T
79b0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
79c0: 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20  pColList);.     
79d0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
79e0: 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a  t(pStar);.    }.
79f0: 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20      *papColName 
7a00: 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d  = apColName;.  }
7a10: 0a 0a 20 20 72 65 74 75 72 6e 20 6e 43 6f 6c 3b  ..  return nCol;
7a20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73  .}../*.** The "s
7a30: 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62  qlite" command b
7a40: 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e  elow creates a n
7a50: 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66  ew Tcl command f
7a60: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65  or each.** conne
7a70: 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74  ction it opens t
7a80: 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  o an SQLite data
7a90: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
7aa0: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a  ine is invoked.*
7ab0: 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f  * whenever one o
7ac0: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
7ad0: 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d  on-specific comm
7ae0: 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65 64  ands is executed
7af0: 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72  .** in Tcl.  For
7b00: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75   example, if you
7b10: 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69   run Tcl code li
7b20: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
7b30: 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 31       sqlite3 db1
7b40: 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a    "my_database".
7b50: 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f  **       db1 clo
7b60: 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  se.**.** The fir
7b70: 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73  st command opens
7b80: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
7b90: 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73   the "my_databas
7ba0: 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61  e" database.** a
7bb0: 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f  nd calls that co
7bc0: 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20  nnection "db1". 
7bd0: 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d   The second comm
7be0: 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73 0a  and causes this.
7bf0: 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  ** subroutine to
7c00: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a   be invoked..*/.
7c10: 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a  static int DbObj
7c20: 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  Cmd(void *cd, Tc
7c30: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7c40: 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
7c50: 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
7c60: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
7c70: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
7c80: 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a  ;.  int choice;.
7c90: 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f    int rc = TCL_O
7ca0: 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  K;.  static cons
7cb0: 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b  t char *DB_strs[
7cc0: 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f  ] = {.    "autho
7cd0: 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20  rizer",         
7ce0: 22 62 61 63 6b 75 70 22 2c 20 20 20 20 20 20 20  "backup",       
7cf0: 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20 20 20       "busy",.   
7d00: 20 22 63 61 63 68 65 22 2c 20 20 20 20 20 20 20   "cache",       
7d10: 20 20 20 20 20 20 20 22 63 68 61 6e 67 65 73 22         "changes"
7d20: 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f  ,           "clo
7d30: 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  se",.    "collat
7d40: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  e",            "
7d50: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
7d60: 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ",  "commit_hook
7d70: 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74 65  ",.    "complete
7d80: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ",           "co
7d90: 70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  py",            
7da0: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
7db0: 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20 22  xtension",.    "
7dc0: 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20  errorcode",     
7dd0: 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20       "eval",    
7de0: 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73 74            "exist
7df0: 73 22 2c 0a 20 20 20 20 22 66 75 6e 63 74 69 6f  s",.    "functio
7e00: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 69  n",           "i
7e10: 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  ncrblob",       
7e20: 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 0a     "interrupt",.
7e30: 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74      "last_insert
7e40: 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c 76  _rowid",  "nullv
7e50: 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20 22  alue",         "
7e60: 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20  onecolumn",.    
7e70: 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20  "profile",      
7e80: 20 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22        "progress"
7e90: 2c 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65  ,          "reke
7ea0: 79 22 2c 0a 20 20 20 20 22 72 65 73 74 6f 72 65  y",.    "restore
7eb0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 72  ",            "r
7ec0: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20  ollback_hook",  
7ed0: 20 20 20 22 73 74 61 74 75 73 22 2c 0a 20 20 20     "status",.   
7ee0: 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20   "timeout",     
7ef0: 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68         "total_ch
7f00: 61 6e 67 65 73 22 2c 20 20 20 20 20 22 74 72 61  anges",     "tra
7f10: 63 65 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61  ce",.    "transa
7f20: 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22  ction",        "
7f30: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20  unlock_notify", 
7f40: 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b      "update_hook
7f50: 22 2c 0a 20 20 20 20 22 76 65 72 73 69 6f 6e 22  ",.    "version"
7f60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20  ,            0  
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44    .  };.  enum D
7f90: 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f  B_enum {.    DB_
7fa0: 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20  AUTHORIZER,     
7fb0: 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20     DB_BACKUP,   
7fc0: 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c          DB_BUSY,
7fd0: 0a 20 20 20 20 44 42 5f 43 41 43 48 45 2c 20 20  .    DB_CACHE,  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 48             DB_CH
7ff0: 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20  ANGES,          
8000: 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42  DB_CLOSE,.    DB
8010: 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20  _COLLATE,       
8020: 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e      DB_COLLATION
8030: 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d  _NEEDED, DB_COMM
8040: 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f  IT_HOOK,.    DB_
8050: 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20  COMPLETE,       
8060: 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20     DB_COPY,     
8070: 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c          DB_ENABL
8080: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
8090: 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f  ,.    DB_ERRORCO
80a0: 44 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45  DE,         DB_E
80b0: 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20  VAL,            
80c0: 20 44 42 5f 45 58 49 53 54 53 2c 0a 20 20 20 20   DB_EXISTS,.    
80d0: 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20  DB_FUNCTION,    
80e0: 20 20 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f        DB_INCRBLO
80f0: 42 2c 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e  B,         DB_IN
8100: 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44 42 5f  TERRUPT,.    DB_
8110: 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49  LAST_INSERT_ROWI
8120: 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c  D, DB_NULLVALUE,
8130: 20 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f          DB_ONECO
8140: 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 4f  LUMN,.    DB_PRO
8150: 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20  FILE,           
8160: 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20 20  DB_PROGRESS,    
8170: 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 0a 20       DB_REKEY,. 
8180: 20 20 20 44 42 5f 52 45 53 54 4f 52 45 2c 20 20     DB_RESTORE,  
8190: 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c           DB_ROLL
81a0: 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20 44 42  BACK_HOOK,    DB
81b0: 5f 53 54 41 54 55 53 2c 0a 20 20 20 20 44 42 5f  _STATUS,.    DB_
81c0: 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20  TIMEOUT,        
81d0: 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e     DB_TOTAL_CHAN
81e0: 47 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45  GES,    DB_TRACE
81f0: 2c 0a 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43  ,.    DB_TRANSAC
8200: 54 49 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55  TION,       DB_U
8210: 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 20 20 20  NLOCK_NOTIFY,   
8220: 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c   DB_UPDATE_HOOK,
8230: 0a 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c  .    DB_VERSION,
8240: 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74  .  };.  /* don't
8250: 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20   leave trailing 
8260: 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75  commas on DB_enu
8270: 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74  m, it confuses t
8280: 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69  he AIX xlc compi
8290: 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ler */..  if( ob
82a0: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
82b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
82c0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
82d0: 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b  UBCOMMAND ...");
82e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
82f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
8300: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
8310: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
8320: 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22  v[1], DB_strs, "
8330: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f  option", 0, &cho
8340: 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ice) ){.    retu
8350: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8360: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e  }..  switch( (en
8370: 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63  um DB_enum)choic
8380: 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64  e ){..  /*    $d
8390: 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41  b authorizer ?CA
83a0: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
83b0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
83c0: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  en callback to a
83d0: 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51  uthorize each SQ
83e0: 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69  L operation as i
83f0: 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c  t is.  ** compil
8400: 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73  ed.  5 arguments
8410: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
8420: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65   the callback be
8430: 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  fore it is.  ** 
8440: 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20  invoked:.  **.  
8450: 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74  **   (1) The aut
8460: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20  horization type 
8470: 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41  (ex: SQLITE_CREA
8480: 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45  TE_TABLE, SQLITE
8490: 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20  _INSERT, ...).  
84a0: 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64  **   (2) First d
84b0: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20  escriptive name 
84c0: 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68  (depends on auth
84d0: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a  orization type).
84e0: 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e    **   (3) Secon
84f0: 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  d descriptive na
8500: 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61  me.  **   (4) Na
8510: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
8520: 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20  se (ex: "main", 
8530: 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28  "temp").  **   (
8540: 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  5) Name of trigg
8550: 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67  er that is doing
8560: 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a   the access.  **
8570: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  .  ** The callba
8580: 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ck should return
8590: 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f   on of the follo
85a0: 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51  wing strings: SQ
85b0: 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51  LITE_OK,.  ** SQ
85c0: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20  LITE_IGNORE, or 
85d0: 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e  SQLITE_DENY.  An
85e0: 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
85f0: 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72  alue is an error
8600: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
8610: 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e  his method is in
8620: 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72  voked with no ar
8630: 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72  guments, the cur
8640: 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69  rent authorizati
8650: 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  on.  ** callback
8660: 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
8670: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
8680: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20   DB_AUTHORIZER: 
8690: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
86a0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
86b0: 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ON.    Tcl_Appen
86c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
86d0: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e  "authorization n
86e0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
86f0: 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b  this build", 0);
8700: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8710: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
8720: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
8730: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
8740: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
8750: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
8760: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
8770: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8780: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
8790: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
87a0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
87b0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
87c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
87d0: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a  pDb->zAuth, 0);.
87e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
87f0: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
8800: 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20  Auth;.      int 
8810: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
8820: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
8830: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
8840: 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20  b->zAuth);.     
8850: 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d   }.      zAuth =
8860: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8870: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
8880: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
8890: 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29  zAuth && len>0 )
88a0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
88b0: 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Auth = Tcl_Alloc
88c0: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
88d0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
88e0: 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c  >zAuth, zAuth, l
88f0: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
8900: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
8910: 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >zAuth = 0;.    
8920: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
8930: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
8940: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
8950: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
8960: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
8970: 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62  thorizer(pDb->db
8980: 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c  , auth_callback,
8990: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
89a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
89b0: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
89c0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
89d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
89e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
89f0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
8a00: 24 64 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41  $db backup ?DATA
8a10: 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20  BASE? FILENAME. 
8a20: 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72   **.  ** Open or
8a30: 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
8a40: 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49  se file named FI
8a50: 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65  LENAME.  Transfe
8a60: 72 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65  r the.  ** conte
8a70: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  nt of local data
8a80: 62 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64  base DATABASE (d
8a90: 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20  efault: "main") 
8aa0: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49  into the.  ** FI
8ab0: 4c 45 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e  LENAME database.
8ac0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
8ad0: 42 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f  BACKUP: {.    co
8ae0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46  nst char *zDestF
8af0: 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
8b00: 68 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20  har *zSrcDb;.   
8b10: 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b   sqlite3 *pDest;
8b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
8b30: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20  kup *pBackup;.. 
8b40: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
8b50: 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d  {.      zSrcDb =
8b60: 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a   "main";.      z
8b70: 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47  DestFile = Tcl_G
8b80: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
8b90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8ba0: 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
8bb0: 20 20 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47    zSrcDb = Tcl_G
8bc0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
8bd0: 29 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69  );.      zDestFi
8be0: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
8bf0: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
8c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
8c10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8c20: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
8c30: 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45  "?DATABASE? FILE
8c40: 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65  NAME");.      re
8c50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8c60: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
8c70: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73  qlite3_open(zDes
8c80: 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a  tFile, &pDest);.
8c90: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
8ca0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  TE_OK ){.      T
8cb0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8cc0: 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20  interp, "cannot 
8cd0: 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61 74 61  open target data
8ce0: 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20  base: ",.       
8cf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
8d00: 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72  sg(pDest), (char
8d10: 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
8d20: 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
8d30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8d40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8d50: 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
8d60: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
8d70: 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c  t(pDest, "main",
8d80: 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62   pDb->db, zSrcDb
8d90: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
8da0: 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  up==0 ){.      T
8db0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8dc0: 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20  interp, "backup 
8dd0: 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20  failed: ",.     
8de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
8df0: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
8e00: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
8e10: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
8e20: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
8e30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8e40: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72  }.    while(  (r
8e50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
8e60: 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
8e70: 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
8e80: 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33   ){}.    sqlite3
8e90: 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
8ea0: 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
8eb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
8ec0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
8ed0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
8ee0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8ef0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8f00: 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a   "backup failed:
8f10: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
8f20: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
8f30: 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  est), (char*)0);
8f40: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
8f50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8f60: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
8f70: 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  Dest);.    break
8f80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
8f90: 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43  db busy ?CALLBAC
8fa0: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
8fb0: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
8fc0: 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c  llback if an SQL
8fd0: 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d   statement attem
8fe0: 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  pts to open.  **
8ff0: 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61   a locked databa
9000: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
9010: 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a  case DB_BUSY: {.
9020: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
9030: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
9040: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9050: 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42   2, objv, "CALLB
9060: 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
9070: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9080: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
9090: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
90a0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
90b0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
90c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
90d0: 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b   pDb->zBusy, 0);
90e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
90f0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
9100: 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74  zBusy;.      int
9110: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
9120: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
9130: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
9140: 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20  Db->zBusy);.    
9150: 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20    }.      zBusy 
9160: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
9170: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
9180: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
9190: 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20   zBusy && len>0 
91a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
91b0: 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zBusy = Tcl_Allo
91c0: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
91d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
91e0: 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20  ->zBusy, zBusy, 
91f0: 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
9200: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
9210: 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20  ->zBusy = 0;.   
9220: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
9230: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
9240: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
9250: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
9260: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
9270: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
9280: 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20   DbBusyHandler, 
9290: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
92a0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
92b0: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
92c0: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
92d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
92e0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
92f0: 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65  /*     $db cache
9300: 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20   flush.  **     
9310: 24 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e  $db cache size n
9320: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68  .  **.  ** Flush
9330: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
9340: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f  atement cache, o
9350: 72 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  r set the maximu
9360: 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  m number of.  **
9370: 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e   cached statemen
9380: 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ts..  */.  case 
9390: 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  DB_CACHE: {.    
93a0: 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20  char *subCmd;.  
93b0: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66    int n;..    if
93c0: 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20  ( objc<=2 ){.   
93d0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
93e0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
93f0: 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69  bjv, "cache opti
9400: 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20  on ?arg?");.    
9410: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9420: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75  OR;.    }.    su
9430: 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74  bCmd = Tcl_GetSt
9440: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a  ringFromObj( obj
9450: 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69  v[2], 0 );.    i
9460: 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20  f( *subCmd=='f' 
9470: 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64  && strcmp(subCmd
9480: 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a  ,"flush")==0 ){.
9490: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
94a0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
94b0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
94c0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
94d0: 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20  flush");.       
94e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
94f0: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
9500: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
9510: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
9520: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
9530: 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73   if( *subCmd=='s
9540: 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43  ' && strcmp(subC
9550: 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b  md,"size")==0 ){
9560: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
9570: 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =4 ){.        Tc
9580: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
9590: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
95a0: 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20  "size n");.     
95b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
95c0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
95d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43  {.        if( TC
95e0: 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74  L_ERROR==Tcl_Get
95f0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
9600: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20  p, objv[3], &n) 
9610: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
9620: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
9630: 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63  nterp, "cannot c
9640: 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20 20 20  onvert \"", .   
9650: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
9660: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9670: 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22  (objv[3],0), "\"
9680: 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20 30 29   to integer", 0)
9690: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
96a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
96b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
96c0: 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29         if( n<0 )
96d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c  {.            fl
96e0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44  ushStmtCache( pD
96f0: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b );.           
9700: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
9710: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41    }else if( n>MA
9720: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
9730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9740: 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44  n = MAX_PREPARED
9750: 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20  _STMTS;.        
9760: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44    }.          pD
9770: 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a  b->maxStmt = n;.
9780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9790: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
97a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
97b0: 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61  ult( interp, "ba
97c0: 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20  d option \"", . 
97d0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
97e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
97f0: 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d  jv[2],0), "\": m
9800: 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20  ust be flush or 
9810: 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  size", 0);.     
9820: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9830: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
9840: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
9850: 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20    $db changes.  
9860: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
9870: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
9880: 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69  s that were modi
9890: 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20  fied, inserted, 
98a0: 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20  or deleted by.  
98b0: 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ** the most rece
98c0: 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  nt INSERT, UPDAT
98d0: 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
98e0: 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75  ement, not inclu
98f0: 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63  ding .  ** any c
9900: 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
9910: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
9920: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
9930: 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54  CHANGES: {.    T
9940: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
9950: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
9960: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
9970: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9980: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
9990: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
99a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
99b0: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
99c0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
99d0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
99e0: 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
99f0: 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  , sqlite3_change
9a00: 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20  s(pDb->db));.   
9a10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
9a20: 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20  *    $db close. 
9a30: 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77   **.  ** Shutdow
9a40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
9a50: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c   */.  case DB_CL
9a60: 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44  OSE: {.    Tcl_D
9a70: 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  eleteCommand(int
9a80: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
9a90: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
9aa0: 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61  ], 0));.    brea
9ab0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
9ac0: 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
9ad0: 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20  e NAME SCRIPT.  
9ae0: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
9af0: 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
9b00: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
9b10: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
9b20: 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
9b30: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
9b40: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
9b50: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
9b60: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
9b70: 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a  case DB_COLLATE:
9b80: 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74   {.    SqlCollat
9b90: 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  e *pCollate;.   
9ba0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
9bb0: 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b    char *zScript;
9bc0: 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74  .    int nScript
9bd0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
9be0: 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  4 ){.      Tcl_W
9bf0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
9c00: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41  rp, 2, objv, "NA
9c10: 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20  ME SCRIPT");.   
9c20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9c30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
9c40: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
9c50: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
9c60: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63  [2], 0);.    zSc
9c70: 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  ript = Tcl_GetSt
9c80: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
9c90: 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a  [3], &nScript);.
9ca0: 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28      pCollate = (
9cb0: 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f  SqlCollate*)Tcl_
9cc0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
9cd0: 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69  Collate) + nScri
9ce0: 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  pt + 1 );.    if
9cf0: 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20  ( pCollate==0 ) 
9d00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9d10: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
9d20: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
9d30: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  .    pCollate->p
9d40: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c  Next = pDb->pCol
9d50: 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  late;.    pColla
9d60: 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63  te->zScript = (c
9d70: 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31  har*)&pCollate[1
9d80: 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c  ];.    pDb->pCol
9d90: 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b  late = pCollate;
9da0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c  .    memcpy(pCol
9db0: 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a  late->zScript, z
9dc0: 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74 2b  Script, nScript+
9dd0: 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  1);.    if( sqli
9de0: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
9df0: 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
9e00: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
9e10: 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  , .        pColl
9e20: 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61  ate, tclSqlColla
9e30: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  te) ){.      Tcl
9e40: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
9e50: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
9e60: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
9e70: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
9e80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9e90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9ea0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
9eb0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
9ec0: 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  db collation_nee
9ed0: 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ded SCRIPT.  **.
9ee0: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
9ef0: 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
9f00: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
9f10: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
9f20: 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
9f30: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
9f40: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
9f50: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
9f60: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
9f70: 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e  e DB_COLLATION_N
9f80: 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28  EEDED: {.    if(
9f90: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
9fa0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
9fb0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
9fc0: 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
9fd0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9fe0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9ff0: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
a000: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
a010: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
a020: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
a030: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  Needed);.    }. 
a040: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
a050: 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70  Needed = Tcl_Dup
a060: 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32  licateObj(objv[2
a070: 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  ]);.    Tcl_Incr
a080: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
a090: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
a0a0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61     sqlite3_colla
a0b0: 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d  tion_needed(pDb-
a0c0: 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c  >db, pDb, tclCol
a0d0: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
a0e0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
a0f0: 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f  *    $db commit_
a100: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  hook ?CALLBACK?.
a110: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
a120: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
a130: 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ack just before 
a140: 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79  committing every
a150: 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   SQL transaction
a160: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
a170: 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e  llback throws an
a180: 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65   exception or re
a190: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
a1a0: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72  then the.  ** tr
a1b0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f  ansaction is abo
a1c0: 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41  rted.  If CALLBA
a1d0: 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  CK is an empty s
a1e0: 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62  tring, the callb
a1f0: 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ack.  ** is disa
a200: 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  bled..  */.  cas
a210: 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b  e DB_COMMIT_HOOK
a220: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
a230: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
a240: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
a250: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
a260: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
a270: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a280: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
a290: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
a2a0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
a2b0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
a2c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a2d0: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  (interp, pDb->zC
a2e0: 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  ommit, 0);.     
a2f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
a300: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
a310: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
a320: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
a330: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
a340: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
a350: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
a360: 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
a370: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
a380: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
a390: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
a3a0: 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
a3b0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
a3c0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
a3d0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
a3e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
a3f0: 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
a400: 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29   zCommit, len+1)
a410: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a420: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
a430: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  mit = 0;.      }
a440: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
a450: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
a460: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
a470: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
a480: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
a490: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62  hook(pDb->db, Db
a4a0: 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70  CommitHandler, p
a4b0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
a4c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a4d0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
a4e0: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
a4f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a500: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
a510: 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
a520: 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
a530: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
a540: 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
a550: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
a560: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
a570: 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
a580: 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
a590: 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
a5a0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
a5b0: 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
a5c0: 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
a5d0: 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
a5e0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
a5f0: 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e  COMPLETE: {.#ifn
a600: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a610: 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c  COMPLETE.    Tcl
a620: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
a630: 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74     int isComplet
a640: 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
a650: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
a660: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
a670: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
a680: 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  QL");.      retu
a690: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a6a0: 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65    }.    isComple
a6b0: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  te = sqlite3_com
a6c0: 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74  plete( Tcl_GetSt
a6d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
a6e0: 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  [2], 0) );.    p
a6f0: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
a700: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
a710: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f  );.    Tcl_SetBo
a720: 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74  oleanObj(pResult
a730: 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23  , isComplete);.#
a740: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
a750: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
a760: 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d  b copy conflict-
a770: 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20  algorithm table 
a780: 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41  filename ?SEPARA
a790: 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
a7a0: 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  TOR?.  **.  ** C
a7b0: 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61  opy data into ta
a7c0: 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d  ble from filenam
a7d0: 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73  e, optionally us
a7e0: 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20  ing SEPARATOR.  
a7f0: 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70  ** as column sep
a800: 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63  arators.  If a c
a810: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
a820: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72   null string, or
a830: 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20   the.  ** value 
a840: 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52  of NULLINDICATOR
a850: 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65  , a NULL is inse
a860: 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  rted for the col
a870: 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69  umn..  ** confli
a880: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  ct-algorithm is 
a890: 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  one of the sqlit
a8a0: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
a8b0: 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72  ithms:.  **    r
a8c0: 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20  ollback, abort, 
a8d0: 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65  fail, ignore, re
a8e0: 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75  place.  ** On su
a8f0: 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68  ccess, return th
a900: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  e number of line
a910: 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74  s processed, not
a920: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d   necessarily sam
a930: 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68  e.  ** as 'db ch
a940: 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f  anges' due to co
a950: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
a960: 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a   selected..  **.
a970: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69    ** This code i
a980: 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69  s basically an i
a990: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e  mplementation/en
a9a0: 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a  hancement of.  *
a9b0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68  * the sqlite3 sh
a9c0: 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20  ell.c ".import" 
a9d0: 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20  command..  **.  
a9e0: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
a9f0: 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c  usage is equival
aa00: 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ent to the sqlit
aa10: 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d  e2.x COPY statem
aa20: 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20  ent,.  ** which 
aa30: 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74  imports file dat
aa40: 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75  a into a table u
aa50: 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65  sing the Postgre
aa60: 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f  SQL COPY file fo
aa70: 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62  rmat:.  **   $db
aa80: 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61   copy $conflit_a
aa90: 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20  lgo $table_name 
aaa0: 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e  $filename \t \\N
aab0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
aac0: 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72  COPY: {.    char
aad0: 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *zTable;       
aae0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
aaf0: 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  t data into this
ab00: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68   table */.    ch
ab10: 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
ab20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ab30: 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
ab40: 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61   to extract data
ab50: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
ab60: 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20  onflict;        
ab70: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c      /* The confl
ab80: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  ict algorithm to
ab90: 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69   use */.    sqli
aba0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
abb0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61          /* A sta
abc0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
abd0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
abe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
abf0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
ac00: 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
ac10: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
ac40: 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69  s in an SQL stri
ac50: 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  ng */.    int i,
ac60: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
ac70: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
ac80: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e  unters */.    in
ac90: 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
aca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
acb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
acc0: 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  zSep[] */.    in
acd0: 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  t nNull;        
ace0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
acf0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
ad00: 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63  zNull[] */.    c
ad10: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
ad20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
ad30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
ad40: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e  /.    char *zLin
ad50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ad60: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69    /* A single li
ad70: 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d  ne of input from
ad80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
ad90: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20   char **azCol;  
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
adb0: 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75  zLine[] broken u
adc0: 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a  p into columns *
add0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d  /.    char *zCom
ade0: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
adf0: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d    /* How to comm
ae00: 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  it changes */.  
ae10: 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae30: 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   The input file 
ae40: 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e  */.    int linen
ae50: 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
ae60: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
ae70: 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  r of input file 
ae80: 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e  */.    char zLin
ae90: 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20  eNum[80];       
aea0: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
aeb0: 72 20 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a  r print buffer *
aec0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
aed0: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
aee0: 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75    /* interp resu
aef0: 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20  lt */..    char 
af00: 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68 61 72 20  *zSep;.    char 
af10: 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20  *zNull;.    if( 
af20: 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37  objc<5 || objc>7
af30: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
af40: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
af50: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20  p, 2, objv, .   
af60: 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d        "CONFLICT-
af70: 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20  ALGORITHM TABLE 
af80: 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41  FILENAME ?SEPARA
af90: 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
afa0: 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  TOR?");.      re
afb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
afc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
afd0: 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=6 ){.      z
afe0: 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sep = Tcl_GetStr
aff0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
b000: 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  5], 0);.    }els
b010: 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  e{.      zSep = 
b020: 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  "\t";.    }.    
b030: 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20  if( objc>=7 ){. 
b040: 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c       zNull = Tcl
b050: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
b060: 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20  j(objv[6], 0);. 
b070: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b080: 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20  zNull = "";.    
b090: 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20  }.    zConflict 
b0a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
b0b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
b0c0: 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d  0);.    zTable =
b0d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
b0e0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30  omObj(objv[3], 0
b0f0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54  );.    zFile = T
b100: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
b110: 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b  Obj(objv[4], 0);
b120: 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c  .    nSep = strl
b130: 65 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20 20 20  en30(zSep);.    
b140: 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 33 30  nNull = strlen30
b150: 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28  (zNull);.    if(
b160: 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   nSep==0 ){.    
b170: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b180: 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
b190: 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72  : non-null separ
b1a0: 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f  ator required fo
b1b0: 72 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20 20  r copy",0);.    
b1c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b1d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
b1e0: 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63  (strcmp(zConflic
b1f0: 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21  t, "rollback") !
b200: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
b210: 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
b220: 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30  "abort"   ) != 0
b230: 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d   &&.       strcm
b240: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61  p(zConflict, "fa
b250: 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26  il"    ) != 0 &&
b260: 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
b270: 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72  Conflict, "ignor
b280: 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  e"  ) != 0 &&.  
b290: 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
b2a0: 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22  flict, "replace"
b2b0: 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20   ) != 0 ) {.    
b2c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b2d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
b2e0: 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63  r: \"", zConflic
b2f0: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
b300: 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  "\", conflict-al
b310: 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20  gorithm must be 
b320: 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b  one of: rollback
b330: 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
b340: 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67  "abort, fail, ig
b350: 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65  nore, or replace
b360: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
b370: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b380: 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
b390: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
b3a0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
b3b0: 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
b3c0: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
b3d0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
b3e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b3f0: 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
b400: 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
b410: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  e, 0);.      ret
b420: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b430: 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
b440: 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
b450: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b460: 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
b470: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
b480: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
b490: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
b4a0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
b4b0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
b4c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
b4d0: 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
b4e0: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
b4f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c  , 0);.      nCol
b500: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
b510: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71  .      nCol = sq
b520: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
b530: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  nt(pStmt);.    }
b540: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
b550: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
b560: 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
b570: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
b580: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
b590: 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f      zSql = mallo
b5a0: 63 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20  c( nByte + 50 + 
b5b0: 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66  nCol*2 );.    if
b5c0: 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20  ( zSql==0 ) {.  
b5d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b5e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
b5f0: 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f  ror: can't mallo
b600: 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  c()", 0);.      
b610: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b620: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b630: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79  te3_snprintf(nBy
b640: 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e  te+50, zSql, "IN
b650: 53 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20  SERT OR %q INTO 
b660: 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a  '%q' VALUES(?",.
b670: 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69           zConfli
b680: 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ct, zTable);.   
b690: 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
b6a0: 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
b6b0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
b6c0: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
b6d0: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
b6e0: 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
b6f0: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
b700: 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
b710: 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
b720: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
b730: 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
b740: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
b750: 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29  ;.    free(zSql)
b760: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
b770: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
b780: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b790: 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  Error: ", sqlite
b7a0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
b7b0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  ), 0);.      sql
b7c0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
b7d0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
b7e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b7f0: 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70    }.    in = fop
b800: 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b  en(zFile, "rb");
b810: 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
b820: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
b830: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b840: 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
b850: 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46  open file: ", zF
b860: 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ile, NULL);.    
b870: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
b880: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
b890: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b8a0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43  R;.    }.    azC
b8b0: 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a  ol = malloc( siz
b8c0: 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e  eof(azCol[0])*(n
b8d0: 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  Col+1) );.    if
b8e0: 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20  ( azCol==0 ) {. 
b8f0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
b900: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
b910: 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c  rror: can't mall
b920: 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  oc()", 0);.     
b930: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
b940: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b950: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  ROR;.    }.    (
b960: 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65  void)sqlite3_exe
b970: 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49  c(pDb->db, "BEGI
b980: 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
b990: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d    zCommit = "COM
b9a0: 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28  MIT";.    while(
b9b0: 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f   (zLine = local_
b9c0: 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21  getline(0, in))!
b9d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
b9e0: 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d 20 30   *z;.      i = 0
b9f0: 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  ;.      lineno++
ba00: 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d  ;.      azCol[0]
ba10: 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20   = zLine;.      
ba20: 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65  for(i=0, z=zLine
ba30: 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20  ; *z; z++){.    
ba40: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70      if( *z==zSep
ba50: 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28 7a  [0] && strncmp(z
ba60: 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30  , zSep, nSep)==0
ba70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a   ){.          *z
ba80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
ba90: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  i++;.          i
baa0: 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20  f( i<nCol ){.   
bab0: 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69           azCol[i
bac0: 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20  ] = &z[nSep];.  
bad0: 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e            z += n
bae0: 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  Sep-1;.         
baf0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
bb00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
bb10: 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  +1!=nCol ){.    
bb20: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a      char *zErr;.
bb30: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72          int nErr
bb40: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46 69 6c   = strlen30(zFil
bb50: 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20 20  e) + 200;.      
bb60: 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28    zErr = malloc(
bb70: 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 69  nErr);.        i
bb80: 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
bb90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
bba0: 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72 72  rintf(nErr, zErr
bbb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
bbc0: 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25  Error: %s line %
bbd0: 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
bbe0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62  olumns of data b
bbf0: 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20  ut found %d",.  
bc00: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
bc10: 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20  , lineno, nCol, 
bc20: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
bc30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bc40: 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30  (interp, zErr, 0
bc50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65  );.          fre
bc60: 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20  e(zErr);.       
bc70: 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d   }.        zComm
bc80: 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  it = "ROLLBACK";
bc90: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
bcb0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
bcc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
bcd0: 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64  check for null d
bce0: 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64  ata, if so, bind
bcf0: 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   as null */.    
bd00: 20 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30      if( (nNull>0
bd10: 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c   && strcmp(azCol
bd20: 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a  [i], zNull)==0).
bd30: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72            || str
bd40: 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d  len30(azCol[i])=
bd50: 3d 30 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  =0 .        ){. 
bd60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bd70: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
bd80: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
bd90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
bda0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
bdb0: 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61  xt(pStmt, i+1, a
bdc0: 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c  zCol[i], -1, SQL
bdd0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
bde0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
bdf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
be00: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
be10: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
be20: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
be30: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
be40: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
be50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
be60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
be70: 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
be80: 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
be90: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
bea0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74  .        zCommit
beb0: 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   = "ROLLBACK";. 
bec0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bed0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bee0: 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20  free(azCol);.   
bef0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
bf00: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
bf10: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76  e(pStmt);.    (v
bf20: 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
bf30: 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69  (pDb->db, zCommi
bf40: 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  t, 0, 0, 0);..  
bf50: 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d    if( zCommit[0]
bf60: 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20   == 'C' ){.     
bf70: 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74   /* success, set
bf80: 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65   result as numbe
bf90: 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
bfa0: 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52  ssed */.      pR
bfb0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
bfc0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
bfd0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49  ;.      Tcl_SetI
bfe0: 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c  ntObj(pResult, l
bff0: 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  ineno);.      rc
c000: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
c010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66  else{.      /* f
c020: 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c  ailure, append l
c030: 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c  ineno where fail
c040: 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
c050: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
c060: 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a  eof(zLineNum), z
c070: 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e  LineNum,"%d",lin
c080: 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  eno);.      Tcl_
c090: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
c0a0: 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68  erp,", failed wh
c0b0: 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  ile processing l
c0c0: 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c  ine: ",zLineNum,
c0d0: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
c0e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
c0f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
c100: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
c110: 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74   enable_load_ext
c120: 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20  ension BOOLEAN. 
c130: 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68   **.  ** Turn th
c140: 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64  e extension load
c150: 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f  ing feature on o
c160: 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66  r off.  It if of
c170: 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c  f by.  ** defaul
c180: 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t..  */.  case D
c190: 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  B_ENABLE_LOAD_EX
c1a0: 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64  TENSION: {.#ifnd
c1b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
c1c0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
c1d0: 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20    int onoff;.   
c1e0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
c1f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
c200: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
c210: 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e  , objv, "BOOLEAN
c220: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
c230: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c240: 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  }.    if( Tcl_Ge
c250: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
c260: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
c270: 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20   &onoff) ){.    
c280: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c290: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
c2a0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
c2b0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d  d_extension(pDb-
c2c0: 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20  >db, onoff);.   
c2d0: 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20   break;.#else.  
c2e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
c2f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65  lt(interp, "exte
c300: 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73  nsion loading is
c310: 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63   turned off at c
c320: 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20  ompile-time",.  
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72     0);.    retur
c350: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e  n TCL_ERROR;.#en
c360: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  dif.  }..  /*.  
c370: 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63  **    $db errorc
c380: 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ode.  **.  ** Re
c390: 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63  turn the numeric
c3a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
c3b0: 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79   was returned by
c3c0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
c3d0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
c3e0: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20  lite3_exec()..  
c3f0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52  */.  case DB_ERR
c400: 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63  ORCODE: {.    Tc
c410: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
c420: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
c430: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  tObj(sqlite3_err
c440: 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b  code(pDb->db)));
c450: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
c460: 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20     .  /*.  **   
c470: 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f   $db eval $sql ?
c480: 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f  array? ?{  ...co
c490: 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20  de... }?.  **   
c4a0: 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24   $db onecolumn $
c4b0: 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  sql.  **.  ** Th
c4c0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
c4d0: 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75  in $sql is evalu
c4e0: 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20  ated.  For each 
c4f0: 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20  row, the values 
c500: 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20  are.  ** placed 
c510: 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  in elements of t
c520: 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22  he array named "
c530: 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f  array" and ...co
c540: 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65  de... is execute
c550: 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
c560: 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72  y" and "code" ar
c570: 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  e omitted, then 
c580: 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65  no callback is e
c590: 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20  very invoked..  
c5a0: 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73  ** If "array" is
c5b0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
c5c0: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
c5d0: 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20  s are placed in 
c5e0: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74  variables.  ** t
c5f0: 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  hat have the sam
c600: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69  e name as the fi
c610: 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62  elds extracted b
c620: 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  y the query..  *
c630: 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f  *.  ** The oneco
c640: 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74  lumn method is t
c650: 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  he equivalent of
c660: 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65  :.  **     linde
c670: 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c  x [$db eval $sql
c680: 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ] 0.  */.  case 
c690: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20  DB_ONECOLUMN:.  
c6a0: 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20  case DB_EVAL:.  
c6b0: 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20  case DB_EXISTS: 
c6c0: 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
c6d0: 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20   *zSql;      /* 
c6e0: 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  Next SQL stateme
c6f0: 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f  nt to execute */
c700: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
c710: 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57  *zLeft;     /* W
c720: 68 61 74 20 69 73 20 6c 65 66 74 20 61 66 74 65  hat is left afte
c730: 72 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20  r first stmt in 
c740: 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69  zSql */.    sqli
c750: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
c760: 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53     /* Compiled S
c770: 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20  QL statment */. 
c780: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72     Tcl_Obj *pArr
c790: 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ay;       /* Nam
c7a0: 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20  e of array into 
c7b0: 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61 72  which results ar
c7c0: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
c7d0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
c7e0: 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70  t;      /* Scrip
c7f0: 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63  t to run for eac
c800: 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  h result set */.
c810: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70      Tcl_Obj **ap
c820: 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61  Parm;      /* Pa
c830: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65  rameters that ne
c840: 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66  ed a Tcl_DecrRef
c850: 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69  Count() */.    i
c860: 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20  nt nParm;       
c870: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c880: 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65 64 20  of entries used 
c890: 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20  in apParm[] */. 
c8a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72     Tcl_Obj *aPar
c8b0: 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61  m[10];    /* Sta
c8c0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 70  tic space for ap
c8d0: 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f  Parm[] in the co
c8e0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
c8f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20   Tcl_Obj *pRet; 
c900: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
c910: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
c920: 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72  */.    SqlPrepar
c930: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
c940: 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ;  /* Pointer to
c950: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
c960: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
c970: 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63   rc2;..    if( c
c980: 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29  hoice==DB_EVAL )
c990: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
c9a0: 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a  <3 || objc>5 ){.
c9b0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
c9c0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c9d0: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f   2, objv, "SQL ?
c9e0: 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52  ARRAY-NAME? ?SCR
c9f0: 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20  IPT?");.        
ca00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ca10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ca20: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
ca30: 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  j();.      Tcl_I
ca40: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
ca50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ca60: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
ca70: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
ca80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
ca90: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
caa0: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  L");.        ret
cab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
cad0: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53   choice==DB_EXIS
cae0: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  TS ){.        pR
caf0: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  et = Tcl_NewBool
cb00: 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20  eanObj(0);.     
cb10: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
cb20: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
cb30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cb40: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
cb50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
cb60: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
cb70: 20 70 41 72 72 61 79 20 3d 20 70 53 63 72 69 70   pArray = pScrip
cb80: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
cb90: 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
cba0: 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 30        pArray = 0
cbb0: 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  ;.      pScript 
cbc0: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d  = objv[3];.    }
cbd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72  else{.      pArr
cbe0: 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  ay = objv[3];.  
cbf0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53      if( Tcl_GetS
cc00: 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d  tring(pArray)[0]
cc10: 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d 20 30  ==0 ) pArray = 0
cc20: 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  ;.      pScript 
cc30: 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d  = objv[4];.    }
cc40: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
cc50: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b  fCount(objv[2]);
cc60: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  .    zSql = Tcl_
cc70: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
cc80: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
cc90: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c    while( rc==TCL
cca0: 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29  _OK && zSql[0] )
ccb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccd0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
cce0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
ccf0: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
cd00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cd10: 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74   of bind paramet
cd20: 65 72 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74  ers in the pStmt
cd30: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   */.      int nC
cd40: 6f 6c 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  ol = -1;        
cd50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cd60: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
cd70: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
cd80: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61       Tcl_Obj **a
cd90: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20  pColName = 0;   
cda0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
cdb0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  mn names */.    
cdc0: 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20    int len;      
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cde0: 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66  String length of
cdf0: 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20   zSql */.  .    
ce00: 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
ce10: 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74   a SQL statement
ce20: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
ce30: 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  y been compiled 
ce40: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69  and.      ** whi
ce50: 63 68 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ch matches the n
ce60: 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ext sequence of 
ce70: 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  SQL..      */.  
ce80: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
ce90: 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
cea0: 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n30(zSql);.     
ceb0: 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20   for(pPreStmt = 
cec0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70  pDb->stmtList; p
ced0: 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d  PreStmt; pPreStm
cee0: 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  t=pPreStmt->pNex
cef0: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
cf00: 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  n = pPreStmt->nS
cf10: 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ql;.        if( 
cf20: 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20  len>=n .        
cf30: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50      && memcmp(pP
cf40: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53  reStmt->zSql, zS
cf50: 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20  ql, n)==0.      
cf60: 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e        && (zSql[n
cf70: 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31  ]==0 || zSql[n-1
cf80: 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20  ]==';').        
cf90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 74  ){.          pSt
cfa0: 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  mt = pPreStmt->p
cfb0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
cfc0: 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50  zLeft = &zSql[pP
cfd0: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a  reStmt->nSql];..
cfe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
cff0: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
d000: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
d010: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
d020: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
d030: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74   cache list.  It
d040: 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61   will later be a
d050: 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  dded back to the
d060: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
d070: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63       ** of the c
d080: 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64  ache list in ord
d090: 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
d0a0: 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e  LRU replacement.
d0b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
d0c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
d0d0: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
d0e0: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53             pPreS
d0f0: 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  tmt->pPrev->pNex
d100: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
d110: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
d120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d130: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
d140: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
d150: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
d160: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
d170: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a  eStmt->pNext ){.
d180: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65              pPre
d190: 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Stmt->pNext->pPr
d1a0: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  ev = pPreStmt->p
d1b0: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
d1c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d1d0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
d1e0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
d1f0: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ev;.          }.
d200: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
d210: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
d220: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
d230: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20   }.      }.  .  
d240: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65      /* If no pre
d250: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
d260: 77 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70  was found.  Comp
d270: 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78 74  ile the SQL text
d280: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d290: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
d2a0: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
d2b0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70  TE_OK!=sqlite3_p
d2c0: 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64  repare_v2(pDb->d
d2d0: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
d2e0: 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a  tmt, &zLeft) ){.
d2f0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65            Tcl_Se
d300: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
d310: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
d320: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
d330: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
d340: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
d350: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OR;.          br
d360: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
d370: 20 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74         if( pStmt
d380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
d390: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
d3a0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
d3b0: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
d3c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d          /* A com
d3d0: 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20  pile-time error 
d3e0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
d3f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
d400: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
d410: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
d420: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
d430: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
d440: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
d450: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
d460: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
d470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d480: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d490: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
d4a0: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
d4b0: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
d4c0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
d4d0: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  ement.          
d4e0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20    ** in the SQL 
d4f0: 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  string..        
d500: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
d510: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
d520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
d530: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
d540: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d550: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
d560: 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  eStmt==0 );.    
d570: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69    }..      /* Bi
d580: 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72  nd values to par
d590: 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67  ameters that beg
d5a0: 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 0a 20  in with $ or :. 
d5b0: 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20       */  .      
d5c0: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
d5d0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
d5e0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
d5f0: 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20    nParm = 0;.   
d600: 20 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a 65     if( nVar>size
d610: 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66  of(aParm)/sizeof
d620: 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20  (aParm[0]) ){.  
d630: 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 28        apParm = (
d640: 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c  Tcl_Obj**)Tcl_Al
d650: 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28  loc(nVar*sizeof(
d660: 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20  apParm[0]));.   
d670: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d680: 20 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72 6d    apParm = aParm
d690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d6a0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
d6b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d6c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
d6d0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
d6e0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
d6f0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
d700: 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26    if( zVar!=0 &&
d710: 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c   (zVar[0]=='$' |
d720: 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c  | zVar[0]==':' |
d730: 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20  | zVar[0]=='@') 
d740: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
d750: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
d760: 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
d770: 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20  p, &zVar[1], 0, 
d780: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
d790: 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ( pVar ){.      
d7a0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
d7b0: 20 20 20 20 20 20 20 20 20 75 38 20 2a 64 61 74           u8 *dat
d7c0: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  a;.            c
d7d0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61  har *zType = pVa
d7e0: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
d7f0: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
d800: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   : "";.         
d810: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70     char c = zTyp
d820: 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[0];.          
d830: 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27    if( zVar[0]=='
d840: 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  @' ||.          
d850: 20 20 20 20 20 28 63 3d 3d 27 62 27 20 26 26 20       (c=='b' && 
d860: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
d870: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
d880: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20  pVar->bytes==0) 
d890: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d8a0: 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42 20   /* Load a BLOB 
d8b0: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
d8c0: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
d8d0: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
d8e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
d8f0: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
d900: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20  presentation or 
d910: 74 68 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20  the host.       
d920: 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65         ** parame
d930: 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ter name begins 
d940: 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20  with "@". */.   
d950: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
d960: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
d970: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
d980: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
d990: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
d9a0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
d9b0: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
d9c0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
d9d0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
d9e0: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
da00: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
da10: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
da20: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
da30: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
da40: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
da50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
da60: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
da70: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
da80: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
da90: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
daa0: 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29  int(pStmt, i, n)
dab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
dac0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
dad0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
dae0: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75               dou
db00: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20  ble r;.         
db10: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
db20: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
db30: 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20  , pVar, &r);.   
db40: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
db50: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
db60: 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20  Stmt, i, r);.   
db70: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
db80: 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74  f( (c=='w' && st
db90: 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65  rcmp(zType,"wide
dba0: 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  Int")==0) ||.   
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
dbc0: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
dbd0: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
dbe0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
dbf0: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
dc00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
dc10: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
dc20: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
dc30: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
dc40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
dc50: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
dc60: 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20   i, v);.        
dc70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dc80: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
dc90: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
dca0: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
dcb0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
dcc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
dcd0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
dce0: 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72  (pStmt, i, (char
dcf0: 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49   *)data, n, SQLI
dd00: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
dd10: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
dd20: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
dd30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
dd40: 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20  apParm[nParm++] 
dd50: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
dd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
dd70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
dd80: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
dd90: 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29  null( pStmt, i )
dda0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ddb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ddc0: 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63 75 74  .      /* Execut
ddd0: 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20  e the SQL.      
dde0: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
ddf0: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70 53  rc==TCL_OK && pS
de00: 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  tmt && SQLITE_RO
de10: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
de20: 70 53 74 6d 74 29 20 29 7b 0a 0a 09 2f 2a 20 43  pStmt) ){.../* C
de30: 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  ompute column na
de40: 6d 65 73 2e 20 54 68 69 73 20 6d 75 73 74 20 62  mes. This must b
de50: 65 20 64 6f 6e 65 20 61 66 74 65 72 20 74 68 65  e done after the
de60: 20 66 69 72 73 74 20 73 75 63 63 65 73 73 66 75   first successfu
de70: 6c 0a 09 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  l..** call to sq
de80: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 69 6e  lite3_step(), in
de90: 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20   case the query 
dea0: 69 73 20 72 65 63 6f 6d 70 69 6c 65 64 20 61 6e  is recompiled an
deb0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
dec0: 20 6e 75 6d 62 65 72 20 6f 72 20 6e 61 6d 65 73   number or names
ded0: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
dee0: 20 63 6f 6c 75 6d 6e 73 20 63 68 61 6e 67 65 73   columns changes
def0: 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
df00: 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 41        assert(!pA
df10: 72 72 61 79 7c 7c 70 53 63 72 69 70 74 29 3b 0a  rray||pScript);.
df20: 20 20 20 20 20 20 20 20 69 66 20 28 6e 43 6f 6c          if (nCol
df30: 20 3c 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20   < 0) {.        
df40: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20    Tcl_Obj ***ap 
df50: 3d 20 28 70 53 63 72 69 70 74 3f 26 61 70 43 6f  = (pScript?&apCo
df60: 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20 20 20 20 20  lName:0);.      
df70: 20 20 20 20 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75      nCol = compu
df80: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e  teColumnNames(in
df90: 74 65 72 70 2c 20 70 53 74 6d 74 2c 20 61 70 2c  terp, pStmt, ap,
dfa0: 20 70 41 72 72 61 79 29 3b 0a 20 20 20 20 20 20   pArray);.      
dfb0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72    }..        for
dfc0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
dfd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
dfe0: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20  l_Obj *pVal;.   
dff0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
e000: 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f    /* Set pVal to
e010: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74   contain the i't
e020: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73  h column of this
e030: 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20   row. */.       
e040: 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
e050: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
e060: 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20  Stmt, i) ){.    
e070: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
e080: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
e090: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
e0a0: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tes = sqlite3_co
e0b0: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
e0c0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
e0d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e0e0: 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  zBlob = sqlite3_
e0f0: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
e100: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
e110: 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20       if( !zBlob 
e120: 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20  ) bytes = 0;.   
e130: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
e140: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
e150: 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c 6f 62  ayObj((u8*)zBlob
e160: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
e170: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e180: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
e190: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
e1a0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e1c0: 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73  lite_int64 v = s
e1d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
e1e0: 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  t64(pStmt, i);. 
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
e200: 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   v>=-2147483647 
e210: 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37  && v<=2147483647
e220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e230: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
e240: 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  ewIntObj(v);.   
e250: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
e260: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e270: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
e280: 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  WideIntObj(v);. 
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
e2b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
e2c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  }.            ca
e2d0: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
e2e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
e2f0: 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69   double r = sqli
e300: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
e310: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
e320: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
e330: 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  = Tcl_NewDoubleO
e340: 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(r);.         
e350: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e360: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e370: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
e380: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
e390: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64          pVal = d
e3a0: 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e  bTextToObj(pDb->
e3b0: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zNull);.        
e3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e3d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e3e0: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
e3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e400: 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f  pVal = dbTextToO
e410: 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74  bj((char *)sqlit
e420: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
e430: 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20 20  Stmt, i));.     
e440: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
e450: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e460: 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
e470: 20 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69         if( pScri
e480: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pt ){.          
e490: 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20    if( pArray==0 
e4a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
e4b0: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
e4c0: 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d  interp, apColNam
e4d0: 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30  e[i], 0, pVal, 0
e4e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
e4f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e500: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
e510: 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61  r2(interp, pArra
e520: 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  y, apColName[i],
e530: 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20   pVal, 0);.     
e540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e550: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f     }else if( cho
e560: 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d  ice==DB_ONECOLUM
e570: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
e580: 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30   assert( pRet==0
e590: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
e5a0: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65               pRe
e5c0: 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20 20  t = pVal;.      
e5d0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
e5e0: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e600: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
e610: 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20  CL_BREAK;.      
e620: 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a        i = nCol;.
e630: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
e640: 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45  if( choice==DB_E
e650: 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20  XISTS ){.       
e660: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
e670: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
e680: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
e690: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
e6a0: 6a 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(1);.          
e6b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
e6c0: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
e6d0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42        rc = TCL_B
e6e0: 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  REAK;.          
e6f0: 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20    i = nCol;.    
e700: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e710: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
e720: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
e730: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
e740: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pVal);.         
e750: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a   }.        }.  .
e760: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 72          if( pScr
e770: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ipt ){.         
e780: 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73 71   pDb->nStep = sq
e790: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
e7a0: 73 28 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20  s(pStmt, .      
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e7d0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
e7e0: 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 20 30 29 3b  LLSCAN_STEP, 0);
e7f0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
e800: 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 5f  nSort = sqlite3_
e810: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
e820: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54       SQLITE_STMT
e850: 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 30 29 3b  STATUS_SORT, 0);
e860: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
e870: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
e880: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
e890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
e8a0: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
e8b0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
e8c0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
e8d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e8e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e8f0: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
e900: 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  EAK ){.        r
e910: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
e920: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72    }..      /* Fr
e930: 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ee the column na
e940: 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  me objects */.  
e950: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
e960: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
e970: 20 74 68 65 20 71 75 65 72 79 20 72 65 74 75 72   the query retur
e980: 6e 65 64 20 6e 6f 20 72 6f 77 73 2c 20 62 75 74  ned no rows, but
e990: 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61 62   an array variab
e9a0: 6c 65 20 77 61 73 20 0a 20 20 20 20 20 20 20 20  le was .        
e9b0: 2a 2a 20 73 70 65 63 69 66 69 65 64 2c 20 63 61  ** specified, ca
e9c0: 6c 6c 20 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e  ll computeColumn
e9d0: 4e 61 6d 65 73 28 29 20 6e 6f 77 20 74 6f 20 70  Names() now to p
e9e0: 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 20 20 20  opulate the .   
e9f0: 20 20 20 20 20 2a 2a 20 61 72 72 61 79 6e 61 6d       ** arraynam
ea00: 65 28 2a 29 20 76 61 72 69 61 62 6c 65 2e 0a 20  e(*) variable.. 
ea10: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ea20: 20 20 69 66 20 28 70 41 72 72 61 79 20 26 26 20    if (pArray && 
ea30: 6e 43 6f 6c 20 3c 20 30 29 20 7b 0a 20 20 20 20  nCol < 0) {.    
ea40: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a        Tcl_Obj **
ea50: 2a 61 70 20 3d 20 28 70 53 63 72 69 70 74 3f 26  *ap = (pScript?&
ea60: 61 70 43 6f 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20  apColName:0);.  
ea70: 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 63          nCol = c
ea80: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  omputeColumnName
ea90: 73 28 69 6e 74 65 72 70 2c 20 70 53 74 6d 74 2c  s(interp, pStmt,
eaa0: 20 61 70 2c 20 70 41 72 72 61 79 29 3b 0a 20 20   ap, pArray);.  
eab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eac0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
ead0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
eae0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
eaf0: 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  t(apColName[i]);
eb00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eb10: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
eb20: 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20  r*)apColName);. 
eb30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
eb40: 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20   Free the bound 
eb50: 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20  string and blob 
eb60: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
eb70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
eb80: 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Parm; i++){.    
eb90: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
eba0: 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b  ount(apParm[i]);
ebb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ebc0: 66 28 20 61 70 50 61 72 6d 21 3d 61 50 61 72 6d  f( apParm!=aParm
ebd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
ebe0: 46 72 65 65 28 28 63 68 61 72 2a 29 61 70 50 61  Free((char*)apPa
ebf0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rm);.      }..  
ec00: 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65      /* Reset the
ec10: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
ec20: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  the result code 
ec30: 69 73 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  is SQLITE_SCHEMA
ec40: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
ec50: 66 6c 75 73 68 20 74 68 65 20 73 74 61 74 65 6d  flush the statem
ec60: 65 6e 74 20 63 61 63 68 65 20 61 6e 64 20 74 72  ent cache and tr
ec70: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
ec80: 61 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  again..      */.
ec90: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
eca0: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
ecb0: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74  ;.      pDb->nSt
ecc0: 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ep = sqlite3_stm
ecd0: 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20  t_status(pStmt, 
ece0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed00: 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54     SQLITE_STMTST
ed10: 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
ed20: 45 50 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 44  EP, 1);.      pD
ed30: 62 2d 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74  b->nSort = sqlit
ed40: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
ed50: 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Stmt,.          
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
ed80: 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20  TMTSTATUS_SORT, 
ed90: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  1);.      if( SQ
eda0: 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a  LITE_OK!=rc2 ){.
edb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
edc0: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f  run-time error o
edd0: 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68  ccurs, report th
ede0: 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70  e error and stop
edf0: 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20   reading.       
ee00: 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20 20 20   ** the SQL.    
ee10: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54      */.        T
ee20: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
ee30: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
ee40: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
ee50: 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  sg(pDb->db)));. 
ee60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
ee70: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
ee80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
ee90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
eea0: 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54  if( pPreStmt ) T
eeb0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
eec0: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
eed0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
eee0: 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e 6d 61  else if( pDb->ma
eef0: 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20  xStmt<=0 ){.    
ef00: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
ef10: 63 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66  che is turned of
ef20: 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74  f, deallocated t
ef30: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
ef40: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
ef50: 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28  Stmt ) Tcl_Free(
ef60: 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29  (char*)pPreStmt)
ef70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ef80: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
ef90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
efa0: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79          /* Every
efb0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64  thing worked and
efc0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 6f 70   the cache is op
efd0: 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20  erational..     
efe0: 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e     ** Create a n
eff0: 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ew SqlPreparedSt
f000: 6d 74 20 73 74 72 75 63 74 75 72 65 20 69 66 20  mt structure if 
f010: 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20  we need one..   
f020: 20 20 20 20 20 2a 2a 20 28 49 66 20 77 65 20 61       ** (If we a
f030: 6c 72 65 61 64 79 20 68 61 76 65 20 6f 6e 65 20  lready have one 
f040: 77 65 20 63 61 6e 20 6a 75 73 74 20 72 65 75 73  we can just reus
f050: 65 20 69 74 2e 29 0a 20 20 20 20 20 20 20 20 2a  e it.).        *
f060: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
f070: 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  reStmt==0 ){.   
f080: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65         len = zLe
f090: 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20  ft - zSql;.     
f0a0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20       pPreStmt = 
f0b0: 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74  (SqlPreparedStmt
f0c0: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
f0d0: 65 6f 66 28 2a 70 50 72 65 53 74 6d 74 29 20 29  eof(*pPreStmt) )
f0e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f0f0: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 20 72 65  pPreStmt==0 ) re
f100: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f110: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
f120: 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d  mt->pStmt = pStm
f130: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  t;.          pPr
f140: 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65  eStmt->nSql = le
f150: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  n;.          pPr
f160: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 73 71  eStmt->zSql = sq
f170: 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
f180: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
f190: 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70 50 72  rt( strlen30(pPr
f1a0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 6c 65  eStmt->zSql)==le
f1b0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  n );.          a
f1c0: 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70  ssert( 0==memcmp
f1d0: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
f1e0: 20 7a 53 71 6c 2c 20 6c 65 6e 29 20 29 3b 0a 20   zSql, len) );. 
f1f0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
f200: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
f210: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
f220: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
f230: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
f240: 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  st.        */.  
f250: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
f260: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
f270: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70  tList;.        p
f280: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d  PreStmt->pPrev =
f290: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
f2a0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
f2b0: 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  .         pDb->s
f2c0: 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  tmtList->pPrev =
f2d0: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
f2e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
f2f0: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
f300: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  eStmt;.        i
f310: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
f320: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f330: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
f340: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
f350: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
f360: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
f370: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f380: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f390: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
f3a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f3b0: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20   pDb->nStmt++;. 
f3c0: 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66    .        /* If
f3d0: 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e   we have too man
f3e0: 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63  y statement in c
f3f0: 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65  ache, remove the
f400: 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74 68   surplus from th
f410: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 64  e.        ** end
f420: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
f430: 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  st..        */. 
f440: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 44         while( pD
f450: 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61  b->nStmt>pDb->ma
f460: 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  xStmt ){.       
f470: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
f480: 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ize(pDb->stmtLas
f490: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
f4a0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
f4b0: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61  st = pDb->stmtLa
f4c0: 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  st->pPrev;.     
f4d0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
f4e0: 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61  har*)pDb->stmtLa
f4f0: 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20  st->pNext);.    
f500: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
f510: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
f520: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
f530: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
f540: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
f550: 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20 74   /* Proceed to t
f560: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
f570: 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20  t */.      zSql 
f580: 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20  = zLeft;.    }. 
f590: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
f5a0: 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20  unt(objv[2]);.. 
f5b0: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
f5c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
f5d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
f5e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
f5f0: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
f600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
f610: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
f620: 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  et);.    }else i
f630: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
f640: 0a 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74  .      Tcl_Reset
f650: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
f660: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
f670: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
f680: 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e      $db function
f690: 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74   NAME [-argcount
f6a0: 20 4e 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a   N] SCRIPT.  **.
f6b0: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
f6c0: 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63  w SQL function c
f6d0: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
f6e0: 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74  never that funct
f6f0: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c  ion is.  ** call
f700: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
f710: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
f720: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
f730: 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54  .  case DB_FUNCT
f740: 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75  ION: {.    SqlFu
f750: 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54  nc *pFunc;.    T
f760: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
f770: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
f780: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d  ;.    int nArg =
f790: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a   -1;.    if( obj
f7a0: 63 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 63 6f  c==6 ){.      co
f7b0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63  nst char *z = Tc
f7c0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
f7d0: 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  [3]);.      int 
f7e0: 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
f7f0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26  .      if( n>2 &
f800: 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61  & strncmp(z, "-a
f810: 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29  rgcount",n)==0 )
f820: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63  {.        if( Tc
f830: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f840: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
f850: 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e   &nArg) ) return
f860: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f870: 20 20 20 20 69 66 28 20 6e 41 72 67 3c 30 20 29      if( nArg<0 )
f880: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
f890: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f8a0: 65 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20  erp, "number of 
f8b0: 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62  arguments must b
f8c0: 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c  e non-negative",
f8d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
f8f0: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r*)0);.         
f900: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f910: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
f920: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69     }.      pScri
f930: 70 74 20 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 20 20  pt = objv[5];.  
f940: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
f950: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
f960: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f970: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
f980: 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20  NAME [-argcount 
f990: 4e 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20  N] SCRIPT");.   
f9a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f9b0: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
f9c0: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
f9d0: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20  objv[3];.    }. 
f9e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
f9f0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
fa00: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
fa10: 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c   pFunc = findSql
fa20: 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29  Func(pDb, zName)
fa30: 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d  ;.    if( pFunc=
fa40: 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
fa50: 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70  ERROR;.    if( p
fa60: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b  Func->pScript ){
fa70: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
fa80: 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70  efCount(pFunc->p
fa90: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20  Script);.    }. 
faa0: 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70     pFunc->pScrip
fab0: 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20  t = pScript;.   
fac0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
fad0: 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  t(pScript);.    
fae0: 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62  pFunc->useEvalOb
faf0: 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76  jv = safeToUseEv
fb00: 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70  alObjv(interp, p
fb10: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20  Script);.    rc 
fb20: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
fb30: 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64  _function(pDb->d
fb40: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
fb50: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
fb60: 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53       pFunc, tclS
fb70: 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
fb80: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
fb90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
fba0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
fbb0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
fbc0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
fbd0: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
fbe0: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
fbf0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a  OLATILE);.    }.
fc00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
fc10: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
fc20: 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61  b incrblob ?-rea
fc30: 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c  donly? ?DB? TABL
fc40: 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20  E COLUMN ROWID. 
fc50: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e   */.  case DB_IN
fc60: 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66  CRBLOB: {.#ifdef
fc70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
fc80: 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70  RBLOB.    Tcl_Ap
fc90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fca0: 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74  p, "incrblob not
fcb0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
fcc0: 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20  is build", 0);. 
fcd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fce0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ROR;.#else.    i
fcf0: 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20  nt isReadonly = 
fd00: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
fd10: 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b  r *zDb = "main";
fd20: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fd30: 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  *zTable;.    con
fd40: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
fd50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74  ;.    sqlite_int
fd60: 36 34 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a  64 iRow;..    /*
fd70: 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d   Check for the -
fd80: 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20  readonly option 
fd90: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  */.    if( objc>
fda0: 33 20 26 26 20 73 74 72 63 6d 70 28 54 63 6c 5f  3 && strcmp(Tcl_
fdb0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
fdc0: 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29  ]), "-readonly")
fdd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73 52  ==0 ){.      isR
fde0: 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
fdf0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
fe00: 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29  !=(5+isReadonly)
fe10: 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52   && objc!=(6+isR
fe20: 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadonly) ){.    
fe30: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
fe40: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
fe50: 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f  jv, "?-readonly?
fe60: 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55   ?DB? TABLE COLU
fe70: 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20  MN ROWID");.    
fe80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fe90: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
fea0: 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65  f( objc==(6+isRe
feb0: 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adonly) ){.     
fec0: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
fed0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
fee0: 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20     }.    zTable 
fef0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
ff00: 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20  objv[objc-3]);. 
ff10: 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c     zColumn = Tcl
ff20: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ff30: 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63  objc-2]);.    rc
ff40: 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e   = Tcl_GetWideIn
ff50: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
ff60: 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26   objv[objc-1], &
ff70: 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  iRow);..    if( 
ff80: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
ff90: 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 49      rc = createI
ffa0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a  ncrblobChannel(.
ffb0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 70            interp
ffc0: 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62  , pDb, zDb, zTab
ffd0: 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f  le, zColumn, iRo
ffe0: 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20  w, isReadonly.  
fff0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e      );.    }.#en
10000 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
10010 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
10020 20 20 24 64 62 20 69 6e 74 65 72 72 75 70 74 0a    $db interrupt.
10030 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72    **.  ** Interr
10040 75 70 74 20 74 68 65 20 65 78 65 63 75 74 69 6f  upt the executio
10050 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d  n of the inner-m
10060 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72 65  ost SQL interpre
10070 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ter.  This.  ** 
10080 63 61 75 73 65 73 20 74 68 65 20 53 51 4c 20 73  causes the SQL s
10090 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75  tatement to retu
100a0 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 53  rn an error of S
100b0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2e  QLITE_INTERRUPT.
100c0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
100d0 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20 20  INTERRUPT: {.   
100e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
100f0 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  pt(pDb->db);.   
10100 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
10110 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e  *.  **     $db n
10120 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47  ullvalue ?STRING
10130 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e  ?.  **.  ** Chan
10140 67 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65  ge text used whe
10150 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62  n a NULL comes b
10160 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ack from the dat
10170 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e  abase. If ?STRIN
10180 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  G?.  ** is not p
10190 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
101a0 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20   current string 
101b0 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73  used for NULL is
101c0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20   returned..  ** 
101d0 49 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65  If STRING is pre
101e0 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e  sent, then STRIN
101f0 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  G is returned.. 
10200 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
10210 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a  DB_NULLVALUE: {.
10220 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
10230 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  && objc!=3 ){.  
10240 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10250 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10260 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45  objv, "NULLVALUE
10270 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10280 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10290 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
102a0 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  3 ){.      int l
102b0 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  en;.      char *
102c0 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
102d0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
102e0 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
102f0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c     if( pDb->zNul
10300 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  l ){.        Tcl
10310 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c  _Free(pDb->zNull
10320 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10330 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65   if( zNull && le
10340 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
10350 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f  Db->zNull = Tcl_
10360 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
10370 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 70  ;.        strncp
10380 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e  y(pDb->zNull, zN
10390 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  ull, len);.     
103a0 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65     pDb->zNull[le
103b0 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  n] = '\0';.     
103c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
103d0 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a  pDb->zNull = 0;.
103e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
103f0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10400 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
10410 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c  tToObj(pDb->zNul
10420 6c 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  l));.    break;.
10430 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
10440 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65     $db last_inse
10450 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20  rt_rowid .  **. 
10460 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e   ** Return an in
10470 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
10480 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65  he ROWID for the
10490 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
104a0 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ert..  */.  case
104b0 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f   DB_LAST_INSERT_
104c0 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c  ROWID: {.    Tcl
104d0 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
104e0 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 72     Tcl_WideInt r
104f0 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62  owid;.    if( ob
10500 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
10510 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10520 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10530 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
10540 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10550 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20    }.    rowid = 
10560 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
10570 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64  ert_rowid(pDb->d
10580 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20  b);.    pResult 
10590 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
105a0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
105b0 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f 62  Tcl_SetWideIntOb
105c0 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64  j(pResult, rowid
105d0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
105e0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  }..  /*.  ** The
105f0 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65   DB_ONECOLUMN me
10600 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e  thod is implemen
10610 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69 74  ted together wit
10620 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a  h DB_EVAL..  */.
10630 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f  .  /*    $db pro
10640 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43  gress ?N CALLBAC
10650 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e  K?.  ** .  ** In
10660 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
10670 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20  allback every N 
10680 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
10690 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78  opcodes while ex
106a0 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65  ecuting.  ** que
106b0 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ries..  */.  cas
106c0 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b  e DB_PROGRESS: {
106d0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  .    if( objc==2
106e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
106f0 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
10700 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
10710 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10720 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c   pDb->zProgress,
10730 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10740 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
10750 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =4 ){.      char
10760 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20   *zProgress;.   
10770 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
10780 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69    int N;.      i
10790 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
107a0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
107b0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e  erp, objv[2], &N
107c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
107d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
107e0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66       };.      if
107f0 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
10800 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
10810 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72  Free(pDb->zProgr
10820 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ess);.      }.  
10830 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20      zProgress = 
10840 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10850 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c  mObj(objv[3], &l
10860 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
10870 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e  Progress && len>
10880 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
10890 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63  ->zProgress = Tc
108a0 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
108b0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
108c0 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  py(pDb->zProgres
108d0 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65  s, zProgress, le
108e0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
108f0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
10900 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  zProgress = 0;. 
10910 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
10920 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
10930 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20  ESS_CALLBACK.   
10940 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
10950 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
10960 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
10970 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
10980 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
10990 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
109a0 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61   N, DbProgressHa
109b0 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
109c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
109d0 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
109e0 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
109f0 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
10a00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
10a20 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10a30 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10a40 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  "N CALLBACK");. 
10a50 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10a60 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10a70 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
10a80 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65  *    $db profile
10a90 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
10aa0 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
10ab0 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
10ac0 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
10ad0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65 61 63  outine after eac
10ae0 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
10af0 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75    ** that has ru
10b00 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20  n.  The text of 
10b10 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20  the SQL and the 
10b20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65  amount of elapse
10b30 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61   time are.  ** a
10b40 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
10b50 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73  ACK before the s
10b60 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20  cript is run..  
10b70 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
10b80 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  FILE: {.    if( 
10b90 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
10ba0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10bb0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
10bc0 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
10bd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10be0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
10bf0 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
10c00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
10c10 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
10c20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
10c30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
10c40 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b  b->zProfile, 0);
10c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
10c60 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
10c70 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20  zProfile;.      
10c80 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
10c90 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
10ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
10cb0 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69  Free(pDb->zProfi
10cc0 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
10cd0 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63     zProfile = Tc
10ce0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10cf0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
10d00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72  );.      if( zPr
10d10 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29  ofile && len>0 )
10d20 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
10d30 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c  Profile = Tcl_Al
10d40 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
10d50 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
10d60 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50  Db->zProfile, zP
10d70 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a  rofile, len+1);.
10d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10d90 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69       pDb->zProfi
10da0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  le = 0;.      }.
10db0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10dc0 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20  MIT_TRACE.      
10dd0 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
10de0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  e ){.        pDb
10df0 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
10e00 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
10e10 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e  e3_profile(pDb->
10e20 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e  db, DbProfileHan
10e30 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
10e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10e50 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
10e60 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
10e70 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
10e80 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
10e90 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
10ea0 20 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45      $db rekey KE
10eb0 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e  Y.  **.  ** Chan
10ec0 67 65 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f  ge the encryptio
10ed0 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72  n key on the cur
10ee0 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61  rently open data
10ef0 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
10f00 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20  e DB_REKEY: {.  
10f10 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20    int nKey;.    
10f20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
10f30 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
10f40 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10f50 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10f60 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20   objv, "KEY");. 
10f70 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10f80 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10f90 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
10fa0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
10fb0 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b  objv[2], &nKey);
10fc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
10fd0 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72 63 20  AS_CODEC.    rc 
10fe0 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28  = sqlite3_rekey(
10ff0 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e  pDb->db, pKey, n
11000 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Key);.    if( rc
11010 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
11020 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11030 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  p, sqlite3ErrStr
11040 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  (rc), 0);.      
11050 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
11060 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
11070 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
11080 2a 20 20 20 20 24 64 62 20 72 65 73 74 6f 72 65  *    $db restore
11090 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45   ?DATABASE? FILE
110a0 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  NAME.  **.  ** O
110b0 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
110c0 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41  ile named FILENA
110d0 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68  ME.  Transfer th
110e0 65 20 63 6f 6e 74 65 6e 74 20 0a 20 20 2a 2a 20  e content .  ** 
110f0 6f 66 20 46 49 4c 45 4e 41 4d 45 20 69 6e 74 6f  of FILENAME into
11100 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 62   the local datab
11110 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65  ase DATABASE (de
11120 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 2e 0a  fault: "main")..
11130 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52    */.  case DB_R
11140 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 63 6f  ESTORE: {.    co
11150 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69  nst char *zSrcFi
11160 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
11170 61 72 20 2a 7a 44 65 73 74 44 62 3b 0a 20 20 20  ar *zDestDb;.   
11180 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a   sqlite3 *pSrc;.
11190 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
111a0 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20  up *pBackup;.   
111b0 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20   int nTimeout = 
111c0 30 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  0;..    if( objc
111d0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 65  ==3 ){.      zDe
111e0 73 74 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  stDb = "main";. 
111f0 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
11200 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11210 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[2]);.    }els
11220 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
11230 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d  .      zDestDb =
11240 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11250 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a  bjv[2]);.      z
11260 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  SrcFile = Tcl_Ge
11270 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
11280 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11290 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
112a0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
112b0 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f  bjv, "?DATABASE?
112c0 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20   FILENAME");.   
112d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
112e0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
112f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
11300 5f 76 32 28 7a 53 72 63 46 69 6c 65 2c 20 26 70  _v2(zSrcFile, &p
11310 53 72 63 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  Src, SQLITE_OPEN
11320 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20  _READONLY, 0);. 
11330 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
11350 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11360 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
11370 70 65 6e 20 73 6f 75 72 63 65 20 64 61 74 61 62  pen source datab
11380 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  ase: ",.        
11390 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
113a0 67 28 70 53 72 63 29 2c 20 28 63 68 61 72 2a 29  g(pSrc), (char*)
113b0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
113c0 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20  3_close(pSrc);. 
113d0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
113e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
113f0 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74   pBackup = sqlit
11400 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70  e3_backup_init(p
11410 44 62 2d 3e 64 62 2c 20 7a 44 65 73 74 44 62 2c  Db->db, zDestDb,
11420 20 70 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a   pSrc, "main");.
11430 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d      if( pBackup=
11440 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
11450 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11460 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61  erp, "restore fa
11470 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  iled: ",.       
11480 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
11490 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
114a0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
114b0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63  lite3_close(pSrc
114c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
114d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
114e0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
114f0 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
11500 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
11510 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  0))==SQLITE_OK. 
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11530 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
11540 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
11550 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
11560 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d          if( nTim
11570 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72  eout++ >= 3 ) br
11580 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eak;.        sql
11590 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b  ite3_sleep(100);
115a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
115b0 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
115c0 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
115d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
115e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
115f0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
11600 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
11610 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
11620 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43  | rc==SQLITE_LOC
11630 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  KED ){.      Tcl
11640 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11650 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66  terp, "restore f
11660 61 69 6c 65 64 3a 20 73 6f 75 72 63 65 20 64 61  ailed: source da
11670 74 61 62 61 73 65 20 62 75 73 79 22 2c 0a 20 20  tabase busy",.  
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11690 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
116a0 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
116b0 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RROR;.    }else{
116c0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
116d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
116e0 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
116f0 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
11700 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
11710 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
11720 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
11730 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
11740 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
11750 28 70 53 72 63 29 3b 0a 20 20 20 20 62 72 65 61  (pSrc);.    brea
11760 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
11770 2a 20 20 20 20 20 24 64 62 20 73 74 61 74 75 73  *     $db status
11780 20 28 73 74 65 70 7c 73 6f 72 74 29 0a 20 20 2a   (step|sort).  *
11790 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79 20 53  *.  ** Display S
117a0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
117b0 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 6f  _FULLSCAN_STEP o
117c0 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53  r .  ** SQLITE_S
117d0 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20 66  TMTSTATUS_SORT f
117e0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
117f0 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20 20  nt eval..  */.  
11800 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a 20  case DB_STATUS: 
11810 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20  {.    int v;.   
11820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
11830 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
11840 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
11850 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11860 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28 73  rp, 2, objv, "(s
11870 74 65 70 7c 73 6f 72 74 29 22 29 3b 0a 20 20 20  tep|sort)");.   
11880 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11890 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
118a0 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Op = Tcl_GetStri
118b0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
118c0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
118d0 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20   "step")==0 ){. 
118e0 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53       v = pDb->nS
118f0 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  tep;.    }else i
11900 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
11910 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sort")==0 ){.   
11920 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72     v = pDb->nSor
11930 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
11940 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11950 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
11960 64 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75  d argument: shou
11970 6c 64 20 62 65 20 73 74 65 70 20 6f 72 20 73 6f  ld be step or so
11980 72 74 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rt", .          
11990 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
119a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
119b0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ROR;.    }.    T
119c0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
119d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
119e0 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20 20 62  ntObj(v));.    b
119f0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  reak;.  }.  .  /
11a00 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74  *.  **     $db t
11a10 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f  imeout MILLESECO
11a20 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65  NDS.  **.  ** De
11a30 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  lay for the numb
11a40 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
11a50 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65  ds specified whe
11a60 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b  n a file is lock
11a70 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
11a80 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20  DB_TIMEOUT: {.  
11a90 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66    int ms;.    if
11aa0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
11ab0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
11ac0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
11ad0 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e  bjv, "MILLISECON
11ae0 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  DS");.      retu
11af0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11b00 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
11b10 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
11b20 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
11b30 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ms) ) return TCL
11b40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
11b50 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
11b60 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20  (pDb->db, ms);. 
11b70 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
11b80 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
11b90 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  db total_changes
11ba0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
11bb0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
11bc0 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
11bd0 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
11be0 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20  d, or deleted . 
11bf0 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61   ** since the da
11c00 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
11c10 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a  s created..  */.
11c20 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f    case DB_TOTAL_
11c30 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54  CHANGES: {.    T
11c40 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
11c50 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
11c60 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
11c70 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
11c80 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
11c90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11ca0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
11cb0 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
11cc0 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
11cd0 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
11ce0 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
11cf0 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  , sqlite3_total_
11d00 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29  changes(pDb->db)
11d10 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
11d20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
11d30 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  race ?CALLBACK?.
11d40 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61    **.  ** Make a
11d50 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69  rrangements to i
11d60 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41  nvoke the CALLBA
11d70 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65  CK routine for e
11d80 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
11d90 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65  t.  ** that is e
11da0 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
11db0 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73  xt of the SQL is
11dc0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c   appended to CAL
11dd0 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a  LBACK before.  *
11de0 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64  * it is executed
11df0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
11e00 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66  _TRACE: {.    if
11e10 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
11e20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
11e30 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
11e40 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
11e50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11e60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11e70 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
11e80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
11e90 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
11ea0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
11eb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
11ec0 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20  b->zTrace, 0);. 
11ed0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11ee0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
11ef0 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  race;.      int 
11f00 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
11f10 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
11f20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
11f30 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20  Db->zTrace);.   
11f40 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63     }.      zTrac
11f50 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
11f60 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
11f70 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
11f80 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e  f( zTrace && len
11f90 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
11fa0 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f  b->zTrace = Tcl_
11fb0 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
11fc0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
11fd0 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54  (pDb->zTrace, zT
11fe0 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  race, len+1);.  
11ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12000 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
12010 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
12020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12030 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28 20  TRACE.      if( 
12040 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
12050 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
12060 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
12070 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
12080 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
12090 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
120a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
120b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
120c0 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
120d0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
120e0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
120f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
12100 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
12110 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
12120 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
12130 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
12140 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
12150 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
12160 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
12170 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
12180 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
12190 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
121a0 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
121b0 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
121c0 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
121d0 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
121e0 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
121f0 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
12200 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
12210 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
12220 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
12230 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
12240 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
12250 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
12260 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
12270 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
12280 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
12290 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
122a0 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
122b0 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
122c0 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
122d0 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
122e0 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
122f0 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
12300 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
12310 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
12320 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
12330 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ript;.    const 
12340 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22  char *zBegin = "
12350 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74  SAVEPOINT _tcl_t
12360 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20  ransaction";.   
12370 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
12380 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  d;.    if( objc!
12390 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =3 && objc!=4 ){
123a0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
123b0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
123c0 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d  2, objv, "[TYPE]
123d0 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
123e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
123f0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
12400 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pDb->nTransact
12410 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 7a 42 65  ion ){.      zBe
12420 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54  gin = "SAVEPOINT
12430 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
12440 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n";.    }else if
12450 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pDb->nTransact
12460 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d  ion==0 && objc==
12470 34 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  4 ){.      stati
12480 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54  c const char *TT
12490 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  YPE_strs[] = {. 
124a0 20 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64         "deferred
124b0 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22  ",   "exclusive"
124c0 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20  ,  "immediate", 
124d0 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
124e0 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d   enum TTYPE_enum
124f0 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45   {.        TTYPE
12500 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45  _DEFERRED, TTYPE
12510 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50  _EXCLUSIVE, TTYP
12520 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20  E_IMMEDIATE.    
12530 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74    };.      int t
12540 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20  type;.      if( 
12550 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
12560 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
12570 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c  [2], TTYPE_strs,
12580 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79   "transaction ty
12590 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pe",.           
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 20 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b     0, &ttype) ){
125c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
125d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
125e0 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28   }.      switch(
125f0 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75   (enum TTYPE_enu
12600 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20  m)ttype ){.     
12610 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45     case TTYPE_DE
12620 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f  FERRED:    /* no
12630 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20  -op */;         
12640 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12650 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
12660 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a  E_EXCLUSIVE:   z
12670 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45  Begin = "BEGIN E
12680 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61  XCLUSIVE";  brea
12690 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
126a0 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a  TTYPE_IMMEDIATE:
126b0 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47     zBegin = "BEG
126c0 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20  IN IMMEDIATE";  
126d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
126e0 20 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74     }.    pScript
126f0 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
12700 0a 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62  ..    pDb->disab
12710 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20 72 63  leAuth++;.    rc
12720 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
12730 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c  pDb->db, zBegin,
12740 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70   0, 0, 0);.    p
12750 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d  Db->disableAuth-
12760 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  -;.    if( rc!=S
12770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12780 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12790 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
127a0 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
127b0 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  b), 0);.      re
127c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
127d0 20 20 20 20 7d 0a 0a 20 20 20 20 70 44 62 2d 3e      }..    pDb->
127e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
127f0 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
12800 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
12810 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
12820 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pDb->nTransactio
12830 6e 2d 2d 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  n--;..    if( rc
12840 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20  !=TCL_ERROR ){. 
12850 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 6e 54       if( pDb->nT
12860 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
12870 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 52 45        zEnd = "RE
12880 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73  LEASE _tcl_trans
12890 61 63 74 69 6f 6e 22 3b 0a 20 20 20 20 20 20 7d  action";.      }
128a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 45  else{.        zE
128b0 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20  nd = "COMMIT";. 
128c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
128d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
128e0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
128f0 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20  .        zEnd = 
12900 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f 74 63  "ROLLBACK TO _tc
12910 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20 3b 20  l_transaction ; 
12920 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61  RELEASE _tcl_tra
12930 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20 20 20  nsaction";.     
12940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12950 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  zEnd = "ROLLBACK
12960 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
12970 0a 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62  ..    pDb->disab
12980 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20 69 66  leAuth++;.    if
12990 28 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  ( sqlite3_exec(p
129a0 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c  Db->db, zEnd, 0,
129b0 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
129c0 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 72 69  /* This is a tri
129d0 63 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f 20  cky scenario to 
129e0 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74  handle. The most
129f0 20 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f 66   likely cause of
12a00 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72 72   an.      ** err
12a10 6f 72 20 69 73 20 74 68 61 74 20 74 68 65 20 65  or is that the e
12a20 78 65 63 28 29 20 61 62 6f 76 65 20 77 61 73 20  xec() above was 
12a30 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f  an attempt to co
12a40 6d 6d 69 74 20 74 68 65 20 0a 20 20 20 20 20 20  mmit the .      
12a50 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61  ** top-level tra
12a60 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72 65  nsaction that re
12a70 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 42 55  turned SQLITE_BU
12a80 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b  SY. Or, less lik
12a90 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ely,.      ** th
12aa0 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68  at an IO-error h
12ab0 61 73 20 6f 63 63 75 72 65 64 2e 20 49 6e 20 65  as occured. In e
12ac0 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 72 6f  ither case, thro
12ad0 77 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f  w a Tcl exceptio
12ae0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  n.      ** and t
12af0 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ry to rollback t
12b00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
12b10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
12b20 2a 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20 61  * But it could a
12b30 6c 73 6f 20 62 65 20 74 68 61 74 20 74 68 65 20  lso be that the 
12b40 75 73 65 72 20 65 78 65 63 75 74 65 64 20 6f 6e  user executed on
12b50 65 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e 2c  e or more BEGIN,
12b60 20 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49   .      ** COMMI
12b70 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20 52 45  T, SAVEPOINT, RE
12b80 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43  LEASE or ROLLBAC
12b90 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20  K commands that 
12ba0 61 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20  are confusing.  
12bb0 20 20 20 20 2a 2a 20 74 68 69 73 20 6d 65 74 68      ** this meth
12bc0 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20  od's logic. Not 
12bd0 63 6c 65 61 72 20 68 6f 77 20 74 68 69 73 20 77  clear how this w
12be0 6f 75 6c 64 20 62 65 20 62 65 73 74 20 68 61 6e  ould be best han
12bf0 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dled..      */. 
12c00 20 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c       if( rc!=TCL
12c10 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12c20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12c30 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
12c40 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
12c50 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b), 0);.        
12c60 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
12c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12c80 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
12c90 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  db, "ROLLBACK", 
12ca0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
12cb0 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
12cc0 41 75 74 68 2d 2d 3b 0a 0a 20 20 20 20 62 72 65  Auth--;..    bre
12cd0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
12ce0 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b  **    $db unlock
12cf0 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69 70 74 3f  _notify ?script?
12d00 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
12d10 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b  UNLOCK_NOTIFY: {
12d20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12d30 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
12d40 54 49 46 59 0a 20 20 20 20 54 63 6c 5f 41 70 70  TIFY.    Tcl_App
12d50 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12d60 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  , "unlock_notify
12d70 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
12d80 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
12d90 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  );.    rc = TCL_
12da0 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
12db0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
12dc0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
12dd0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
12de0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
12df0 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a  v, "?SCRIPT?");.
12e00 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
12e10 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RROR;.    }else{
12e20 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78 4e  .      void (*xN
12e30 6f 74 69 66 79 29 28 76 6f 69 64 20 2a 2a 2c 20  otify)(void **, 
12e40 69 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  int) = 0;.      
12e50 76 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41 72 67  void *pNotifyArg
12e60 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
12e70 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
12e80 69 66 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ify ){.        T
12e90 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
12ea0 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
12eb0 66 79 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62  fy);.        pDb
12ec0 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20  ->pUnlockNotify 
12ed0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  = 0;.      }.  .
12ee0 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d        if( objc==
12ef0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4e 6f  3 ){.        xNo
12f00 74 69 66 79 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e  tify = DbUnlockN
12f10 6f 74 69 66 79 3b 0a 20 20 20 20 20 20 20 20 70  otify;.        p
12f20 4e 6f 74 69 66 79 41 72 67 20 3d 20 28 76 6f 69  NotifyArg = (voi
12f30 64 20 2a 29 70 44 62 3b 0a 20 20 20 20 20 20 20  d *)pDb;.       
12f40 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
12f50 69 66 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20  ify = objv[2];. 
12f60 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
12f70 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e  efCount(pDb->pUn
12f80 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20  lockNotify);.   
12f90 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66     }.  .      if
12fa0 28 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  ( sqlite3_unlock
12fb0 5f 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64 62 2c  _notify(pDb->db,
12fc0 20 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74 69 66   xNotify, pNotif
12fd0 79 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20  yArg) ){.       
12fe0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12ff0 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
13000 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
13010 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ), 0);.        r
13020 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
13030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
13040 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
13050 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
13060 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
13070 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
13080 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
13090 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
130a0 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41  /.  case DB_UPDA
130b0 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65  TE_HOOK: .  case
130c0 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
130d0 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74  K: {..    /* set
130e0 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74   ppHook to point
130f0 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20   at pUpdateHook 
13100 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  or pRollbackHook
13110 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a  , depending on .
13120 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b      ** whether [
13130 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d  $db update_hook]
13140 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63   or [$db rollbac
13150 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f  k_hook] was invo
13160 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
13170 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b  Tcl_Obj **ppHook
13180 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63  ; .    if( choic
13190 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f  e==DB_UPDATE_HOO
131a0 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f  K ){.      ppHoo
131b0 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74  k = &pDb->pUpdat
131c0 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  eHook;.    }else
131d0 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d  {.      ppHook =
131e0 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   &pDb->pRollback
131f0 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hook;.    }..   
13200 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
13210 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
13220 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
13230 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
13240 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b  jv, "?SCRIPT?");
13250 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  .       return T
13260 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13270 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20      if( *ppHook 
13280 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
13290 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
132a0 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  , *ppHook);.    
132b0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
132c0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
132d0 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
132e0 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 48  k);.        *ppH
132f0 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ook = 0;.      }
13300 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
13310 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
13320 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f  assert( !(*ppHoo
13330 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  k) );.      if( 
13340 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74  Tcl_GetCharLengt
13350 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a  h(objv[2])>0 ){.
13360 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20          *ppHook 
13370 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20  = objv[2];.     
13380 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
13390 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
133a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
133b0 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f   sqlite3_update_
133c0 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70  hook(pDb->db, (p
133d0 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f  Db->pUpdateHook?
133e0 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a  DbUpdateHandler:
133f0 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20 73 71  0), pDb);.    sq
13400 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
13410 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44 62  ook(pDb->db,(pDb
13420 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f  ->pRollbackHook?
13430 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65  DbRollbackHandle
13440 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20  r:0),pDb);..    
13450 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
13460 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a      $db version.
13470 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
13480 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72   the version str
13490 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74  ing for this dat
134a0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
134b0 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b  se DB_VERSION: {
134c0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
134d0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
134e0 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65   *)sqlite3_libve
134f0 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41  rsion(), TCL_STA
13500 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  TIC);.    break;
13510 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e  .  }...  } /* En
13520 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20  d of the SWITCH 
13530 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72  statement */.  r
13540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13550 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e  **   sqlite3 DBN
13560 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  AME FILENAME ?-v
13570 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65  fs VFSNAME? ?-ke
13580 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c  y KEY? ?-readonl
13590 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20  y BOOLEAN?.**   
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135b0 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65          ?-create
135c0 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75   BOOLEAN? ?-nomu
135d0 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a  tex BOOLEAN?.**.
135e0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d  ** This is the m
135f0 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e  ain Tcl command.
13600 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69    When the "sqli
13610 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  te" Tcl command 
13620 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74  is.** invoked, t
13630 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
13640 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74   to process that
13650 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
13660 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
13670 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61  nt, DBNAME, is a
13680 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65  n arbitrary name
13690 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61   for a new.** da
136a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
136b0 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  n.  This command
136c0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63   creates a new c
136d0 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20  ommand named.** 
136e0 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75  DBNAME that is u
136f0 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  sed to control t
13700 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  hat connection. 
13710 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   The database.**
13720 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64   connection is d
13730 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
13740 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69  DBNAME command i
13750 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
13760 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
13770 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
13780 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13790 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61   file..**.*/.sta
137a0 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76  tic int DbMain(v
137b0 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  oid *cd, Tcl_Int
137c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
137d0 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63   objc,Tcl_Obj *c
137e0 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71  onst*objv){.  Sq
137f0 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69  liteDb *p;.  voi
13800 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69  d *pKey = 0;.  i
13810 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63  nt nKey = 0;.  c
13820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
13830 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
13840 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
13850 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
13860 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
13870 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c  fs = 0;.  int fl
13880 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
13890 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
138a0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
138b0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e   | SQLITE_OPEN_N
138c0 4f 4d 55 54 45 58 3b 0a 20 20 54 63 6c 5f 44 53  OMUTEX;.  Tcl_DS
138d0 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64  tring translated
138e0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20  Filename;.  if( 
138f0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  objc==2 ){.    z
13900 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
13910 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
13920 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  1], 0);.    if( 
13930 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65  strcmp(zArg,"-ve
13940 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  rsion")==0 ){.  
13950 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13960 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69  sult(interp,sqli
13970 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a  te3_version,0);.
13980 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13990 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
139a0 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
139b0 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20  -has-codec")==0 
139c0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
139d0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
139e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
139f0 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b  t(interp,"1",0);
13a00 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c  .#else.      Tcl
13a10 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
13a20 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e  terp,"0",0);.#en
13a30 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
13a40 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
13a50 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b   }.  for(i=3; i+
13a60 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20  1<objc; i+=2){. 
13a70 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
13a80 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29  tString(objv[i])
13a90 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
13aa0 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30  (zArg,"-key")==0
13ab0 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d   ){.      pKey =
13ac0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
13ad0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b  yFromObj(objv[i+
13ae0 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20  1], &nKey);.    
13af0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13b00 28 7a 41 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d  (zArg, "-vfs")==
13b10 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  0 ){.      i++;.
13b20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c        zVfs = Tcl
13b30 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13b40 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i]);.    }else i
13b50 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
13b60 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20  "-readonly")==0 
13b70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
13b80 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
13b90 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
13ba0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
13bb0 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
13bc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
13bd0 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20   if( b ){.      
13be0 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c    flags &= ~(SQL
13bf0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13c00 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
13c10 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20  REATE);.        
13c20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
13c30 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
13c40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13c50 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
13c60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
13c70 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  LY;.        flag
13c80 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
13c90 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
13ca0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
13cb0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
13cc0 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a  -create")==0 ){.
13cd0 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
13ce0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
13cf0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
13d00 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
13d10 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
13d20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
13d30 28 20 62 20 26 26 20 28 66 6c 61 67 73 20 26 20  ( b && (flags & 
13d40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
13d50 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
13d60 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
13d70 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
13d80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13d90 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
13da0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
13db0 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
13dc0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13dd0 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78  (zArg, "-nomutex
13de0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
13df0 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
13e00 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
13e10 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13e20 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
13e30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13e40 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
13e50 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
13e60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
13e70 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c  UTEX;.        fl
13e80 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
13e90 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20  PEN_FULLMUTEX;. 
13ea0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13eb0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
13ec0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
13ed0 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 7d 65  X;.      }.   }e
13ee0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
13ef0 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78  Arg, "-fullmutex
13f00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
13f10 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
13f20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
13f30 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13f40 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
13f50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13f60 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
13f70 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
13f80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
13f90 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20  LMUTEX;.        
13fa0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
13fb0 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
13fc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13fd0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
13fe0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
13ff0 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TEX;.      }.   
14000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
14010 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
14020 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20  nterp, "unknown 
14030 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c  option: ", zArg,
14040 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
14050 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14060 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
14070 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f  if( objc<3 || (o
14080 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20  bjc&1)!=1 ){.   
14090 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
140a0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
140b0 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  v, .      "HANDL
140c0 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73  E FILENAME ?-vfs
140d0 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64   VFSNAME? ?-read
140e0 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  only BOOLEAN? ?-
140f0 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22  create BOOLEAN?"
14100 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74  .      " ?-nomut
14110 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75  ex BOOLEAN? ?-fu
14120 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  llmutex BOOLEAN?
14130 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ".#ifdef SQLITE_
14140 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
14150 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59  " ?-key CODECKEY
14160 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b  ?".#endif.    );
14170 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14180 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72  ERROR;.  }.  zEr
14190 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rMsg = 0;.  p = 
141a0 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41  (SqliteDb*)Tcl_A
141b0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
141c0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
141d0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
141e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c  ult(interp, "mal
141f0 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c  loc failed", TCL
14200 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
14210 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14220 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
14230 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
14240 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
14250 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
14260 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46  bjv[2], 0);.  zF
14270 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c  ile = Tcl_Transl
14280 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65  ateFileName(inte
14290 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e  rp, zFile, &tran
142a0 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
142b0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  .  sqlite3_open_
142c0 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62  v2(zFile, &p->db
142d0 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  , flags, zVfs);.
142e0 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
142f0 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  e(&translatedFil
14300 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 51  ename);.  if( SQ
14310 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
14320 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20  _errcode(p->db) 
14330 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  ){.    zErrMsg =
14340 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
14350 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
14360 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
14370 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
14380 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e  (p->db);.    p->
14390 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64  db = 0;.  }.#ifd
143a0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
143b0 44 45 43 0a 20 20 69 66 28 20 70 2d 3e 64 62 20  DEC.  if( p->db 
143c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  ){.    sqlite3_k
143d0 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  ey(p->db, pKey, 
143e0 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nKey);.  }.#endi
143f0 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  f.  if( p->db==0
14400 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
14410 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
14420 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54  rrMsg, TCL_VOLAT
14430 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72  ILE);.    Tcl_Fr
14440 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20  ee((char*)p);.  
14450 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14460 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
14470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14480 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20   }.  p->maxStmt 
14490 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53  = NUM_PREPARED_S
144a0 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  TMTS;.  p->inter
144b0 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41  p = interp;.  zA
144c0 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
144d0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
144e0 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ], 0);.  Tcl_Cre
144f0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
14500 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
14510 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20  jCmd, (char*)p, 
14520 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20  DbDeleteCmd);.  
14530 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
14540 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
14550 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74  a dummy Tcl_Init
14560 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20  Stubs if we are 
14570 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20  using this as a 
14580 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72  static.** librar
14590 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53  y..*/.#ifndef US
145a0 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e  E_TCL_STUBS.# un
145b0 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75  def  Tcl_InitStu
145c0 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f  bs.# define Tcl_
145d0 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29  InitStubs(a,b,c)
145e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
145f0 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
14600 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49   a PACKAGE_VERSI
14610 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  ON macro defined
14620 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a  .  This will be.
14630 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d  ** defined autom
14640 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20  atically by the 
14650 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42  TEA makefile.  B
14660 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c  ut other makefil
14670 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66  es.** do not def
14680 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ine it..*/.#ifnd
14690 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ef PACKAGE_VERSI
146a0 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b  ON.# define PACK
146b0 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49  AGE_VERSION SQLI
146c0 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69  TE_VERSION.#endi
146d0 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  f../*.** Initial
146e0 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
146f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20  .**.** This Tcl 
14700 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20  module contains 
14710 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65  only a single ne
14720 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61  w Tcl command na
14730 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a  med "sqlite"..**
14740 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69 73   (Hence there is
14750 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20   no namespace.  
14760 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  There is no poin
14770 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d  t in using a nam
14780 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65  espace.** if the
14790 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20   extension only 
147a0 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77  supplies one new
147b0 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73 71   name!)  The "sq
147c0 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73  lite" command is
147d0 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  .** used to open
147e0 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61   a new SQLite da
147f0 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68 65  tabase.  See the
14800 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e   DbMain() routin
14810 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61  e above.** for a
14820 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
14830 61 74 69 6f 6e 2e 0a 2a 2f 0a 45 58 54 45 52 4e  ation..*/.EXTERN
14840 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69   int Sqlite3_Ini
14850 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
14860 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69  terp){.  Tcl_Ini
14870 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22  tStubs(interp, "
14880 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  8.4", 0);.  Tcl_
14890 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
148a0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
148b0 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  3", (Tcl_ObjCmdP
148c0 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
148d0 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f  0);.  Tcl_PkgPro
148e0 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71  vide(interp, "sq
148f0 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f  lite3", PACKAGE_
14900 56 45 52 53 49 4f 4e 29 3b 0a 20 20 54 63 6c 5f  VERSION);.  Tcl_
14910 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
14920 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
14930 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
14940 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
14950 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76  );.  Tcl_PkgProv
14960 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ide(interp, "sql
14970 69 74 65 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  ite", PACKAGE_VE
14980 52 53 49 4f 4e 29 3b 0a 20 20 72 65 74 75 72 6e  RSION);.  return
14990 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52   TCL_OK;.}.EXTER
149a0 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
149b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
149c0 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
149d0 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
149e0 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e  nterp); }.EXTERN
149f0 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66   int Sqlite3_Saf
14a00 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
14a10 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
14a20 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
14a30 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
14a40 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
14a50 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
14a60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
14a70 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
14a80 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  te3_Unload(Tcl_I
14a90 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
14aa0 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
14ab0 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
14ac0 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
14ad0 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  3_Unload(Tcl_Int
14ae0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
14af0 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
14b00 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
14b10 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66   int Sqlite3_Saf
14b20 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  eUnload(Tcl_Inte
14b30 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
14b40 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
14b50 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20  CL_OK; }.EXTERN 
14b60 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53  int Tclsqlite3_S
14b70 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  afeUnload(Tcl_In
14b80 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
14b90 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
14ba0 20 54 43 4c 5f 4f 4b 3b 7d 0a 0a 0a 23 69 66 6e   TCL_OK;}...#ifn
14bb0 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46  def SQLITE_3_SUF
14bc0 46 49 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20  FIX_ONLY.EXTERN 
14bd0 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28  int Sqlite_Init(
14be0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
14bf0 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
14c00 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
14c10 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
14c20 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  clsqlite_Init(Tc
14c30 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14c40 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
14c50 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
14c60 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  }.EXTERN int Sql
14c70 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  ite_SafeInit(Tcl
14c80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
14c90 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
14ca0 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
14cb0 6c 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74  lsqlite_SafeInit
14cc0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
14cd0 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
14ce0 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
14cf0 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28  t Sqlite_Unload(
14d00 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
14d10 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
14d20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
14d30 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
14d40 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c  qlite_Unload(Tcl
14d50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
14d60 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
14d70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
14d80 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f  TERN int Sqlite_
14d90 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  SafeUnload(Tcl_I
14da0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
14db0 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
14dc0 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
14dd0 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
14de0 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f  _SafeUnload(Tcl_
14df0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
14e00 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75  int flags){ retu
14e10 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a 23 65 6e 64  rn TCL_OK;}.#end
14e20 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48  if..#ifdef TCLSH
14e30 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14e80 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
14e90 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64   follows is used
14ea0 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61   to build standa
14eb0 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72  lone TCL interpr
14ec0 65 74 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 72  eters.** that ar
14ed0 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  e statically lin
14ee0 6b 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 2e  ked with SQLite.
14ef0 20 20 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    .*/../*.** If 
14f00 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20  the macro TCLSH 
14f10 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74  is one, then put
14f20 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f   in code this fo
14f30 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20  r the.** "main" 
14f40 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
14f50 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c  l initialize Tcl
14f60 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20   and take input 
14f70 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64  from.** standard
14f80 20 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 61 20   input, or if a 
14f90 66 69 6c 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e  file is named on
14fa0 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
14fb0 65 0a 2a 2a 20 74 68 65 20 54 43 4c 20 69 6e 74  e.** the TCL int
14fc0 65 72 70 72 65 74 65 72 20 72 65 61 64 73 20 61  erpreter reads a
14fd0 6e 64 20 65 76 61 6c 75 61 74 65 73 20 74 68 61  nd evaluates tha
14fe0 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54  t file..*/.#if T
14ff0 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63  CLSH==1.static c
15000 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20  har zMainloop[] 
15010 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d  =.  "set line {}
15020 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b  \n".  "while {![
15030 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22  eof stdin]} {\n"
15040 0a 20 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21  .    "if {$line!
15050 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20  =\"\"} {\n".    
15060 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
15070 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20  ne \"> \"\n".   
15080 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
15090 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77      "puts -nonew
150a0 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20  line \"% \"\n". 
150b0 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c     "}\n".    "fl
150c0 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20  ush stdout\n".  
150d0 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b    "append line [
150e0 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20  gets stdin]\n". 
150f0 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f     "if {[info co
15100 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b  mplete $line]} {
15110 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b  \n".      "if {[
15120 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23  catch {uplevel #
15130 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d  0 $line} result]
15140 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  } {\n".        "
15150 70 75 74 73 20 73 74 64 65 72 72 20 5c 22 45 72  puts stderr \"Er
15160 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e  ror: $result\"\n
15170 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69  ".      "} elsei
15180 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22  f {$result!=\"\"
15190 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  } {\n".        "
151a0 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a  puts $result\n".
151b0 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20        "}\n".    
151c0 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
151d0 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c  ".    "} else {\
151e0 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64  n".      "append
151f0 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20   line \\n\n".   
15200 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b   "}\n".  "}\n".;
15210 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
15220 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53  f the macro TCLS
15230 48 20 69 73 20 74 77 6f 2c 20 74 68 65 6e 20 67  H is two, then g
15240 65 74 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70  et the main loop
15250 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20   code out of.** 
15260 74 68 65 20 73 65 70 61 72 61 74 65 20 66 69 6c  the separate fil
15270 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c  e "spaceanal_tcl
15280 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53  .h"..*/.#if TCLS
15290 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 68 61 72  H==2.static char
152a0 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a   zMainloop[] = .
152b0 23 69 6e 63 6c 75 64 65 20 22 73 70 61 63 65 61  #include "spacea
152c0 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e  nal_tcl.h".;.#en
152d0 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c  dif..#define TCL
152e0 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f  SH_MAIN main   /
152f0 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65  * Needed to fake
15300 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f   out mktclapp */
15310 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28  .int TCLSH_MAIN(
15320 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
15330 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e  *argv){.  Tcl_In
15340 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
15350 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74  .  /* Call sqlit
15360 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e  e3_shutdown() on
15370 63 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  ce before doing 
15380 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 54  anything else. T
15390 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74  his is to.  ** t
153a0 65 73 74 20 74 68 61 74 20 73 71 6c 69 74 65 33  est that sqlite3
153b0 5f 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e 20  _shutdown() can 
153c0 62 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65 64  be safely called
153d0 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 62 65   by a process be
153e0 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  fore.  ** sqlite
153f0 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
15400 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  s. */.  sqlite3_
15410 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20 20 54  shutdown();..  T
15420 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c  cl_FindExecutabl
15430 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  e(argv[0]);.  in
15440 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74  terp = Tcl_Creat
15450 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c  eInterp();.  Sql
15460 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
15470 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
15480 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78  _TEST.  {.    ex
15490 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69  tern int Md5_Ini
154a0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
154b0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
154c0 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74  qliteconfig_Init
154d0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
154e0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
154f0 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
15500 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
15510 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
15520 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c  tetest2_Init(Tcl
15530 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
15540 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
15550 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49  test3_Init(Tcl_I
15560 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
15570 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
15580 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st4_Init(Tcl_Int
15590 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
155a0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
155b0 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  5_Init(Tcl_Inter
155c0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
155d0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f  int Sqlitetest6_
155e0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
155f0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
15600 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e  t Sqlitetest7_In
15610 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
15620 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
15630 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74  Sqlitetest8_Init
15640 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
15650 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
15660 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54  litetest9_Init(T
15670 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
15680 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
15690 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74  tetestasync_Init
156a0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
156b0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
156c0 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74  litetest_autoext
156d0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
156e0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
156f0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75  nt Sqlitetest_fu
15700 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
15710 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
15720 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
15730 68 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49  hexio_Init(Tcl_I
15740 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
15750 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
15760 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 54  st_malloc_Init(T
15770 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
15780 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
15790 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69  tetest_mutex_Ini
157a0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
157b0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
157c0 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f  qlitetestschema_
157d0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
157e0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
157f0 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f  t Sqlitetestsse_
15800 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
15810 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
15820 74 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76  t Sqlitetesttclv
15830 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ar_Init(Tcl_Inte
15840 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
15850 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54   int SqlitetestT
15860 68 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49  hread_Init(Tcl_I
15870 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
15880 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
15890 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29  stOnefile_Init()
158a0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
158b0 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73   SqlitetestOsins
158c0 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  t_Init(Tcl_Inter
158d0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
158e0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 62 61  int Sqlitetestba
158f0 63 6b 75 70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ckup_Init(Tcl_In
15900 74 65 72 70 2a 29 3b 0a 0a 20 20 20 20 4d 64 35  terp*);..    Md5
15910 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
15920 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f     Sqliteconfig_
15930 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
15940 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e    Sqlitetest1_In
15950 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
15960 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74  Sqlitetest2_Init
15970 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
15980 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69  litetest3_Init(i
15990 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
159a0 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74  tetest4_Init(int
159b0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
159c0 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72  test5_Init(inter
159d0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
159e0 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st6_Init(interp)
159f0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
15a00 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  7_Init(interp);.
15a10 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f      Sqlitetest8_
15a20 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
15a30 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e    Sqlitetest9_In
15a40 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
15a50 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f  Sqlitetestasync_
15a60 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
15a70 20 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74    Sqlitetest_aut
15a80 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  oext_Init(interp
15a90 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
15aa0 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65  t_func_Init(inte
15ab0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
15ac0 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69  est_hexio_Init(i
15ad0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
15ae0 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e  tetest_malloc_In
15af0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
15b00 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78  Sqlitetest_mutex
15b10 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
15b20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 63 68     Sqlitetestsch
15b30 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ema_Init(interp)
15b40 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
15b50 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65  tclvar_Init(inte
15b60 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
15b70 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 69  estThread_Init(i
15b80 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
15b90 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e  tetestOnefile_In
15ba0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
15bb0 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74  SqlitetestOsinst
15bc0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
15bd0 20 20 20 53 71 6c 69 74 65 74 65 73 74 62 61 63     Sqlitetestbac
15be0 6b 75 70 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  kup_Init(interp)
15bf0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
15c00 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74  _SSE.    Sqlitet
15c10 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65  estsse_Init(inte
15c20 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  rp);.#endif.  }.
15c30 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67  #endif.  if( arg
15c40 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32  c>=2 || TCLSH==2
15c50 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
15c60 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32     char zArgc[32
15c70 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
15c80 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
15c90 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25  Argc), zArgc, "%
15ca0 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c 53  d", argc-(3-TCLS
15cb0 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  H));.    Tcl_Set
15cc0 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 63  Var(interp,"argc
15cd0 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c  ", zArgc, TCL_GL
15ce0 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
15cf0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
15d00 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31  p,"argv0",argv[1
15d10 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  ],TCL_GLOBAL_ONL
15d20 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56  Y);.    Tcl_SetV
15d30 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22  ar(interp,"argv"
15d40 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  , "", TCL_GLOBAL
15d50 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28  _ONLY);.    for(
15d60 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67  i=3-TCLSH; i<arg
15d70 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  c; i++){.      T
15d80 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
15d90 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69  , "argv", argv[i
15da0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c  ],.          TCL
15db0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54  _GLOBAL_ONLY | T
15dc0 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20  CL_LIST_ELEMENT 
15dd0 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c  | TCL_APPEND_VAL
15de0 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  UE);.    }.    i
15df0 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54  f( TCLSH==1 && T
15e00 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65  cl_EvalFile(inte
15e10 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43  rp, argv[1])!=TC
15e20 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f  L_OK ){.      co
15e30 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20  nst char *zInfo 
15e40 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74  = Tcl_GetVar(int
15e50 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22  erp, "errorInfo"
15e60 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
15e70 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49  Y);.      if( zI
15e80 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d  nfo==0 ) zInfo =
15e90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
15ea0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
15eb0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
15ec0 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a  rr,"%s: %s\n", *
15ed0 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20  argv, zInfo);.  
15ee0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15ef0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72    }.  }.  if( ar
15f00 67 63 3c 3d 31 20 7c 7c 20 54 43 4c 53 48 3d 3d  gc<=1 || TCLSH==
15f10 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f  2 ){.    Tcl_Glo
15f20 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  balEval(interp, 
15f30 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a  zMainloop);.  }.
15f40 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
15f50 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f  ndif /* TCLSH */
15f60 0a                                               .