/ Hex Artifact Content
Login

Artifact 4415e1033bd3e92b05a6a9cde911ee4de3b82df9:


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 33 20 32 30 30 39  e.c,v 1.233 2009
0220: 2f 30 31 2f 30 32 20 31 37 3a 33 33 3a 34 36 20  /01/02 17:33:46 
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: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c  SqlCollate *pCol
0fb0: 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c 69  late;      /* Li
0fc0: 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61 74  st of SQL collat
0fd0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ion functions */
0fe0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1000: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   Return code of 
1010: 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
1020: 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20  te3_exec() */.  
1030: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74  Tcl_Obj *pCollat
1040: 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43 6f  eNeeded;   /* Co
1050: 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 73  llation needed s
1060: 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50 72  cript */.  SqlPr
1070: 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74  eparedStmt *stmt
1080: 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f 66  List; /* List of
1090: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
10a0: 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65 70  ents*/.  SqlPrep
10b0: 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 61  aredStmt *stmtLa
10c0: 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61 74  st; /* Last stat
10d0: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69 73  ement in the lis
10e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53 74  t */.  int maxSt
10f0: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
1100: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d 61    /* The next ma
1110: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
1120: 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  stmtList */.  in
1130: 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  t nStmt;        
1140: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1150: 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  er of statements
1160: 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   in stmtList */.
1170: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1180: 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a 20  l *pIncrblob;/* 
1190: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  Linked list of o
11a0: 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  pen incrblob cha
11b0: 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  nnels */.  int n
11c0: 53 74 65 70 2c 20 6e 53 6f 72 74 3b 20 20 20 20  Step, nSort;    
11d0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
11e0: 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65 63  ics for most rec
11f0: 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ent operation */
1200: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63 74  .  int nTransact
1210: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
1220: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74 65   Number of neste
1230: 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d 20  d [transaction] 
1240: 6d 65 74 68 6f 64 73 20 2a 2f 0a 7d 3b 0a 0a 73  methods */.};..s
1250: 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68  truct IncrblobCh
1260: 61 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65  annel {.  sqlite
1270: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20  3_blob *pBlob;  
1280: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 62      /* sqlite3 b
1290: 6c 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  lob handle */.  
12a0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20  SqliteDb *pDb;  
12b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
12c0: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
12d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
12e0: 20 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20   int iSeek;     
12f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1300: 72 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65  rrent seek offse
1310: 74 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e  t */.  Tcl_Chann
1320: 65 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20  el channel;     
1330: 20 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e   /* Channel iden
1340: 74 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72  tifier */.  Incr
1350: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65  blobChannel *pNe
1360: 78 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20  xt;   /* Linked 
1370: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  list of all open
1380: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
1390: 6c 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62  ls */.  Incrblob
13a0: 43 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20  Channel *pPrev; 
13b0: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
13c0: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63   of all open inc
13d0: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
13e0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  /.};../*.** Comp
13f0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e  ute a string len
1400: 67 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69  gth that is limi
1410: 74 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20  ted to what can 
1420: 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  be stored in.** 
1430: 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f 66  lower 30 bits of
1440: 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64   a 32-bit signed
1450: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
1460: 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30  tic int strlen30
1470: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
1480: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1490: 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20  2 = z;.  while( 
14a0: 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20  *z2 ){ z2++; }. 
14b0: 20 72 65 74 75 72 6e 20 30 78 33 66 66 66 66 66   return 0x3fffff
14c0: 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20  ff & (int)(z2 - 
14d0: 7a 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  z);.}...#ifndef 
14e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
14f0: 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  BLOB./*.** Close
1500: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68   all incrblob ch
1510: 61 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75 73  annels opened us
1520: 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ing database con
1530: 6e 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20  nection pDb..** 
1540: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77  This is called w
1550: 68 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f 77  hen shutting dow
1560: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  n the database c
1570: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
1580: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 49  atic void closeI
1590: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
15a0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a  SqliteDb *pDb){.
15b0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
15c0: 6c 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62  l *p;.  Incrblob
15d0: 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a  Channel *pNext;.
15e0: 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49  .  for(p=pDb->pI
15f0: 6e 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e  ncrblob; p; p=pN
1600: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
1610: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20  = p->pNext;..   
1620: 20 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e   /* Note: Callin
1630: 67 20 75 6e 72 65 67 69 73 74 65 72 20 68 65 72  g unregister her
1640: 65 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65  e call Tcl_Close
1650: 20 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f 62   on the incrblob
1660: 20 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a   channel, .    *
1670: 2a 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20  * which deletes 
1680: 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  the IncrblobChan
1690: 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 61 74  nel structure at
16a0: 20 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20   *p. So do not. 
16b0: 20 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46     ** call Tcl_F
16c0: 72 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20 20  ree() here..    
16d0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65 67  */.    Tcl_Unreg
16e0: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44 62  isterChannel(pDb
16f0: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61  ->interp, p->cha
1700: 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  nnel);.  }.}../*
1710: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63  .** Close an inc
1720: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
1730: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
1740: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f   int incrblobClo
1750: 73 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  se(ClientData in
1760: 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f  stanceData, Tcl_
1770: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1780: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1790: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
17a0: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
17b0: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72  nceData;.  int r
17c0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
17d0: 5f 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29  _close(p->pBlob)
17e0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
17f0: 3d 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20  = p->pDb->db;.. 
1800: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63   /* Remove the c
1810: 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20  hannel from the 
1820: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
1830: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66  ob list. */.  if
1840: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
1850: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
1860: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
1870: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  }.  if( p->pPrev
1880: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
1890: 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
18a0: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
18b0: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d  >pDb->pIncrblob=
18c0: 3d 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62  =p ){.    p->pDb
18d0: 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d  ->pIncrblob = p-
18e0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f  >pNext;.  }..  /
18f0: 2a 20 46 72 65 65 20 74 68 65 20 49 6e 63 72 62  * Free the Incrb
1900: 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63  lobChannel struc
1910: 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72  ture */.  Tcl_Fr
1920: 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a  ee((char *)p);..
1930: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1940: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
1950: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1960: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1970: 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c  _errmsg(db), TCL
1980: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
1990: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
19b0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19c0: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
19d0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
19e0: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
19f0: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
1a00: 6f 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e  obInput(.  Clien
1a10: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
1a20: 74 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75 66  ta, .  char *buf
1a30: 2c 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a 65  , .  int bufSize
1a40: 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f  ,.  int *errorCo
1a50: 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62  dePtr.){.  Incrb
1a60: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
1a70: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
1a80: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
1a90: 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 62  .  int nRead = b
1aa0: 75 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ufSize;         
1ab0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1ac0: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
1ad0: 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af0: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
1b00: 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20  e blob */.  int 
1b10: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
1b30: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
1b40: 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  nBlob = sqli
1b50: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
1b60: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  ->pBlob);.  if( 
1b70: 28 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29  (p->iSeek+nRead)
1b80: 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52  >nBlob ){.    nR
1b90: 65 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69  ead = nBlob-p->i
1ba0: 53 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Seek;.  }.  if( 
1bb0: 6e 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20  nRead<=0 ){.    
1bc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1bd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
1be0: 6f 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62  ob_read(p->pBlob
1bf0: 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e  , (void *)buf, n
1c00: 52 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b  Read, p->iSeek);
1c10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1c20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72  E_OK ){.    *err
1c30: 6f 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a  orCodePtr = rc;.
1c40: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1c50: 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b   }..  p->iSeek +
1c60: 3d 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75 72  = nRead;.  retur
1c70: 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nRead;.}../*.*
1c80: 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20  * Write data to 
1c90: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
1ca0: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
1cb0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
1cc0: 6c 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c 69  lobOutput(.  Cli
1cd0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
1ce0: 44 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63  Data, .  CONST c
1cf0: 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74  har *buf, .  int
1d00: 20 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74 20   toWrite,.  int 
1d10: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
1d20: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1d30: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
1d40: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
1d50: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e  nceData;.  int n
1d60: 57 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65 3b  Write = toWrite;
1d70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d80: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
1d90: 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c  ite */.  int nBl
1da0: 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
1db0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
1dc0: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20  ize of the blob 
1dd0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f    /* sqlite erro
1e00: 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c  r code */..  nBl
1e10: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  ob = sqlite3_blo
1e20: 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62  b_bytes(p->pBlob
1e30: 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65  );.  if( (p->iSe
1e40: 65 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62  ek+nWrite)>nBlob
1e50: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
1e60: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
1e70: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1e80: 20 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65 3c   }.  if( nWrite<
1e90: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1ea0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
1eb0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
1ec0: 74 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f  te(p->pBlob, (vo
1ed0: 69 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74 65  id *)buf, nWrite
1ee0: 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69  , p->iSeek);.  i
1ef0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f00: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
1f10: 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20  dePtr = EIO;.   
1f20: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1f30: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e  .  p->iSeek += n
1f40: 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
1f50: 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nWrite;.}../*.**
1f60: 20 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65   Seek an increme
1f70: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1f80: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1f90: 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20   incrblobSeek(. 
1fa0: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
1fb0: 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e  anceData, .  lon
1fc0: 67 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20  g offset,.  int 
1fd0: 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20  seekMode,.  int 
1fe0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
1ff0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
2000: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
2010: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
2020: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69 74  nceData;..  swit
2030: 63 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a  ch( seekMode ){.
2040: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53 45      case SEEK_SE
2050: 54 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  T:.      p->iSee
2060: 6b 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  k = offset;.    
2070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2080: 65 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20  e SEEK_CUR:.    
2090: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66    p->iSeek += of
20a0: 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  fset;.      brea
20b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b  k;.    case SEEK
20c0: 5f 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69  _END:.      p->i
20d0: 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62  Seek = sqlite3_b
20e0: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c  lob_bytes(p->pBl
20f0: 6f 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20  ob) + offset;.  
2100: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2110: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
2120: 21 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22 29  !"Bad seekMode")
2130: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2140: 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74  p->iSeek;.}...st
2150: 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62 6c  atic void incrbl
2160: 6f 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44 61  obWatch(ClientDa
2170: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
2180: 20 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f   int mode){ .  /
2190: 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74  * NO-OP */ .}.st
21a0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
21b0: 62 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61  bHandle(ClientDa
21c0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
21d0: 20 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e 74   int dir, Client
21e0: 44 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20 72  Data *hPtr){.  r
21f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2200: 0a 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 43  .}..static Tcl_C
2210: 68 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72 62  hannelType Incrb
2220: 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d  lobChannelType =
2230: 20 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c   {.  "incrblob",
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65 4e          /* typeN
2260: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 2a 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c  */.  TCL_CHANNEL
2290: 5f 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20  _VERSION_2,     
22a0: 20 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73 69          /* versi
22b0: 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f  */.  incrblobClo
22e0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
22f0: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65          /* close
2300: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70  */.  incrblobInp
2330: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
2340: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75 74          /* input
2350: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74  */.  incrblobOut
2380: 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  put,            
2390: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70 75          /* outpu
23a0: 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  tProc           
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65 65  */.  incrblobSee
23d0: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23e0: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b 50          /* seekP
23f0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f 70          /* setOp
2440: 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20  tionProc        
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f 70          /* getOp
2490: 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20  tionProc        
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61 74  */.  incrblobWat
24c0: 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
24d0: 20 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63 68          /* watch
24e0: 50 72 6f 63 20 28 74 68 69 73 20 69 73 20 61 20  Proc (this is a 
24f0: 6e 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20 20  no-op)          
2500: 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e  */.  incrblobHan
2510: 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  dle,            
2520: 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48 61          /* getHa
2530: 6e 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79 73  ndleProc (always
2540: 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29 20   returns error) 
2550: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65          /* close
2580: 32 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  2Proc           
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b          /* block
25d0: 4d 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20 20  ModeProc        
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73 68          /* flush
2620: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c          /* handl
2670: 65 72 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  erProc          
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65 53          /* wideS
26c0: 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20  eekProc         
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  */.};../*.** Cre
26f0: 61 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62 6c  ate a new incrbl
2700: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
2710: 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
2720: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28  IncrblobChannel(
2730: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2740: 6e 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74 65  nterp, .  Sqlite
2750: 44 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73  Db *pDb, .  cons
2760: 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63  t char *zDb,.  c
2770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
2780: 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e, .  const char
2790: 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71   *zColumn, .  sq
27a0: 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c  lite_int64 iRow,
27b0: 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
27c0: 79 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  y.){.  IncrblobC
27d0: 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c  hannel *p;.  sql
27e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e  ite3 *db = pDb->
27f0: 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  db;.  sqlite3_bl
2800: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
2810: 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73   rc;.  int flags
2820: 20 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c   = TCL_READABLE|
2830: 28 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20  (isReadonly ? 0 
2840: 3a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b  : TCL_WRITABLE);
2850: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72 69  ..  /* This vari
2860: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
2870: 6e 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65 6c  name the channel
2880: 73 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e  s: "incrblob_[in
2890: 63 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20  cr count]" */.  
28a0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
28b0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43 68   = 0;.  char zCh
28c0: 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63  annel[64];..  rc
28d0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
28e0: 6f 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54  open(db, zDb, zT
28f0: 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69  able, zColumn, i
2900: 52 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79  Row, !isReadonly
2910: 2c 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  , &pBlob);.  if(
2920: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2930: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
2940: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
2950: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
2960: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
2970: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
2980: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2990: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e  ;.  }..  p = (In
29a0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
29b0: 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66  Tcl_Alloc(sizeof
29c0: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
29d0: 29 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d  ));.  p->iSeek =
29e0: 20 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d   0;.  p->pBlob =
29f0: 20 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74   pBlob;..  sqlit
2a00: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2a10: 6f 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43  of(zChannel), zC
2a20: 68 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f  hannel, "incrblo
2a30: 62 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b  b_%d", ++count);
2a40: 0a 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20  .  p->channel = 
2a50: 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65  Tcl_CreateChanne
2a60: 6c 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  l(&IncrblobChann
2a70: 65 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c  elType, zChannel
2a80: 2c 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54  , p, flags);.  T
2a90: 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e  cl_RegisterChann
2aa0: 65 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68  el(interp, p->ch
2ab0: 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69  annel);..  /* Li
2ac0: 6e 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e 6e  nk the new chann
2ad0: 65 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c 69  el into the Sqli
2ae0: 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c  teDb.pIncrblob l
2af0: 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65  ist. */.  p->pNe
2b00: 78 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62  xt = pDb->pIncrb
2b10: 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20  lob;.  p->pPrev 
2b20: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  = 0;.  if( p->pN
2b30: 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
2b40: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
2b50: 20 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72    }.  pDb->pIncr
2b60: 62 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70  blob = p;.  p->p
2b70: 44 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c  Db = pDb;..  Tcl
2b80: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2b90: 70 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47  p, (char *)Tcl_G
2ba0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d  etChannelName(p-
2bb0: 3e 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56  >channel), TCL_V
2bc0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75  OLATILE);.  retu
2bd0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c  rn TCL_OK;.}.#el
2be0: 73 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75  se  /* else clau
2bf0: 73 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66 20  se for "#ifndef 
2c00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
2c10: 42 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66 69  BLOB" */.  #defi
2c20: 6e 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62  ne closeIncrblob
2c30: 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65  Channels(pDb).#e
2c40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  ndif../*.** Look
2c50: 20 61 74 20 74 68 65 20 73 63 72 69 70 74 20 70   at the script p
2c60: 72 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20 20  refix in pCmd.  
2c70: 57 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75  We will be execu
2c80: 74 69 6e 67 20 74 68 69 73 20 73 63 72 69 70 74  ting this script
2c90: 0a 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74 20  .** after first 
2ca0: 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72  appending one or
2cb0: 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e   more arguments.
2cc0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
2cd0: 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73  nalyzes.** the s
2ce0: 63 72 69 70 74 20 74 6f 20 73 65 65 20 69 66 20  cript to see if 
2cf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
2d00: 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  e Tcl_EvalObjv()
2d10: 20 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a 2a   on the script.*
2d20: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68  * rather than th
2d30: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 54  e more general T
2d40: 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54 63  cl_EvalEx().  Tc
2d50: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20  l_EvalObjv() is 
2d60: 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a  much.** faster..
2d70: 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74 68  **.** Scripts th
2d80: 61 74 20 61 72 65 20 73 61 66 65 20 74 6f 20 75  at are safe to u
2d90: 73 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61 6c  se with Tcl_Eval
2da0: 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73 20  Objv() consists 
2db0: 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20  of a.** command 
2dc0: 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  name followed by
2dd0: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72   zero or more ar
2de0: 67 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f 20  guments with no 
2df0: 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72  [...] or $.** or
2e00: 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62   {...} or ; to b
2e10: 65 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65 2e  e seen anywhere.
2e20: 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20    Most callback 
2e30: 73 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74 0a  scripts consist.
2e40: 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69 6e  ** of just a sin
2e50: 67 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e 61  gle procedure na
2e60: 6d 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65 74  me and they meet
2e70: 20 74 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e   this requiremen
2e80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2e90: 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62   safeToUseEvalOb
2ea0: 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  jv(Tcl_Interp *i
2eb0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
2ec0: 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63  pCmd){.  /* We c
2ed0: 6f 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20 73  ould try to do s
2ee0: 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54 63  omething with Tc
2ef0: 6c 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74 20  l_Parse().  But 
2f00: 77 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a  we will instead.
2f10: 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20 73    ** just do a s
2f20: 65 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69 64  earch for forbid
2f30: 64 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20  den characters. 
2f40: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
2f50: 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68  orbidden.  ** ch
2f60: 61 72 61 63 74 65 72 73 20 61 70 70 65 61 72 20  aracters appear 
2f70: 69 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c  in pCmd, we will
2f80: 20 72 65 70 6f 72 74 20 74 68 65 20 73 74 72 69   report the stri
2f90: 6e 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20 20  ng as unsafe..  
2fa0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2fb0: 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a  *z;.  int n;.  z
2fc0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2fd0: 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e  FromObj(pCmd, &n
2fe0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  );.  while( n-- 
2ff0: 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  > 0 ){.    int c
3000: 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69   = *(z++);.    i
3010: 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d  f( c=='$' || c==
3020: 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20  '[' || c==';' ) 
3030: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3040: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
3050: 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46 75  ** Find an SqlFu
3060: 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 69 74  nc structure wit
3070: 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65  h the given name
3080: 2e 20 20 4f 72 20 63 72 65 61 74 65 20 61 20 6e  .  Or create a n
3090: 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20  ew.** one if an 
30a0: 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e  existing one can
30b0: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20 52  not be found.  R
30c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
30d0: 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63 74  to the.** struct
30e0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ure..*/.static S
30f0: 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46  qlFunc *findSqlF
3100: 75 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70 44  unc(SqliteDb *pD
3110: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
3120: 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63  Name){.  SqlFunc
3130: 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e   *p, *pNew;.  in
3140: 74 20 69 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53  t i;.  pNew = (S
3150: 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f  qlFunc*)Tcl_Allo
3160: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
3170: 20 2b 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d   + strlen30(zNam
3180: 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65 77  e) + 1 );.  pNew
3190: 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ->zName = (char*
31a0: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f 72  )&pNew[1];.  for
31b0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
31c0: 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61 6d  i++){ pNew->zNam
31d0: 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a  e[i] = tolower(z
31e0: 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20 70 4e  Name[i]); }.  pN
31f0: 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ew->zName[i] = 0
3200: 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70  ;.  for(p=pDb->p
3210: 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Func; p; p=p->pN
3220: 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28 20 73  ext){ .    if( s
3230: 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20  trcmp(p->zName, 
3240: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  pNew->zName)==0 
3250: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72 65  ){.      Tcl_Fre
3260: 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b 0a  e((char*)pNew);.
3270: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a        return p;.
3280: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
3290: 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e  ->interp = pDb->
32a0: 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d 3e  interp;.  pNew->
32b0: 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70  pScript = 0;.  p
32c0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  New->pNext = pDb
32d0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e  ->pFunc;.  pDb->
32e0: 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20  pFunc = pNew;.  
32f0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
3300: 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61  /*.** Finalize a
3310: 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20 6f  nd free a list o
3320: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
3330: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
3340: 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43 61  void flushStmtCa
3350: 63 68 65 28 20 53 71 6c 69 74 65 44 62 20 2a 70  che( SqliteDb *p
3360: 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65 70 61  Db ){.  SqlPrepa
3370: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
3380: 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20 70 44  t;..  while(  pD
3390: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20  b->stmtList ){. 
33a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
33b0: 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69  ize( pDb->stmtLi
33c0: 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
33d0: 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d   pPreStmt = pDb-
33e0: 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 70  >stmtList;.    p
33f0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70  Db->stmtList = p
3400: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 4e  Db->stmtList->pN
3410: 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  ext;.    Tcl_Fre
3420: 65 28 20 28 63 68 61 72 2a 29 70 50 72 65 53 74  e( (char*)pPreSt
3430: 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  mt );.  }.  pDb-
3440: 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44  >nStmt = 0;.  pD
3450: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b  b->stmtLast = 0;
3460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63 61  .}../*.** TCL ca
3470: 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65 64 75  lls this procedu
3480: 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c 69 74  re when an sqlit
3490: 65 33 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d  e3 database comm
34a0: 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74 65  and is.** delete
34b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
34c0: 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76 6f  d DbDeleteCmd(vo
34d0: 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74  id *db){.  Sqlit
34e0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
34f0: 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73  teDb*)db;.  flus
3500: 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b  hStmtCache(pDb);
3510: 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62  .  closeIncrblob
3520: 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b 0a 20  Channels(pDb);. 
3530: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
3540: 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65  Db->db);.  while
3550: 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a  ( pDb->pFunc ){.
3560: 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75      SqlFunc *pFu
3570: 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b  nc = pDb->pFunc;
3580: 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63 20  .    pDb->pFunc 
3590: 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a  = pFunc->pNext;.
35a0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
35b0: 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72  ount(pFunc->pScr
35c0: 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72  ipt);.    Tcl_Fr
35d0: 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29  ee((char*)pFunc)
35e0: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
35f0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  Db->pCollate ){.
3600: 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a      SqlCollate *
3610: 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e  pCollate = pDb->
3620: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44  pCollate;.    pD
3630: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43  b->pCollate = pC
3640: 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20  ollate->pNext;. 
3650: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3660: 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20  r*)pCollate);.  
3670: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75  }.  if( pDb->zBu
3680: 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  sy ){.    Tcl_Fr
3690: 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a  ee(pDb->zBusy);.
36a0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
36b0: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c  Trace ){.    Tcl
36c0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
36d0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  e);.  }.  if( pD
36e0: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
36f0: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3700: 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d 0a  >zProfile);.  }.
3710: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
3720: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
3730: 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20  (pDb->zAuth);.  
3740: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75  }.  if( pDb->zNu
3750: 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  ll ){.    Tcl_Fr
3760: 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  ee(pDb->zNull);.
3770: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3780: 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20  UpdateHook ){.  
3790: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
37a0: 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  nt(pDb->pUpdateH
37b0: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
37c0: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
37d0: 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ok ){.    Tcl_De
37e0: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
37f0: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
3800: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3810: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b  CollateNeeded ){
3820: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3830: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
3840: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d 0a  ateNeeded);.  }.
3850: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3860: 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  *)pDb);.}../*.**
3870: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3880: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64   called when a d
3890: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
38a0: 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79  locked while try
38b0: 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74  ing.** to execut
38c0: 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63  e SQL..*/.static
38d0: 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c   int DbBusyHandl
38e0: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74  er(void *cd, int
38f0: 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69   nTries){.  Sqli
3900: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3910: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
3920: 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c   rc;.  char zVal
3930: 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  [30];..  sqlite3
3940: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
3950: 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22 25  (zVal), zVal, "%
3960: 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72  d", nTries);.  r
3970: 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28  c = Tcl_VarEval(
3980: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
3990: 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56  ->zBusy, " ", zV
39a0: 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  al, (char*)0);. 
39b0: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
39c0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
39d0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
39e0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
39f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3a00: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69   return 1;.}..#i
3a10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3a20: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
3a30: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
3a40: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
3a50: 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72 65  d as the 'progre
3a60: 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72  ss callback' for
3a70: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
3a80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 50  /.static int DbP
3a90: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28 76  rogressHandler(v
3aa0: 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69  oid *cd){.  Sqli
3ab0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3ac0: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
3ad0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
3ae0: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
3af0: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ;.  rc = Tcl_Eva
3b00: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
3b10: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
3b20: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
3b30: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
3b40: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
3b50: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
3b60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
3b70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
3b80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
3b90: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
3ba0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3bb0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
3bc0: 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63 65  the SQLite trace
3bd0: 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65   handler wheneve
3be0: 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b  r a new.** block
3bf0: 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63 75   of SQL is execu
3c00: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
3c10: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72  ript in pDb->zTr
3c20: 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64 2e  ace is executed.
3c30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3c40: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76  DbTraceHandler(v
3c50: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
3c60: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71  har *zSql){.  Sq
3c70: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3c80: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
3c90: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
3ca0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
3cb0: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
3cc0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
3cd0: 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  tr, pDb->zTrace,
3ce0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
3cf0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
3d00: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
3d10: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
3d20: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
3d30: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
3d40: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
3d50: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
3d60: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
3d70: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
3d80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d90: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
3da0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3db0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
3dc0: 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20 68  SQLite profile h
3dd0: 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20 73  andler after a s
3de0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20  tatement.** SQL 
3df0: 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20 54  has executed.  T
3e00: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
3e10: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69   pDb->zProfile i
3e20: 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
3e30: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50 72  static void DbPr
3e40: 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69  ofileHandler(voi
3e50: 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61  d *cd, const cha
3e60: 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f  r *zSql, sqlite_
3e70: 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53 71  uint64 tm){.  Sq
3e80: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3e90: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
3ea0: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
3eb0: 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b    char zTm[100];
3ec0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
3ed0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29  intf(sizeof(zTm)
3ee0: 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c  -1, zTm, "%lld",
3ef0: 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   tm);.  Tcl_DStr
3f00: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
3f10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
3f20: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50  nd(&str, pDb->zP
3f30: 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54  rofile, -1);.  T
3f40: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
3f50: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53  Element(&str, zS
3f60: 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ql);.  Tcl_DStri
3f70: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
3f80: 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63  &str, zTm);.  Tc
3f90: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
3fa0: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
3fb0: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
3fc0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
3fd0: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  str);.  Tcl_Rese
3fe0: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
3ff0: 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  erp);.}.#endif..
4000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4010: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
4020: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
4030: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54  is committed.  T
4040: 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74  he.** TCL script
4050: 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74   in pDb->zCommit
4060: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 49   is executed.  I
4070: 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e  f it returns non
4080: 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69  -zero or.** if i
4090: 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  t throws an exce
40a0: 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73  ption, the trans
40b0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
40c0: 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a   back instead.**
40d0: 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   of being commit
40e0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
40f0: 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c  nt DbCommitHandl
4100: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
4110: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
4120: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
4130: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
4140: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
4150: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
4160: 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
4170: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
4180: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4190: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
41a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
41b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
41c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
41d0: 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c   DbRollbackHandl
41e0: 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  er(void *clientD
41f0: 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  ata){.  SqliteDb
4200: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4210: 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  b*)clientData;. 
4220: 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52 6f   assert(pDb->pRo
4230: 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69  llbackHook);.  i
4240: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4250: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
4260: 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c  terp, pDb->pRoll
4270: 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a  backHook, 0) ){.
4280: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
4290: 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74  ndError(pDb->int
42a0: 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  erp);.  }.}..sta
42b0: 74 69 63 20 76 6f 69 64 20 44 62 55 70 64 61 74  tic void DbUpdat
42c0: 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64  eHandler(.  void
42d0: 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a   *p, .  int op,.
42e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
42f0: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
4300: 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74   *zTbl, .  sqlit
4310: 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b  e_int64 rowid.){
4320: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4330: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
4340: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
4350: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  d;..  assert( pD
4360: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29  b->pUpdateHook )
4370: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ;.  assert( op==
4380: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c  SQLITE_INSERT ||
4390: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
43a0: 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45  TE || op==SQLITE
43b0: 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43  _DELETE );..  pC
43c0: 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  md = Tcl_Duplica
43d0: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61  teObj(pDb->pUpda
43e0: 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49  teHook);.  Tcl_I
43f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
4400: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
4410: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
4420: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
4430: 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20 28  ringObj(.    ( (
4440: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  op==SQLITE_INSER
4450: 54 29 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d  T)?"INSERT":(op=
4460: 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3f  =SQLITE_UPDATE)?
4470: 22 55 50 44 41 54 45 22 3a 22 44 45 4c 45 54 45  "UPDATE":"DELETE
4480: 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  "), -1));.  Tcl_
4490: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
44a0: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
44b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
44c0: 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  Db, -1));.  Tcl_
44d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
44e0: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
44f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
4500: 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  Tbl, -1));.  Tcl
4510: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4520: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
4530: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
4540: 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f  (rowid));.  Tcl_
4550: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4560: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
4570: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 7d  _EVAL_DIRECT);.}
4580: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63  ..static void tc
4590: 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a  lCollateNeeded(.
45a0: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20    void *pCtx,.  
45b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
45c0: 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20  nt enc,.  const 
45d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
45e0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
45f0: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43 74   (SqliteDb *)pCt
4600: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  x;.  Tcl_Obj *pS
4610: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c  cript = Tcl_Dupl
4620: 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43  icateObj(pDb->pC
4630: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
4640: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4650: 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63  t(pScript);.  Tc
4660: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4670: 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70  lement(0, pScrip
4680: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
4690: 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b  Obj(zName, -1));
46a0: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
46b0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53  (pDb->interp, pS
46c0: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c  cript, 0);.  Tcl
46d0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
46e0: 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  cript);.}../*.**
46f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4700: 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75   called to evalu
4710: 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61  ate an SQL colla
4720: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d  tion function im
4730: 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69  plemented.** usi
4740: 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a  ng TCL script..*
4750: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c  /.static int tcl
4760: 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f  SqlCollate(.  vo
4770: 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  id *pCtx,.  int 
4780: 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  nA,.  const void
4790: 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a   *zA,.  int nB,.
47a0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
47b0: 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65  .){.  SqlCollate
47c0: 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74   *p = (SqlCollat
47d0: 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f  e *)pCtx;.  Tcl_
47e0: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43  Obj *pCmd;..  pC
47f0: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  md = Tcl_NewStri
4800: 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74  ngObj(p->zScript
4810: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
4820: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4830: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4840: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
4850: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c  nterp, pCmd, Tcl
4860: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41  _NewStringObj(zA
4870: 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , nA));.  Tcl_Li
4880: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4890: 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  nt(p->interp, pC
48a0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
48b0: 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20  gObj(zB, nB));. 
48c0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
48d0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
48e0: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
48f0: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
4900: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72 65  ount(pCmd);.  re
4910: 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47  turn (atoi(Tcl_G
4920: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
4930: 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a  ->interp)));.}..
4940: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4950: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
4960: 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20  evaluate an SQL 
4970: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
4980: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43  nted.** using TC
4990: 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61  L script..*/.sta
49a0: 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71 6c 46  tic void tclSqlF
49b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
49c0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
49d0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
49e0: 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20  value**argv){.  
49f0: 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c  SqlFunc *p = sql
4a00: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
4a10: 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f  ontext);.  Tcl_O
4a20: 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20  bj *pCmd;.  int 
4a30: 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  i;.  int rc;..  
4a40: 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20  if( argc==0 ){. 
4a50: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
4a60: 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  re no arguments 
4a70: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  to the function,
4a80: 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62   call Tcl_EvalOb
4a90: 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  jEx on the.    *
4aa0: 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 20  * script object 
4ab0: 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
4ac0: 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c 20 63  allows the TCL c
4ad0: 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e 65 72  ompiler to gener
4ae0: 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 63  ate.    ** bytec
4af0: 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ode for the comm
4b00: 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74  and on the first
4b10: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20   invocation and 
4b20: 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  thus make.    **
4b30: 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
4b40: 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66 61 73  cations much fas
4b50: 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64  ter. */.    pCmd
4b60: 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20   = p->pScript;. 
4b70: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
4b80: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 72  unt(pCmd);.    r
4b90: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
4ba0: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
4bb0: 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44  d, 0);.    Tcl_D
4bc0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ecrRefCount(pCmd
4bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4be0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
4bf0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
4c00: 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20   function, make 
4c10: 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f  a shallow copy o
4c20: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72  f the.    ** scr
4c30: 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70  ipt object, lapp
4c40: 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74  end the argument
4c50: 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  s, then evaluate
4c60: 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a   the copy..    *
4c70: 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73 68 61  *.    ** By "sha
4c80: 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65 20 6d  llow" copy, we m
4c90: 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f  ean a only the o
4ca0: 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62  uter list Tcl_Ob
4cb0: 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e  j is duplicated.
4cc0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20  .    ** The new 
4cd0: 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73  Tcl_Obj contains
4ce0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
4cf0: 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 65   original list e
4d00: 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a  lements. .    **
4d10: 20 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e 20   That way, when 
4d20: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69  Tcl_EvalObjv() i
4d30: 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65  s run and shimme
4d40: 72 73 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  rs the first ele
4d50: 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ment.    ** of t
4d60: 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d  he list to tclCm
4d70: 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74 20  dNameType, that 
4d80: 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65 73  alternate repres
4d90: 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20  entation will.  
4da0: 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76 65    ** be preserve
4db0: 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20  d and reused on 
4dc0: 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61 74  the next invocat
4dd0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
4de0: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a  Tcl_Obj **aArg;.
4df0: 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
4e00: 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62    if( Tcl_ListOb
4e10: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e  jGetElements(p->
4e20: 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72 69  interp, p->pScri
4e30: 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72 67  pt, &nArg, &aArg
4e40: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
4e50: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
4e60: 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74  context, Tcl_Get
4e70: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
4e80: 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20  interp), -1); . 
4e90: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4ea0: 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43 6d 64   }     .    pCmd
4eb0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
4ec0: 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a 20  j(nArg, aArg);. 
4ed0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
4ee0: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 66  unt(pCmd);.    f
4ef0: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
4f00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
4f10: 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d  te3_value *pIn =
4f20: 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20   argv[i];.      
4f30: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20  Tcl_Obj *pVal;. 
4f40: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
4f50: 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f    /* Set pVal to
4f60: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74   contain the i't
4f70: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73  h column of this
4f80: 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73   row. */.      s
4f90: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76  witch( sqlite3_v
4fa0: 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29  alue_type(pIn) )
4fb0: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  {.        case S
4fc0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
4fd0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
4fe0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
4ff0: 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20  e_bytes(pIn);.  
5000: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5010: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
5020: 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  bj(sqlite3_value
5030: 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65  _blob(pIn), byte
5040: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  s);.          br
5050: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5060: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
5070: 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TE_INTEGER: {.  
5080: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69          sqlite_i
5090: 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33  nt64 v = sqlite3
50a0: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e  _value_int64(pIn
50b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
50c0: 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   v>=-2147483647 
50d0: 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37  && v<=2147483647
50e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
50f0: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e  pVal = Tcl_NewIn
5100: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20  tObj(v);.       
5110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5120: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
5130: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76  _NewWideIntObj(v
5140: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
5150: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
5180: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  OAT: {.         
5190: 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69   double r = sqli
51a0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
51b0: 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  (pIn);.         
51c0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44   pVal = Tcl_NewD
51d0: 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20  oubleObj(r);.   
51e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
51f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5200: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
5210: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 56  : {.          pV
5220: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
5230: 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a 20 20  ngObj("", 0);.  
5240: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5250: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5260: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5270: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
5280: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5290: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
52a0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
52b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
52c0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
52d0: 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62  lue_text(pIn), b
52e0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
52f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5300: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5310: 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  rc = Tcl_ListObj
5320: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
5330: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70  >interp, pCmd, p
5340: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
5350: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  rc ){.        Tc
5360: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5370: 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Cmd);.        sq
5380: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5390: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
53a0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
53b0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
53c0: 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e   .        return
53d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
53e0: 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45      if( !p->useE
53f0: 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20  valObjv ){.     
5400: 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45   /* Tcl_EvalObjE
5410: 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  x() will automat
5420: 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f  ically call Tcl_
5430: 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43  EvalObjv() if pC
5440: 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  md.      ** is a
5450: 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20 61 20   list without a 
5460: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
5470: 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65  ation.  To preve
5480: 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20  nt this from.   
5490: 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c     ** happening,
54a0: 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20   make sure pCmd 
54b0: 68 61 73 20 61 20 76 61 6c 69 64 20 73 74 72 69  has a valid stri
54c0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
54d0: 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47  n */.      Tcl_G
54e0: 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a  etString(pCmd);.
54f0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54      }.    rc = T
5500: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
5510: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
5520: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
5530: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
5540: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a  ount(pCmd);.  }.
5550: 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21  .  if( rc && rc!
5560: 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20  =TCL_RETURN ){. 
5570: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5580: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
5590: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
55a0: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
55b0: 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a   -1); .  }else{.
55c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
55d0: 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  r = Tcl_GetObjRe
55e0: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b  sult(p->interp);
55f0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
5600: 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 68  u8 *data;.    ch
5610: 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72  ar *zType = pVar
5620: 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72  ->typePtr ? pVar
5630: 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20  ->typePtr->name 
5640: 3a 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20 63  : "";.    char c
5650: 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20   = zType[0];.   
5660: 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73   if( c=='b' && s
5670: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74  trcmp(zType,"byt
5680: 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70  earray")==0 && p
5690: 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b  Var->bytes==0 ){
56a0: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72  .      /* Only r
56b0: 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70  eturn a BLOB typ
56c0: 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72  e if the Tcl var
56d0: 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61  iable is a bytea
56e0: 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a  rray and.      *
56f0: 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20  * has no string 
5700: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
5710: 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  */.      data = 
5720: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
5730: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
5740: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5750: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e  _result_blob(con
5760: 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53  text, data, n, S
5770: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
5780: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5790: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
57a0: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
57b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
57c0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
57d0: 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  0, pVar, &n);.  
57e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
57f0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
5800: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n);.    }else if
5810: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
5820: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
5830: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
5840: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54  ouble r;.      T
5850: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
5860: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29  Obj(0, pVar, &r)
5870: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5880: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
5890: 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d  ntext, r);.    }
58a0: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27  else if( (c=='w'
58b0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
58c0: 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20  ,"wideInt")==0) 
58d0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d  ||.          (c=
58e0: 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='i' && strcmp(z
58f0: 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20  Type,"int")==0) 
5900: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64  ){.      Tcl_Wid
5910: 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63  eInt v;.      Tc
5920: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
5930: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29  Obj(0, pVar, &v)
5940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5950: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
5960: 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65  text, v);.    }e
5970: 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20  lse{.      data 
5980: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5990: 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
59a0: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
59b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
59c0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
59d0: 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61  text, (char *)da
59e0: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52  ta, n, SQLITE_TR
59f0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a  ANSIENT);.    }.
5a00: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
5a10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
5a20: 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54  RIZATION./*.** T
5a30: 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68 65  his is the authe
5a40: 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  ntication functi
5a50: 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20  on.  It appends 
5a60: 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  the authenticati
5a70: 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20  on.** type code 
5a80: 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67 75  and the two argu
5a90: 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20  ments to zCmd[] 
5aa0: 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  then invokes the
5ab0: 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68   result.** on th
5ac0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20  e interpreter.  
5ad0: 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78 61  The reply is exa
5ae0: 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69  mined to determi
5af0: 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74  ne if the.** aut
5b00: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c  hentication fail
5b10: 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a  s or succeeds..*
5b20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
5b30: 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f  h_callback(.  vo
5b40: 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20  id *pArg,.  int 
5b50: 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  code,.  const ch
5b60: 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e  ar *zArg1,.  con
5b70: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a  st char *zArg2,.
5b80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
5b90: 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg3,.  const cha
5ba0: 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68  r *zArg4.){.  ch
5bb0: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
5bc0: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
5bd0: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
5be0: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
5bf0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
5c00: 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b  (SqliteDb*)pArg;
5c10: 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73 61  .  if( pDb->disa
5c20: 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72 6e  bleAuth ) return
5c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
5c40: 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20  witch( code ){. 
5c50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5c60: 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20  OPY             
5c70: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5c80: 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20  _COPY"; break;. 
5c90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5ca0: 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20  REATE_INDEX     
5cb0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5cc0: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20  _CREATE_INDEX"; 
5cd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5ce0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
5cf0: 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  BLE      : zCode
5d00: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5d10: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
5d20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5d30: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
5d40: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5d50: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
5d60: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
5d70: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
5d80: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20  TE_TEMP_TABLE : 
5d90: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
5da0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
5db0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5dc0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
5dd0: 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43  TEMP_TRIGGER: zC
5de0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5df0: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  TE_TEMP_TRIGGER"
5e00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5e10: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
5e20: 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f  TEMP_VIEW  : zCo
5e30: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
5e40: 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  E_TEMP_VIEW"; br
5e50: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5e60: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
5e70: 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  GER    : zCode="
5e80: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
5e90: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
5ea0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5eb0: 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20  REATE_VIEW      
5ec0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5ed0: 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62  _CREATE_VIEW"; b
5ee0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5ef0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20  QLITE_DELETE    
5f00: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
5f10: 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b  "SQLITE_DELETE";
5f20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5f30: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
5f40: 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  EX        : zCod
5f50: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  e="SQLITE_DROP_I
5f60: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
5f70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
5f80: 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20  OP_TABLE        
5f90: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5fa0: 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  DROP_TABLE"; bre
5fb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5fc0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
5fd0: 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  DEX   : zCode="S
5fe0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
5ff0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6000: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6010: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20  ROP_TEMP_TABLE  
6020: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6030: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
6040: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6050: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
6060: 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43  EMP_TRIGGER : zC
6070: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6080: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
6090: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
60a0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
60b0: 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65  _VIEW    : zCode
60c0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
60d0: 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  MP_VIEW"; break;
60e0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
60f0: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20  _DROP_TRIGGER   
6100: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6110: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22  TE_DROP_TRIGGER"
6120: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6130: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  e SQLITE_DROP_VI
6140: 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  EW         : zCo
6150: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6160: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
6170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
6180: 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SERT            
6190: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
61a0: 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a  INSERT"; break;.
61b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
61c0: 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20  PRAGMA          
61d0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
61e0: 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b  E_PRAGMA"; break
61f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6200: 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  E_READ          
6210: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6220: 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b  ITE_READ"; break
6230: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6240: 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  E_SELECT        
6250: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6260: 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65  ITE_SELECT"; bre
6270: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6280: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20  ITE_TRANSACTION 
6290: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
62a0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
62b0: 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  N"; break;.    c
62c0: 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
62d0: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
62e0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44  Code="SQLITE_UPD
62f0: 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATE"; break;.   
6300: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54   case SQLITE_ATT
6310: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
6320: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
6330: 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  TTACH"; break;. 
6340: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6350: 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  ETACH           
6360: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6370: 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _DETACH"; break;
6380: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6390: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20  _ALTER_TABLE    
63a0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
63b0: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b  TE_ALTER_TABLE";
63c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
63d0: 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20   SQLITE_REINDEX 
63e0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
63f0: 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e="SQLITE_REINDE
6400: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
6410: 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59  ase SQLITE_ANALY
6420: 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ZE           : z
6430: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41  Code="SQLITE_ANA
6440: 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LYZE"; break;.  
6450: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
6460: 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20  EATE_VTABLE     
6470: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6480: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20  CREATE_VTABLE"; 
6490: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
64a0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
64b0: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
64c0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  ="SQLITE_DROP_VT
64d0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
64e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
64f0: 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20  NCTION          
6500: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6510: 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b  FUNCTION"; break
6520: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6530: 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20  E_SAVEPOINT     
6540: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6550: 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20  ITE_SAVEPOINT"; 
6560: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
6570: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
6580: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6590: 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a  ="????"; break;.
65a0: 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e    }.  Tcl_DStrin
65b0: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
65c0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
65d0: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74  (&str, pDb->zAut
65e0: 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  h, -1);.  Tcl_DS
65f0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
6600: 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b  nt(&str, zCode);
6610: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
6620: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
6630: 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20  , zArg1 ? zArg1 
6640: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
6650: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
6660: 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20  t(&str, zArg2 ? 
6670: 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54  zArg2 : "");.  T
6680: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
6690: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
66a0: 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22  rg3 ? zArg3 : ""
66b0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
66c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
66d0: 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67  tr, zArg4 ? zArg
66e0: 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20  4 : "");.  rc = 
66f0: 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70  Tcl_GlobalEval(p
6700: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
6710: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
6720: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
6730: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
6740: 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74  zReply = Tcl_Get
6750: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
6760: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28  ->interp);.  if(
6770: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
6780: 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29  SQLITE_OK")==0 )
6790: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
67a0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
67b0: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
67c0: 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d  "SQLITE_DENY")==
67d0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
67e0: 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c  LITE_DENY;.  }el
67f0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
6800: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e  eply,"SQLITE_IGN
6810: 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ORE")==0 ){.    
6820: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f  rc = SQLITE_IGNO
6830: 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  RE;.  }else{.   
6840: 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20   rc = 999;.  }. 
6850: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
6860: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6870: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
6880: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78  N */../*.** zTex
6890: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
68a0: 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
68b0: 76 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72  via an sqlite3_r
68c0: 65 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20  esult_text().** 
68d0: 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72  or similar inter
68e0: 66 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69  face. This routi
68f0: 6e 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c  ne returns a Tcl
6900: 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20   string object, 
6910: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f  .** reference co
6920: 75 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f  unt set to 0, co
6930: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78  ntaining the tex
6940: 74 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74  t. If a translat
6950: 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69  ion.** between i
6960: 73 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38  so8859 and UTF-8
6970: 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74   is required, it
6980: 20 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a   is preformed..*
6990: 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  /.static Tcl_Obj
69a0: 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68   *dbTextToObj(ch
69b0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29  ar const *zText)
69c0: 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61  {.  Tcl_Obj *pVa
69d0: 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52  l;.#ifdef UTF_TR
69e0: 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  ANSLATION_NEEDED
69f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64  .  Tcl_DString d
6a00: 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  Col;.  Tcl_DStri
6a10: 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20  ngInit(&dCol);. 
6a20: 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55   Tcl_ExternalToU
6a30: 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20  tfDString(NULL, 
6a40: 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c  zText, -1, &dCol
6a50: 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f  );.  pVal = Tcl_
6a60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
6a70: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64  _DStringValue(&d
6a80: 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Col), -1);.  Tcl
6a90: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43  _DStringFree(&dC
6aa0: 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61  ol);.#else.  pVa
6ab0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
6ac0: 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b  gObj(zText, -1);
6ad0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
6ae0: 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pVal;.}../*.** 
6af0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
6b00: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
6b10: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
6b20: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
6b30: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
6b40: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
6b50: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
6b60: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
6b70: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
6b80: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
6b90: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
6ba0: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
6bb0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ils..**.** The i
6bc0: 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65  nterface is like
6bd0: 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20   "readline" but 
6be0: 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  no command-line 
6bf0: 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f  editing.** is do
6c00: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64  ne..**.** copied
6c10: 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72   from shell.c fr
6c20: 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d  om '.import' com
6c30: 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63  mand.*/.static c
6c40: 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69  har *local_getli
6c50: 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74  ne(char *zPrompt
6c60: 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63  , FILE *in){.  c
6c70: 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e  har *zLine;.  in
6c80: 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e  t nLine;.  int n
6c90: 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20  ;.  int eol;..  
6ca0: 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a  nLine = 100;.  z
6cb0: 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Line = malloc( n
6cc0: 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c  Line );.  if( zL
6cd0: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
6ce0: 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f  0;.  n = 0;.  eo
6cf0: 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  l = 0;.  while( 
6d00: 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  !eol ){.    if( 
6d10: 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20  n+100>nLine ){. 
6d20: 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69       nLine = nLi
6d30: 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20  ne*2 + 100;.    
6d40: 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f    zLine = reallo
6d50: 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b  c(zLine, nLine);
6d60: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
6d70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6d80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67      }.    if( fg
6d90: 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e  ets(&zLine[n], n
6da0: 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30  Line - n, in)==0
6db0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d   ){.      if( n=
6dc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72  =0 ){.        fr
6dd0: 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
6de0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6df0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65     }.      zLine
6e00: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65  [n] = 0;.      e
6e10: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  ol = 1;.      br
6e20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  eak;.    }.    w
6e30: 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29  hile( zLine[n] )
6e40: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { n++; }.    if(
6e50: 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d   n>0 && zLine[n-
6e60: 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]=='\n' ){.    
6e70: 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69    n--;.      zLi
6e80: 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[n] = 0;.     
6e90: 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   eol = 1;.    }.
6ea0: 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65    }.  zLine = re
6eb0: 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b  alloc( zLine, n+
6ec0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c  1 );.  return zL
6ed0: 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  ine;.}.../*.** F
6ee0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f  igure out the co
6ef0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74  lumn names for t
6f00: 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
6f10: 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
6f20: 74 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74  t.** passed as t
6f30: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6f40: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  nt..**.** If par
6f50: 61 6d 65 74 65 72 20 70 61 70 43 6f 6c 4e 61 6d  ameter papColNam
6f60: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
6f70: 68 65 6e 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20  hen *papColName 
6f80: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 0a  is set to point.
6f90: 2a 2a 20 61 74 20 61 6e 20 61 72 72 61 79 20 61  ** at an array a
6fa0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 54  llocated using T
6fb0: 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 49 74 20 69  cl_Alloc(). It i
6fc0: 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65  s the callers re
6fd0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
6fe0: 74 6f 20 66 72 65 65 20 74 68 69 73 20 61 72 72  to free this arr
6ff0: 61 79 20 75 73 69 6e 67 20 54 63 6c 5f 46 72 65  ay using Tcl_Fre
7000: 65 28 29 2c 20 61 6e 64 20 74 6f 20 64 65 63 72  e(), and to decr
7010: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
7020: 6e 63 65 0a 2a 2a 20 63 6f 75 6e 74 20 6f 66 20  nce.** count of 
7030: 65 61 63 68 20 54 63 6c 5f 4f 62 6a 2a 20 6d 65  each Tcl_Obj* me
7040: 6d 62 65 72 20 6f 66 20 74 68 65 20 61 72 72 61  mber of the arra
7050: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  y..**.** The ret
7060: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
7070: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
7080: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
7090: 6d 6e 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20 72  mns of data.** r
70a0: 65 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74  eturned by pStmt
70b0: 20 28 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20   (and hence the 
70c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 2a 70 61 70  size of the *pap
70d0: 43 6f 6c 4e 61 6d 65 20 61 72 72 61 79 29 2e 0a  ColName array)..
70e0: 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20  **.** If pArray 
70f0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
7100: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  n it contains th
7110: 65 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20  e name of a Tcl 
7120: 61 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c  array.** variabl
7130: 65 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65  e. The "*" membe
7140: 72 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 20  r of this array 
7150: 69 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74  is set to a list
7160: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74   containing.** t
7170: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
7180: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
7190: 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
71a0: 74 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d  t, in order from
71b0: 0a 2a 2a 20 6c 65 66 74 20 74 6f 20 72 69 67 68  .** left to righ
71c0: 74 2e 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e  t. e.g. if the n
71d0: 61 6d 65 73 20 6f 66 20 74 68 65 20 72 65 74 75  ames of the retu
71e0: 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  rned columns are
71f0: 20 61 2c 20 62 20 61 6e 64 0a 2a 2a 20 63 2c 20   a, b and.** c, 
7200: 69 74 20 64 6f 65 73 20 74 68 65 20 65 71 75 69  it does the equi
7210: 76 61 6c 65 6e 74 20 6f 66 20 74 68 65 20 74 63  valent of the tc
7220: 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  l command:.**.**
7230: 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72 61       set ${pArra
7240: 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f  y}(*) {a b c}.*/
7250: 0a 73 74 61 74 69 63 20 69 6e 74 0a 63 6f 6d 70  .static int.comp
7260: 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  uteColumnNames(.
7270: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7280: 74 65 72 70 2c 20 0a 20 20 73 71 6c 69 74 65 33  terp, .  sqlite3
7290: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20  _stmt *pStmt,   
72a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
72b0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
72c0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43   Tcl_Obj ***papC
72d0: 6f 6c 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  olName,         
72e0: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79     /* OUT: Array
72f0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
7300: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
7310: 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20  Array           
7320: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
7330: 6f 66 20 61 72 72 61 79 20 76 61 72 69 61 62 6c  of array variabl
7340: 65 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20  e (may be null) 
7350: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c  */.){.  int nCol
7360: 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
7370: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
7380: 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
7390: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
73a0: 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 61 70 43  tmt);.  if( papC
73b0: 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e  olName ){.    in
73c0: 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  t i;.    Tcl_Obj
73d0: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28   **apColName = (
73e0: 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c  Tcl_Obj**)Tcl_Al
73f0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f  loc( sizeof(Tcl_
7400: 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20  Obj*)*nCol );.  
7410: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
7420: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  l; i++){.      a
7430: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62  pColName[i] = db
7440: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
7450: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
7460: 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 54  tmt,i));.      T
7470: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
7480: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
7490: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
74a0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
74b0: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
74c0: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
74d0: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 2a  hen create.    *
74e0: 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65  * the array(*) e
74f0: 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72  ntry for that ar
7500: 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ray.    */.    i
7510: 66 28 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20  f( pArray ){.   
7520: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c     Tcl_Obj *pCol
7530: 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  List = Tcl_NewOb
7540: 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  j();.      Tcl_O
7550: 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f  bj *pStar = Tcl_
7560: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22  NewStringObj("*"
7570: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c  , -1);.      Tcl
7580: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
7590: 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66  olList);.      f
75a0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
75b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63  i++){.        Tc
75c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
75d0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
75e0: 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61  ColList, apColNa
75f0: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  me[i]);.      }.
7600: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
7610: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
7620: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
7630: 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72  ar2(interp, pArr
7640: 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c  ay, pStar, pColL
7650: 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 54 63  ist,0);.      Tc
7660: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
7670: 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ColList);.      
7680: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
7690: 28 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20  (pStar);.    }. 
76a0: 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d     *papColName =
76b0: 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a   apColName;.  }.
76c0: 0a 20 20 72 65 74 75 72 6e 20 6e 43 6f 6c 3b 0a  .  return nCol;.
76d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71  }../*.** The "sq
76e0: 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65  lite" command be
76f0: 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e 65  low creates a ne
7700: 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f  w Tcl command fo
7710: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63  r each.** connec
7720: 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f  tion it opens to
7730: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
7740: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
7750: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a  ne is invoked.**
7760: 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66   whenever one of
7770: 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
7780: 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61  n-specific comma
7790: 6e 64 73 20 69 73 20 65 78 65 63 75 74 65 64 0a  nds is executed.
77a0: 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20  ** in Tcl.  For 
77b0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20  example, if you 
77c0: 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b  run Tcl code lik
77d0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
77e0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 31 20      sqlite3 db1 
77f0: 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a   "my_database".*
7800: 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73  *       db1 clos
7810: 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  e.**.** The firs
7820: 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20  t command opens 
7830: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
7840: 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65  the "my_database
7850: 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  " database.** an
7860: 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e  d calls that con
7870: 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20  nection "db1".  
7880: 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61  The second comma
7890: 6e 64 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a  nd causes this.*
78a0: 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  * subroutine to 
78b0: 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73  be invoked..*/.s
78c0: 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43  tatic int DbObjC
78d0: 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c  md(void *cd, Tcl
78e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
78f0: 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62   int objc,Tcl_Ob
7900: 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a  j *const*objv){.
7910: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
7920: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
7930: 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20  .  int choice;. 
7940: 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b   int rc = TCL_OK
7950: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
7960: 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d   char *DB_strs[]
7970: 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72   = {.    "author
7980: 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 22  izer",         "
7990: 62 75 73 79 22 2c 20 20 20 20 20 20 20 20 20 20  busy",          
79a0: 20 20 20 20 22 63 61 63 68 65 22 2c 0a 20 20 20      "cache",.   
79b0: 20 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20   "changes",     
79c0: 20 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 20         "close", 
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c              "col
79e0: 6c 61 74 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c  late",.    "coll
79f0: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20  ation_needed",  
7a00: 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20   "commit_hook", 
7a10: 20 20 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22        "complete"
7a20: 2c 0a 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20  ,.    "copy",   
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 61              "ena
7a40: 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
7a50: 6f 6e 22 2c 22 65 72 72 6f 72 63 6f 64 65 22 2c  on","errorcode",
7a60: 0a 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20  .    "eval",    
7a70: 20 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73             "exis
7a80: 74 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ts",            
7a90: 22 66 75 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20  "function",.    
7aa0: 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20  "incrblob",     
7ab0: 20 20 20 20 20 20 22 69 6e 74 65 72 72 75 70 74        "interrupt
7ac0: 22 2c 20 20 20 20 20 20 20 20 20 22 6c 61 73 74  ",         "last
7ad0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 0a  _insert_rowid",.
7ae0: 20 20 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c      "nullvalue",
7af0: 20 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f            "oneco
7b00: 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 22  lumn",         "
7b10: 70 72 6f 66 69 6c 65 22 2c 0a 20 20 20 20 22 70  profile",.    "p
7b20: 72 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20 20  rogress",       
7b30: 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20 20      "rekey",    
7b40: 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61           "rollba
7b50: 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 73  ck_hook",.    "s
7b60: 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20  tatus",         
7b70: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20      "timeout",  
7b80: 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f           "total_
7b90: 63 68 61 6e 67 65 73 22 2c 0a 20 20 20 20 22 74  changes",.    "t
7ba0: 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20  race",          
7bb0: 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e      "transaction
7bc0: 22 2c 20 20 20 20 20 20 20 22 75 70 64 61 74 65  ",       "update
7bd0: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 76 65 72  _hook",.    "ver
7be0: 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20  sion",          
7bf0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
7c00: 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65         .  };.  e
7c10: 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20  num DB_enum {.  
7c20: 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c    DB_AUTHORIZER,
7c30: 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c          DB_BUSY,
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
7c50: 43 41 43 48 45 2c 0a 20 20 20 20 44 42 5f 43 48  CACHE,.    DB_CH
7c60: 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20  ANGES,          
7c70: 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20   DB_CLOSE,      
7c80: 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45        DB_COLLATE
7c90: 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49  ,.    DB_COLLATI
7ca0: 4f 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42 5f 43  ON_NEEDED,  DB_C
7cb0: 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20  OMMIT_HOOK,     
7cc0: 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20 20   DB_COMPLETE,.  
7cd0: 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20    DB_COPY,      
7ce0: 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c          DB_ENABL
7cf0: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
7d00: 2c 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 0a 20  ,DB_ERRORCODE,. 
7d10: 20 20 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20     DB_EVAL,     
7d20: 20 20 20 20 20 20 20 20 20 44 42 5f 45 58 49 53           DB_EXIS
7d30: 54 53 2c 20 20 20 20 20 20 20 20 20 20 20 44 42  TS,           DB
7d40: 5f 46 55 4e 43 54 49 4f 4e 2c 0a 20 20 20 20 44  _FUNCTION,.    D
7d50: 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20 20 20 20  B_INCRBLOB,     
7d60: 20 20 20 20 20 44 42 5f 49 4e 54 45 52 52 55 50       DB_INTERRUP
7d70: 54 2c 20 20 20 20 20 20 20 20 44 42 5f 4c 41 53  T,        DB_LAS
7d80: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 0a  T_INSERT_ROWID,.
7d90: 20 20 20 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45      DB_NULLVALUE
7da0: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 4f 4e 45  ,         DB_ONE
7db0: 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20 20 44  COLUMN,        D
7dc0: 42 5f 50 52 4f 46 49 4c 45 2c 0a 20 20 20 20 44  B_PROFILE,.    D
7dd0: 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20 20 20  B_PROGRESS,     
7de0: 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20 20       DB_REKEY,  
7df0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f 4c            DB_ROL
7e00: 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a 20 20 20 20  LBACK_HOOK,.    
7e10: 44 42 5f 53 54 41 54 55 53 2c 20 20 20 20 20 20  DB_STATUS,      
7e20: 20 20 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54        DB_TIMEOUT
7e30: 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f  ,          DB_TO
7e40: 54 41 4c 5f 43 48 41 4e 47 45 53 2c 0a 20 20 20  TAL_CHANGES,.   
7e50: 20 44 42 5f 54 52 41 43 45 2c 20 20 20 20 20 20   DB_TRACE,      
7e60: 20 20 20 20 20 20 20 44 42 5f 54 52 41 4e 53 41         DB_TRANSA
7e70: 43 54 49 4f 4e 2c 20 20 20 20 20 20 44 42 5f 55  CTION,      DB_U
7e80: 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 0a 20 20 20  PDATE_HOOK, .   
7e90: 20 44 42 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b   DB_VERSION.  };
7ea0: 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76  .  /* don't leav
7eb0: 65 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61  e trailing comma
7ec0: 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74  s on DB_enum, it
7ed0: 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49   confuses the AI
7ee0: 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a  X xlc compiler *
7ef0: 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20  /..  if( objc<2 
7f00: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
7f10: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
7f20: 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d  1, objv, "SUBCOM
7f30: 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  MAND ...");.    
7f40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7f50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
7f60: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
7f70: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
7f80: 20 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f   DB_strs, "optio
7f90: 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20  n", 0, &choice) 
7fa0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
7fb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
7fc0: 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42  switch( (enum DB
7fd0: 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a  _enum)choice ){.
7fe0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74  .  /*    $db aut
7ff0: 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43  horizer ?CALLBAC
8000: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
8010: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
8020: 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72  llback to author
8030: 69 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65  ize each SQL ope
8040: 72 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a  ration as it is.
8050: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20    ** compiled.  
8060: 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  5 arguments are 
8070: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
8080: 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20  callback before 
8090: 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b  it is.  ** invok
80a0: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
80b0: 28 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a  (1) The authoriz
80c0: 61 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20  ation type (ex: 
80d0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
80e0: 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  BLE, SQLITE_INSE
80f0: 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20  RT, ...).  **   
8100: 28 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69  (2) First descri
8110: 70 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65  ptive name (depe
8120: 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61  nds on authoriza
8130: 74 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20  tion type).  ** 
8140: 20 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73    (3) Second des
8150: 63 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20  criptive name.  
8160: 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66  **   (4) Name of
8170: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65   the database (e
8180: 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  x: "main", "temp
8190: 22 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61  ").  **   (5) Na
81a0: 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68  me of trigger th
81b0: 61 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20  at is doing the 
81c0: 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a  access.  **.  **
81d0: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68   The callback sh
81e0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f  ould return on o
81f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8200: 73 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f  strings: SQLITE_
8210: 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  OK,.  ** SQLITE_
8220: 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54  IGNORE, or SQLIT
8230: 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68  E_DENY.  Any oth
8240: 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
8250: 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a  is an error..  *
8260: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d  *.  ** If this m
8270: 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64  ethod is invoked
8280: 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
8290: 74 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20  ts, the current 
82a0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20  authorization.  
82b0: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69  ** callback stri
82c0: 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ng is returned..
82d0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41    */.  case DB_A
82e0: 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66  UTHORIZER: {.#if
82f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8300: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
8310: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8320: 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68  lt(interp, "auth
8330: 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76  orization not av
8340: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20  ailable in this 
8350: 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20  build", 0);.    
8360: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8370: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
8380: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
8390: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
83a0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
83b0: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
83c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
83d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
83e0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
83f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
8400: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
8410: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8420: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
8430: 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20  zAuth, 0);.     
8440: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8450: 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b      char *zAuth;
8460: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
8470: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
8480: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
8490: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41  Tcl_Free(pDb->zA
84a0: 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uth);.      }.  
84b0: 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f      zAuth = Tcl_
84c0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
84d0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
84e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68  .      if( zAuth
84f0: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
8500: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
8510: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
8520: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
8530: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74  memcpy(pDb->zAut
8540: 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29  h, zAuth, len+1)
8550: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8560: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74         pDb->zAut
8570: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  h = 0;.      }. 
8580: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
8590: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  uth ){.        p
85a0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
85b0: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
85c0: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
85d0: 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74  zer(pDb->db, aut
85e0: 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29  h_callback, pDb)
85f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8610: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44  et_authorizer(pD
8620: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
8630: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
8640: 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
8650: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62  }..  /*    $db b
8660: 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  usy ?CALLBACK?. 
8670: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
8680: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
8690: 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61  ck if an SQL sta
86a0: 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20  tement attempts 
86b0: 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c  to open.  ** a l
86c0: 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66  ocked database f
86d0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ile..  */.  case
86e0: 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20   DB_BUSY: {.    
86f0: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
8700: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
8710: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
8720: 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22  objv, "CALLBACK"
8730: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8740: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8750: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
8760: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
8770: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
8780: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8790: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
87a0: 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20  ->zBusy, 0);.   
87b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
87c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73        char *zBus
87d0: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  y;.      int len
87e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
87f0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
8800: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
8810: 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a  zBusy);.      }.
8820: 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63        zBusy = Tc
8830: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
8840: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
8850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75  );.      if( zBu
8860: 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  sy && len>0 ){. 
8870: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
8880: 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  y = Tcl_Alloc( l
8890: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
88a0: 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42    memcpy(pDb->zB
88b0: 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b  usy, zBusy, len+
88c0: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
88d0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
88e0: 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  usy = 0;.      }
88f0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
8900: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
8910: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
8920: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
8930: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
8940: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42  ler(pDb->db, DbB
8950: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  usyHandler, pDb)
8960: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8970: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
8980: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
8990: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
89a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
89b0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
89c0: 20 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75     $db cache flu
89d0: 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  sh.  **     $db 
89e0: 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a  cache size n.  *
89f0: 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65  *.  ** Flush the
8a00: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
8a10: 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65  ent cache, or se
8a20: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  t the maximum nu
8a30: 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63  mber of.  ** cac
8a40: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  hed statements..
8a50: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
8a60: 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72  ACHE: {.    char
8a70: 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e   *subCmd;.    in
8a80: 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  t n;..    if( ob
8a90: 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc<=2 ){.      T
8aa0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
8ab0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
8ac0: 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f   "cache option ?
8ad0: 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  arg?");.      re
8ae0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8af0: 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64      }.    subCmd
8b00: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
8b10: 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d  FromObj( objv[2]
8b20: 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a  , 0 );.    if( *
8b30: 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73  subCmd=='f' && s
8b40: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c  trcmp(subCmd,"fl
8b50: 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ush")==0 ){.    
8b60: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
8b70: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
8b80: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8b90: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73  , 2, objv, "flus
8ba0: 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  h");.        ret
8bb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8bc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8bd0: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
8be0: 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20  he( pDb );.     
8bf0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
8c00: 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26   *subCmd=='s' &&
8c10: 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22   strcmp(subCmd,"
8c20: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
8c30: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
8c40: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
8c50: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
8c60: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a  p, 2, objv, "siz
8c70: 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  e n");.        r
8c80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8c90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8ca0: 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52        if( TCL_ER
8cb0: 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46  ROR==Tcl_GetIntF
8cc0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
8cd0: 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20  bjv[3], &n) ){. 
8ce0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
8cf0: 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72  endResult( inter
8d00: 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65  p, "cannot conve
8d10: 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  rt \"", .       
8d20: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
8d30: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8d40: 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20  v[3],0), "\" to 
8d50: 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20  integer", 0);.  
8d60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
8d70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
8d80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8d90: 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20     if( n<0 ){.  
8da0: 20 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53            flushS
8db0: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
8dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
8dd0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
8de0: 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52  lse if( n>MAX_PR
8df0: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a  EPARED_STMTS ){.
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
8e10: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
8e20: 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  TS;.          }.
8e30: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d            pDb->m
8e40: 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20  axStmt = n;.    
8e50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
8e70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8e80: 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70   interp, "bad op
8e90: 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20  tion \"", .     
8ea0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
8eb0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
8ec0: 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20  ],0), "\": must 
8ed0: 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65  be flush or size
8ee0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
8ef0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8f00: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
8f10: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
8f20: 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  b changes.  **. 
8f30: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
8f40: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
8f50: 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
8f60: 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
8f70: 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74  eleted by.  ** t
8f80: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49  he most recent I
8f90: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
8fa0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
8fb0: 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  t, not including
8fc0: 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67   .  ** any chang
8fd0: 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67  es made by trigg
8fe0: 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a  er programs..  *
8ff0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e  /.  case DB_CHAN
9000: 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
9010: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
9020: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
9030: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9040: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9050: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
9060: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9070: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
9080: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
9090: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
90a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
90b0: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
90c0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44  lite3_changes(pD
90d0: 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
90e0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
90f0: 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a   $db close.  **.
9100: 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68    ** Shutdown th
9110: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a  e database.  */.
9120: 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a    case DB_CLOSE:
9130: 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74   {.    Tcl_Delet
9140: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
9150: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9160: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
9170: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
9180: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
9190: 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41    $db collate NA
91a0: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
91b0: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
91c0: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
91d0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
91e0: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
91f0: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
9200: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
9210: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
9220: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
9230: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
9240: 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   DB_COLLATE: {. 
9250: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
9260: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61  Collate;.    cha
9270: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
9280: 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20  ar *zScript;.   
9290: 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20   int nScript;.  
92a0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
92b0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
92c0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
92d0: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
92e0: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
92f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9300: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
9310: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
9320: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
9330: 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74   0);.    zScript
9340: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
9350: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
9360: 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20   &nScript);.    
9370: 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43  pCollate = (SqlC
9380: 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f  ollate*)Tcl_Allo
9390: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c  c( sizeof(*pColl
93a0: 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b  ate) + nScript +
93b0: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
93c0: 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75  ollate==0 ) retu
93d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
93e0: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65    pCollate->inte
93f0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
9400: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
9410: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
9420: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
9430: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a  zScript = (char*
9440: 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20  )&pCollate[1];. 
9450: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
9460: 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   = pCollate;.   
9470: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65   memcpy(pCollate
9480: 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69  ->zScript, zScri
9490: 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a  pt, nScript+1);.
94a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
94b0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
94c0: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
94d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
94e0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
94f0: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
9500: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
9510: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
9520: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
9530: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
9540: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
9550: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9560: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9570: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
9580: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
9590: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
95a0: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
95b0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
95c0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
95d0: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
95e0: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
95f0: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
9600: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
9610: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
9620: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
9630: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
9640: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
9650: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
9660: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
9670: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
9680: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
9690: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
96a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
96b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
96c0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
96d0: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
96e0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
96f0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
9700: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
9710: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
9720: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
9730: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
9740: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
9750: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
9760: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
9770: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
9780: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
9790: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
97a0: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
97b0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
97c0: 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
97d0: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
97e0: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
97f0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
9800: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
9810: 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
9820: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
9830: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
9840: 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
9850: 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
9860: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
9870: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
9880: 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
9890: 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
98a0: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
98b0: 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
98c0: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
98d0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
98e0: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
98f0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
9900: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
9910: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9920: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
9930: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
9940: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9950: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
9960: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
9970: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
9980: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
9990: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
99a0: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
99b0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
99c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
99d0: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20  char *zCommit;. 
99e0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
99f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
9a00: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
9a10: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43  Tcl_Free(pDb->zC
9a20: 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ommit);.      }.
9a30: 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
9a40: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
9a50: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
9a60: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
9a70: 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20  Commit && len>0 
9a80: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
9a90: 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c  zCommit = Tcl_Al
9aa0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
9ab0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
9ac0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f  Db->zCommit, zCo
9ad0: 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  mmit, len+1);.  
9ae0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9af0: 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
9b00: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9b10: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
9b20: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mit ){.        p
9b30: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
9b40: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
9b50: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
9b60: 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d  (pDb->db, DbComm
9b70: 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  itHandler, pDb);
9b80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
9ba0: 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  mmit_hook(pDb->d
9bb0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
9bc0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
9bd0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
9be0: 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  $db complete SQL
9bf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
9c00: 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20 69 73  n TRUE if SQL is
9c10: 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20   a complete SQL 
9c20: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
9c30: 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a  rn FALSE if.  **
9c40: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65   additional line
9c50: 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e  s of input are n
9c60: 65 65 64 65 64 2e 20 20 54 68 69 73 20 69 73 20  eeded.  This is 
9c70: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
9c80: 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e   ** built-in "in
9c90: 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d  fo complete" com
9ca0: 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a  mand of Tcl..  *
9cb0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50  /.  case DB_COMP
9cc0: 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20  LETE: {.#ifndef 
9cd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
9ce0: 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  LETE.    Tcl_Obj
9cf0: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
9d00: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20  nt isComplete;. 
9d10: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
9d20: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
9d30: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9d40: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29   2, objv, "SQL")
9d50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
9d60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9d70: 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d      isComplete =
9d80: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
9d90: 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  e( Tcl_GetString
9da0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
9db0: 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75   0) );.    pResu
9dc0: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
9dd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
9de0: 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61     Tcl_SetBoolea
9df0: 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73  nObj(pResult, is
9e00: 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69  Complete);.#endi
9e10: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
9e20: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
9e30: 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  py conflict-algo
9e40: 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65  rithm table file
9e50: 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f  name ?SEPARATOR?
9e60: 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
9e70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20  .  **.  ** Copy 
9e80: 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20  data into table 
9e90: 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f  from filename, o
9ea0: 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20  ptionally using 
9eb0: 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61  SEPARATOR.  ** a
9ec0: 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  s column separat
9ed0: 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d  ors.  If a colum
9ee0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c  n contains a nul
9ef0: 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65  l string, or the
9f00: 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e  .  ** value of N
9f10: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20  ULLINDICATOR, a 
9f20: 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64  NULL is inserted
9f30: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e   for the column.
9f40: 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61  .  ** conflict-a
9f50: 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20  lgorithm is one 
9f60: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f  of the sqlite co
9f70: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
9f80: 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62  s:.  **    rollb
9f90: 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c  ack, abort, fail
9fa0: 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63  , ignore, replac
9fb0: 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73  e.  ** On succes
9fc0: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  s, return the nu
9fd0: 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
9fe0: 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63  ocessed, not nec
9ff0: 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20  essarily same.  
a000: 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65  ** as 'db change
a010: 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69  s' due to confli
a020: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c  ct-algorithm sel
a030: 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ected..  **.  **
a040: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61   This code is ba
a050: 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65  sically an imple
a060: 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63  mentation/enhanc
a070: 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68  ement of.  ** th
a080: 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e  e sqlite3 shell.
a090: 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d  c ".import" comm
a0a0: 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  and..  **.  ** T
a0b0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67  his command usag
a0c0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
a0d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78  to the sqlite2.x
a0e0: 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c   COPY statement,
a0f0: 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f  .  ** which impo
a100: 72 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e  rts file data in
a110: 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67  to a table using
a120: 20 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20   the PostgreSQL 
a130: 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74  COPY file format
a140: 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70  :.  **   $db cop
a150: 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20  y $conflit_algo 
a160: 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c  $table_name $fil
a170: 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a  ename \t \\N.  *
a180: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59  /.  case DB_COPY
a190: 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  : {.    char *zT
a1a0: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
a1b0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
a1c0: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
a1d0: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
a1e0: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
a1f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
a200: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
a210: 65 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a  extract data */.
a220: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c      char *zConfl
a230: 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ict;            
a240: 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20  /* The conflict 
a250: 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65  algorithm to use
a260: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
a270: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
a280: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65      /* A stateme
a290: 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  nt */.    int nC
a2a0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
a2b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a2c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
a2d0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
a2e0: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
a2f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a300: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
a310: 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a   an SQL string *
a320: 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20  /.    int i, j; 
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a350: 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  rs */.    int nS
a360: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
a370: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a380: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70  of bytes in zSep
a390: 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  [] */.    int nN
a3a0: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
a3b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a3c0: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c  of bytes in zNul
a3d0: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  l[] */.    char 
a3e0: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
a3f0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c         /* An SQL
a400: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a410: 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20    char *zLine;  
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a430: 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   A single line o
a440: 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65  f input from the
a450: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61   file */.    cha
a460: 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20  r **azCol;      
a470: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e           /* zLin
a480: 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e  e[] broken up in
a490: 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  to columns */.  
a4a0: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a4c0: 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63   How to commit c
a4d0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49  hanges */.    FI
a4e0: 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
a4f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a500: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
a510: 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20     int lineno = 
a520: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
a530: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66  * Line number of
a540: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
a550: 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d     char zLineNum
a560: 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [80];          /
a570: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72  * Line number pr
a580: 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  int buffer */.  
a590: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
a5a0: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  lt;           /*
a5b0: 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a   interp result *
a5c0: 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65  /..    char *zSe
a5d0: 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  p;.    char *zNu
a5e0: 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ll;.    if( objc
a5f0: 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a  <5 || objc>7 ){.
a600: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
a610: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
a620: 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20  , objv, .       
a630: 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f    "CONFLICT-ALGO
a640: 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45  RITHM TABLE FILE
a650: 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f  NAME ?SEPARATOR?
a660: 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
a670: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
a680: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a690: 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d  }.    if( objc>=
a6a0: 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  6 ){.      zSep 
a6b0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
a6c0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20  romObj(objv[5], 
a6d0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
a6e0: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22       zSep = "\t"
a6f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a700: 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20  objc>=7 ){.     
a710: 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74   zNull = Tcl_Get
a720: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
a730: 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[6], 0);.    }
a740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  else{.      zNul
a750: 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20  l = "";.    }.  
a760: 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63    zConflict = Tc
a770: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a780: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
a790: 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c      zTable = Tcl
a7a0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a7b0: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
a7c0: 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47     zFile = Tcl_G
a7d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a7e0: 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  objv[4], 0);.   
a7f0: 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
a800: 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c  (zSep);.    nNul
a810: 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75  l = strlen30(zNu
a820: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  ll);.    if( nSe
a830: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
a840: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a850: 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f  nterp,"Error: no
a860: 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72  n-null separator
a870: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
a880: 70 79 22 2c 30 29 3b 0a 20 20 20 20 20 20 72 65  py",0);.      re
a890: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a8a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72      }.    if(str
a8b0: 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
a8c0: 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20  rollback") != 0 
a8d0: 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
a8e0: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f  (zConflict, "abo
a8f0: 72 74 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a  rt"   ) != 0 &&.
a900: 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
a910: 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20  onflict, "fail" 
a920: 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
a930: 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
a940: 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20  lict, "ignore"  
a950: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
a960: 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
a970: 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20 21  t, "replace" ) !
a980: 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  = 0 ) {.      Tc
a990: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a9a0: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c  nterp, "Error: \
a9b0: 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a  "", zConflict, .
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
a9d0: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
a9e0: 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  thm must be one 
a9f0: 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a  of: rollback, ".
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 62 6f              "abo
aa10: 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65  rt, fail, ignore
aa20: 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30  , or replace", 0
aa30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
aa40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
aa50: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
aa60: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
aa70: 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22  ECT * FROM '%q'"
aa80: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
aa90: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
aaa0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
aab0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
aac0: 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62  ror: no such tab
aad0: 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30  le: ", zTable, 0
aae0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
aaf0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ab00: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72  .    nByte = str
ab10: 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
ab20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
ab30: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
ab40: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
ab50: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
ab60: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
ab70: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
ab80: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ab90: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
aba0: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
abb0: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
abc0: 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30  ;.      nCol = 0
abd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
abe0: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
abf0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
ac00: 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Stmt);.    }.   
ac10: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
ac20: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
ac30: 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20  ( nCol==0 ) {.  
ac40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ac50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ac60: 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  zSql = malloc( n
ac70: 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c  Byte + 50 + nCol
ac80: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
ac90: 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ql==0 ) {.      
aca0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
acb0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
acc0: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
acd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
ace0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
acf0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
ad00: 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35  snprintf(nByte+5
ad10: 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
ad20: 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27   OR %q INTO '%q'
ad30: 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20   VALUES(?",.    
ad40: 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20       zConflict, 
ad50: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
ad60: 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
ad70: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
ad80: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
ad90: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
ada0: 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
adb0: 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
adc0: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
add0: 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
ade0: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
adf0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
ae00: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
ae10: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
ae20: 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20    free(zSql);.  
ae30: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ae40: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ae50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
ae60: 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
ae70: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
ae80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ae90: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
aea0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
aeb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
aec0: 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
aed0: 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
aee0: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
aef0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
af00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
af10: 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
af20: 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
af30: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
af40: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
af50: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
af60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
af70: 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
af80: 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
af90: 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
afa0: 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
afb0: 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
afc0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
afd0: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
afe0: 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
aff0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c  ", 0);.      fcl
b000: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72  ose(in);.      r
b010: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b020: 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64  .    }.    (void
b030: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
b040: 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  b->db, "BEGIN", 
b050: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43  0, 0, 0);.    zC
b060: 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22  ommit = "COMMIT"
b070: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c  ;.    while( (zL
b080: 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ine = local_getl
b090: 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29  ine(0, in))!=0 )
b0a0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
b0b0: 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  .      i = 0;.  
b0c0: 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
b0d0: 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a      azCol[0] = z
b0e0: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
b0f0: 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a  i=0, z=zLine; *z
b100: 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; z++){.        
b110: 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20  if( *z==zSep[0] 
b120: 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53  && strncmp(z, zS
b130: 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a  ep, nSep)==0 ){.
b140: 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30            *z = 0
b150: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
b160: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
b170: 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  <nCol ){.       
b180: 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20       azCol[i] = 
b190: 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20  &z[nSep];.      
b1a0: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d        z += nSep-
b1b0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
b1c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b1d0: 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d  .      if( i+1!=
b1e0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
b1f0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
b200: 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73      int nErr = s
b210: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20 2b  trlen30(zFile) +
b220: 20 32 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45   200;.        zE
b230: 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72  rr = malloc(nErr
b240: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
b250: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Err ){.         
b260: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
b270: 66 28 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20  f(nErr, zErr,.  
b280: 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f             "Erro
b290: 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65  r: %s line %d: e
b2a0: 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
b2b0: 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74 20 66  ns of data but f
b2c0: 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20  ound %d",.      
b2d0: 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69         zFile, li
b2e0: 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29  neno, nCol, i+1)
b2f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
b300: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b310: 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20  erp, zErr, 0);. 
b320: 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 45           free(zE
b330: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rr);.        }. 
b340: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
b350: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
b360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b370: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
b380: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
b390: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63  .        /* chec
b3a0: 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c  k for null data,
b3b0: 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20   if so, bind as 
b3c0: 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  null */.        
b3d0: 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20  if( (nNull>0 && 
b3e0: 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c  strcmp(azCol[i],
b3f0: 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20   zNull)==0).    
b400: 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33        || strlen3
b410: 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 0a  0(azCol[i])==0 .
b420: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
b430: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
b440: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b  d_null(pStmt, i+
b450: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
b460: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
b470: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
b480: 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c  Stmt, i+1, azCol
b490: 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
b4a0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
b4b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
b4c0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
b4d0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
b4e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
b4f0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65  Stmt);.      fre
b500: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
b510: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b520: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
b530: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b540: 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20  terp,"Error: ", 
b550: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
b560: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
b570: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
b580: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
b590: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b5a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
b5b0: 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c  (azCol);.    fcl
b5c0: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c  ose(in);.    sql
b5d0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
b5e0: 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  tmt);.    (void)
b5f0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
b600: 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30  ->db, zCommit, 0
b610: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66  , 0, 0);..    if
b620: 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20  ( zCommit[0] == 
b630: 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  'C' ){.      /* 
b640: 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73  success, set res
b650: 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66  ult as number of
b660: 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64   lines processed
b670: 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c   */.      pResul
b680: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
b690: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
b6a0: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
b6b0: 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e  j(pResult, linen
b6c0: 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  o);.      rc = T
b6d0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
b6e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75  {.      /* failu
b6f0: 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e  re, append linen
b700: 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a  o where failed *
b710: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
b720: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
b730: 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65  zLineNum), zLine
b740: 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29  Num,"%d",lineno)
b750: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  ;.      Tcl_Appe
b760: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b770: 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ", failed while 
b780: 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a  processing line:
b790: 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a   ",zLineNum,0);.
b7a0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
b7b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
b7c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
b7d0: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e 61  .  **    $db ena
b7e0: 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
b7f0: 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a  on BOOLEAN.  **.
b800: 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65 78    ** Turn the ex
b810: 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
b820: 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66  feature on or of
b830: 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62 79  f.  It if off by
b840: 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20  .  ** default.. 
b850: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 4e   */.  case DB_EN
b860: 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
b870: 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  ION: {.#ifndef S
b880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
b890: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e  EXTENSION.    in
b8a0: 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28  t onoff;.    if(
b8b0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
b8c0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
b8d0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
b8e0: 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a  jv, "BOOLEAN");.
b8f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
b900: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
b910: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
b920: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
b930: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e  rp, objv[2], &on
b940: 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  off) ){.      re
b950: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b960: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b970: 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
b980: 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  tension(pDb->db,
b990: 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65   onoff);.    bre
b9a0: 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54 63  ak;.#else.    Tc
b9b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b9c0: 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73 69 6f  nterp, "extensio
b9d0: 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74 75 72  n loading is tur
b9e0: 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d 70 69  ned off at compi
b9f0: 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20 20  le-time",.      
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ba10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ba20: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a  L_ERROR;.#endif.
ba30: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
ba40: 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a    $db errorcode.
ba50: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
ba60: 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72   the numeric err
ba70: 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61 73  or code that was
ba80: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
ba90: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a   most recent.  *
baa0: 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
bab0: 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20  3_exec()..  */. 
bac0: 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f   case DB_ERRORCO
bad0: 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  DE: {.    Tcl_Se
bae0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
baf0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
bb00: 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  (sqlite3_errcode
bb10: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
bb20: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a   break;.  }.   .
bb30: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
bb40: 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61   eval $sql ?arra
bb50: 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e  y? ?{  ...code..
bb60: 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62  . }?.  **    $db
bb70: 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a   onecolumn $sql.
bb80: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
bb90: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24  L statement in $
bba0: 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64  sql is evaluated
bbb0: 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c  .  For each row,
bbc0: 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a   the values are.
bbd0: 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65    ** placed in e
bbe0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61  lements of the a
bbf0: 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61  rray named "arra
bc00: 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e  y" and ...code..
bc10: 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  . is executed.. 
bc20: 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61   ** If "array" a
bc30: 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d  nd "code" are om
bc40: 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63  itted, then no c
bc50: 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79  allback is every
bc60: 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49   invoked..  ** I
bc70: 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20  f "array" is an 
bc80: 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
bc90: 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  en the values ar
bca0: 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69  e placed in vari
bcb0: 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  ables.  ** that 
bcc0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61  have the same na
bcd0: 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73  me as the fields
bce0: 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68   extracted by th
bcf0: 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  e query..  **.  
bd00: 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e  ** The onecolumn
bd10: 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20 65   method is the e
bd20: 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20  quivalent of:.  
bd30: 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 24  **     lindex [$
bd40: 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a  db eval $sql] 0.
bd50: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4f    */.  case DB_O
bd60: 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61 73 65  NECOLUMN:.  case
bd70: 20 44 42 5f 45 56 41 4c 3a 0a 20 20 63 61 73 65   DB_EVAL:.  case
bd80: 20 44 42 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20   DB_EXISTS: {.  
bd90: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53    char const *zS
bda0: 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  ql;      /* Next
bdb0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
bdc0: 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 20  o execute */.   
bdd0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4c 65   char const *zLe
bde0: 66 74 3b 20 20 20 20 20 2f 2a 20 57 68 61 74 20  ft;     /* What 
bdf0: 69 73 20 6c 65 66 74 20 61 66 74 65 72 20 66 69  is left after fi
be00: 72 73 74 20 73 74 6d 74 20 69 6e 20 7a 53 71 6c  rst stmt in zSql
be10: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
be20: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f  stmt *pStmt;   /
be30: 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73  * Compiled SQL s
be40: 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 54  tatment */.    T
be50: 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20  cl_Obj *pArray; 
be60: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
be70: 20 61 72 72 61 79 20 69 6e 74 6f 20 77 68 69 63   array into whic
be80: 68 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72  h results are wr
be90: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54 63 6c  itten */.    Tcl
bea0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
beb0: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 74 6f      /* Script to
bec0: 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20 72 65   run for each re
bed0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
bee0: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61 72 6d  Tcl_Obj **apParm
bef0: 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65  ;      /* Parame
bf00: 74 65 72 73 20 74 68 61 74 20 6e 65 65 64 20 61  ters that need a
bf10: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
bf20: 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  t() */.    int n
bf30: 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Parm;           
bf40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
bf50: 6e 74 72 69 65 73 20 75 73 65 64 20 69 6e 20 61  ntries used in a
bf60: 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54  pParm[] */.    T
bf70: 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b 31 30  cl_Obj *aParm[10
bf80: 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74 69 63 20  ];    /* Static 
bf90: 73 70 61 63 65 20 66 6f 72 20 61 70 50 61 72 6d  space for apParm
bfa0: 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  [] in the common
bfb0: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 54 63 6c   case */.    Tcl
bfc0: 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20 20 20  _Obj *pRet;     
bfd0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
bfe0: 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 20  be returned */. 
bff0: 20 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74     SqlPreparedSt
c000: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 2f  mt *pPreStmt;  /
c010: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  * Pointer to a p
c020: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
c030: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 32  t */.    int rc2
c040: 3b 0a 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63  ;..    if( choic
c050: 65 3d 3d 44 42 5f 45 56 41 4c 20 29 7b 0a 20 20  e==DB_EVAL ){.  
c060: 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c      if( objc<3 |
c070: 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20  | objc>5 ){.    
c080: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
c090: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
c0a0: 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41  objv, "SQL ?ARRA
c0b0: 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f  Y-NAME? ?SCRIPT?
c0c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
c0d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 74      }.      pRet
c0f0: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
c100: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
c110: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
c120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c130: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
c140: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
c150: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
c160: 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b  2, objv, "SQL");
c170: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c180: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
c190: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 68 6f   }.      if( cho
c1a0: 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20 29  ice==DB_EXISTS )
c1b0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  {.        pRet =
c1c0: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
c1d0: 62 6a 28 30 29 3b 0a 20 20 20 20 20 20 20 20 54  bj(0);.        T
c1e0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c1f0: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pRet);.      }el
c200: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74  se{.        pRet
c210: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
c220: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
c230: 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 41 72  ==3 ){.      pAr
c240: 72 61 79 20 3d 20 70 53 63 72 69 70 74 20 3d 20  ray = pScript = 
c250: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
c260: 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
c270: 20 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20    pArray = 0;.  
c280: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
c290: 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  jv[3];.    }else
c2a0: 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d  {.      pArray =
c2b0: 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20   objv[3];.      
c2c0: 69 66 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  if( Tcl_GetStrin
c2d0: 67 28 70 41 72 72 61 79 29 5b 30 5d 3d 3d 30 20  g(pArray)[0]==0 
c2e0: 29 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20  ) pArray = 0;.  
c2f0: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
c300: 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  jv[4];.    }..  
c310: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c320: 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  nt(objv[2]);.   
c330: 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zSql = Tcl_GetS
c340: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
c350: 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 77 68  v[2], 0);.    wh
c360: 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20  ile( rc==TCL_OK 
c370: 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20  && zSql[0] ){.  
c380: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3a0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
c3b0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 72  /.      int nVar
c3c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c3d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c3e0: 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  bind parameters 
c3f0: 69 6e 20 74 68 65 20 70 53 74 6d 74 20 2a 2f 0a  in the pStmt */.
c400: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
c410: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
c420: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
c430: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
c440: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  ult set */.     
c450: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c   Tcl_Obj **apCol
c460: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 2f 2a 20 41  Name = 0;   /* A
c470: 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  rray of column n
c480: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ames */.      in
c490: 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  t len;          
c4a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
c4b0: 6e 67 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 71  ng length of zSq
c4c0: 6c 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 2f 2a  l */.  .      /*
c4d0: 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 53   Try to find a S
c4e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  QL statement tha
c4f0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
c500: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64 0a  en compiled and.
c510: 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d        ** which m
c520: 61 74 63 68 65 73 20 74 68 65 20 6e 65 78 74 20  atches the next 
c530: 73 65 71 75 65 6e 63 65 20 6f 66 20 53 51 4c 2e  sequence of SQL.
c540: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c550: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
c560: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28   len = strlen30(
c570: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72  zSql);.      for
c580: 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d  (pPreStmt = pDb-
c590: 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53  >stmtList; pPreS
c5a0: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
c5b0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
c5c0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
c5d0: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a  pPreStmt->nSql;.
c5e0: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
c5f0: 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =n .            
c600: 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74  && memcmp(pPreSt
c610: 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  mt->zSql, zSql, 
c620: 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
c630: 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30    && (zSql[n]==0
c640: 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27   || zSql[n-1]=='
c650: 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ;').        ){. 
c660: 20 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d           pStmt =
c670: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
c680: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65 66  ;.          zLef
c690: 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74  t = &zSql[pPreSt
c6a0: 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20  mt->nSql];..    
c6b0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20        /* When a 
c6c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
c6d0: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c  nt is found, unl
c6e0: 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ink it from the.
c6f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63            ** cac
c700: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
c710: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
c720: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
c730: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  inning.         
c740: 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65   ** of the cache
c750: 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74   list in order t
c760: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20  o implement LRU 
c770: 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20  replacement..   
c780: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c790: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
c7a0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
c7b0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
c7c0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
c7d0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
c7e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
c7f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
c800: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
c810: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
c820: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c830: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
c840: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
c850: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
c860: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
c870: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
c880: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
c890: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
c8a0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
c8b0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
c8c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c8d0: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
c8e0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  --;.          br
c8f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
c900: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
c910: 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65  /* If no prepare
c920: 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  d statement was 
c930: 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20  found.  Compile 
c940: 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20 20  the SQL text.   
c950: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c960: 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pStmt==0 ){.    
c970: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
c980: 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61  K!=sqlite3_prepa
c990: 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a  re_v2(pDb->db, z
c9a0: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
c9b0: 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20 20   &zLeft) ){.    
c9c0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
c9d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
c9e0: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
c9f0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
ca00: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b)));.          
ca10: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
ca20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ca30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ca40: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
ca50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ca60: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
ca70: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
ca80: 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >db) ){.        
ca90: 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65      /* A compile
caa0: 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74  -time error in t
cab0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  he statement.   
cac0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
cad0: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
cae0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
caf0: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
cb00: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
cb10: 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >db)));.        
cb20: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
cb30: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
cb40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
cb50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cb60: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
cb70: 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70  ment was a no-op
cb80: 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74  .  Continue to t
cb90: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
cba0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
cbb0: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69   in the SQL stri
cbc0: 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng..            
cbd0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  */.            z
cbe0: 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20  Sql = zLeft;.   
cbf0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
cc00: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
cc10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cc20: 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d   assert( pPreStm
cc30: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  t==0 );.      }.
cc40: 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 76  .      /* Bind v
cc50: 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74  alues to paramet
cc60: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
cc70: 69 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20 20  ith $ or :.     
cc80: 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61 72   */  .      nVar
cc90: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
cca0: 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
ccb0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50  pStmt);.      nP
ccc0: 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  arm = 0;.      i
ccd0: 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61  f( nVar>sizeof(a
cce0: 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61  Parm)/sizeof(aPa
ccf0: 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  rm[0]) ){.      
cd00: 20 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f    apParm = (Tcl_
cd10: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
cd20: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50 61  nVar*sizeof(apPa
cd30: 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d  rm[0]));.      }
cd40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70  else{.        ap
cd50: 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20  Parm = aParm;.  
cd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
cd70: 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b  i=1; i<=nVar; i+
cd80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
cd90: 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73  t char *zVar = s
cda0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
cdb0: 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74  meter_name(pStmt
cdc0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
cdd0: 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56  ( zVar!=0 && (zV
cde0: 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56  ar[0]=='$' || zV
cdf0: 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56  ar[0]==':' || zV
ce00: 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20  ar[0]=='@') ){. 
ce10: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a           Tcl_Obj
ce20: 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74   *pVar = Tcl_Get
ce30: 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26  Var2Ex(interp, &
ce40: 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a  zVar[1], 0, 0);.
ce50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 56            if( pV
ce60: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ar ){.          
ce70: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
ce80: 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20       u8 *data;. 
ce90: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
cea0: 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74  *zType = pVar->t
ceb0: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
cec0: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
ced0: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ";.            c
cee0: 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d  har c = zType[0]
cef0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
cf00: 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c  ( zVar[0]=='@' |
cf10: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
cf20: 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63   (c=='b' && strc
cf30: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
cf40: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
cf50: 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20  ->bytes==0) ){. 
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf70: 4c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65  Load a BLOB type
cf80: 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69   if the Tcl vari
cf90: 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72  able is a bytear
cfa0: 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ray and.        
cfb0: 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
cfc0: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
cfd0: 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68 65 20  entation or the 
cfe0: 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  host.           
cff0: 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
d000: 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
d010: 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20   "@". */.       
d020: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63         data = Tc
d030: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
d040: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
d050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
d060: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
d070: 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c  (pStmt, i, data,
d080: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
d090: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
d0a0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
d0b0: 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20  nt(pVar);.      
d0c0: 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b 6e          apParm[n
d0d0: 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a  Parm++] = pVar;.
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
d0f0: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
d100: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
d110: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
d120: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
d130: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
d140: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b  terp, pVar, &n);
d150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
d160: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
d170: 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20  pStmt, i, n);.  
d180: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
d190: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
d1a0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
d1b0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
d1c0: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
d1d0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
d1e0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
d1f0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
d200: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20  ar, &r);.       
d210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
d220: 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  ind_double(pStmt
d230: 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  , i, r);.       
d240: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
d250: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
d260: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
d270: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
d280: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
d290: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
d2a0: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
d2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
d2c0: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
d2e0: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
d2f0: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
d300: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &v);.           
d310: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
d320: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20  int64(pStmt, i, 
d330: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
d340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d350: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
d360: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
d370: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
d380: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
d390: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d3a0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
d3b0: 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29 64  mt, i, (char *)d
d3c0: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
d3d0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
d3e0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
d3f0: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
d400: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
d410: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
d420: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
d430: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
d440: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
d450: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
d460: 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a 20 20  ( pStmt, i );.  
d470: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d480: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
d490: 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68     /* Execute th
d4a0: 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20  e SQL.      */. 
d4b0: 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
d4c0: 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20  TCL_OK && pStmt 
d4d0: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
d4e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
d4f0: 74 29 20 29 7b 0a 0a 09 2f 2a 20 43 6f 6d 70 75  t) ){.../* Compu
d500: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  te column names.
d510: 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
d520: 6e 65 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ne after the fir
d530: 73 74 20 73 75 63 63 65 73 73 66 75 6c 0a 09 2a  st successful..*
d540: 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
d550: 33 5f 73 74 65 70 28 29 2c 20 69 6e 20 63 61 73  3_step(), in cas
d560: 65 20 74 68 65 20 71 75 65 72 79 20 69 73 20 72  e the query is r
d570: 65 63 6f 6d 70 69 6c 65 64 20 61 6e 64 20 74 68  ecompiled and th
d580: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
d590: 62 65 72 20 6f 72 20 6e 61 6d 65 73 20 6f 66 20  ber or names of 
d5a0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c  the returned col
d5b0: 75 6d 6e 73 20 63 68 61 6e 67 65 73 2e 20 0a 20  umns changes. . 
d5c0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
d5d0: 20 20 61 73 73 65 72 74 28 21 70 41 72 72 61 79    assert(!pArray
d5e0: 7c 7c 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  ||pScript);.    
d5f0: 20 20 20 20 69 66 20 28 6e 43 6f 6c 20 3c 20 30      if (nCol < 0
d600: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  ) {.          Tc
d610: 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20 3d 20 28 70  l_Obj ***ap = (p
d620: 53 63 72 69 70 74 3f 26 61 70 43 6f 6c 4e 61 6d  Script?&apColNam
d630: 65 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e:0);.          
d640: 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75 74 65 43 6f  nCol = computeCo
d650: 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e 74 65 72 70  lumnNames(interp
d660: 2c 20 70 53 74 6d 74 2c 20 61 70 2c 20 70 41 72  , pStmt, ap, pAr
d670: 72 61 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ray);.        }.
d680: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
d690: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
d6a0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
d6b0: 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20  j *pVal;.       
d6c0: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a     .          /*
d6d0: 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e   Set pVal to con
d6e0: 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f  tain the i'th co
d6f0: 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77  lumn of this row
d700: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
d710: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
d720: 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
d730: 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , i) ){.        
d740: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d750: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
d760: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
d770: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
d780: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 29  _bytes(pStmt, i)
d790: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d7a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f  const char *zBlo
d7b0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
d7c0: 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  mn_blob(pStmt, i
d7d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d7e0: 20 69 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79   if( !zBlob ) by
d7f0: 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tes = 0;.       
d800: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
d810: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
d820: 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79  j((u8*)zBlob, by
d830: 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tes);.          
d840: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d850: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d860: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
d870: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
d880: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d890: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
d8a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
d8b0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
d8c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d           if( v>=
d8d0: 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76  -2147483647 && v
d8e0: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a  <=2147483647 ){.
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e  pVal = Tcl_NewIn
d910: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20  tObj(v);.       
d920: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
d940: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  al = Tcl_NewWide
d950: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
d960: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d970: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
d980: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d990: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
d9a0: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75               dou
d9c0: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
d9d0: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
d9e0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
d9f0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
da00: 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
da10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
da20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
da30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
da40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
da50: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL: {.          
da60: 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78      pVal = dbTex
da70: 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c  tToObj(pDb->zNul
da80: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
da90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
daa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
dab0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
dad0: 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 28   = dbTextToObj((
dae0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
daf0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
db00: 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20  , i));.         
db10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
db20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
db30: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
db40: 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29     if( pScript )
db50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
db60: 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20  ( pArray==0 ){. 
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
db80: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
db90: 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  rp, apColName[i]
dba0: 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20  , 0, pVal, 0);. 
dbb0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
dbc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
dbd0: 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
dbe0: 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61  nterp, pArray, a
dbf0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61  pColName[i], pVa
dc00: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
dc10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
dc20: 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d  else if( choice=
dc30: 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b  =DB_ONECOLUMN ){
dc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
dc50: 65 72 74 28 20 70 52 65 74 3d 3d 30 20 29 3b 0a  ert( pRet==0 );.
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
dc70: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pRet==0 ){.     
dc80: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
dc90: 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pVal;.          
dca0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
dcb0: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
dcc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dcd0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42        rc = TCL_B
dce0: 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  REAK;.          
dcf0: 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20    i = nCol;.    
dd00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dd10: 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54  choice==DB_EXIST
dd20: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  S ){.           
dd30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
dd40: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  t(pRet);.       
dd50: 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f       pRet = Tcl_
dd60: 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29  NewBooleanObj(1)
dd70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  ;.            Tc
dd80: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
dd90: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ret);.          
dda0: 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b    rc = TCL_BREAK
ddb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 20  ;.            i 
ddc0: 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = nCol;.        
ddd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dde0: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
ddf0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
de00: 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c  terp, pRet, pVal
de10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
de20: 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
de30: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
de40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  ){.          pDb
de50: 2d 3e 6e 53 74 65 70 20 3d 20 73 71 6c 69 74 65  ->nStep = sqlite
de60: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
de70: 74 6d 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tmt, .          
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
dea0: 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
deb0: 41 4e 5f 53 54 45 50 2c 20 30 29 3b 0a 20 20 20  AN_STEP, 0);.   
dec0: 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72         pDb->nSor
ded0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  t = sqlite3_stmt
dee0: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 0a 20  _status(pStmt,. 
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df10: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
df20: 55 53 5f 53 4f 52 54 2c 20 30 29 3b 0a 20 20 20  US_SORT, 0);.   
df30: 20 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f         rc = Tcl_
df40: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
df50: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
df60: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
df70: 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 7b  =TCL_CONTINUE ){
df80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
df90: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20  = TCL_OK;.      
dfa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
dfb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
dfc0: 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
dfd0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
dfe0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  TCL_OK;.      }.
dff0: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74  .      /* Free t
e000: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f  he column name o
e010: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  bjects */.      
e020: 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20  if( pScript ){. 
e030: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
e040: 20 71 75 65 72 79 20 72 65 74 75 72 6e 65 64 20   query returned 
e050: 6e 6f 20 72 6f 77 73 2c 20 62 75 74 20 61 6e 20  no rows, but an 
e060: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20 77  array variable w
e070: 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  as .        ** s
e080: 70 65 63 69 66 69 65 64 2c 20 63 61 6c 6c 20 63  pecified, call c
e090: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  omputeColumnName
e0a0: 73 28 29 20 6e 6f 77 20 74 6f 20 70 6f 70 75 6c  s() now to popul
e0b0: 61 74 65 20 74 68 65 20 0a 20 20 20 20 20 20 20  ate the .       
e0c0: 20 2a 2a 20 61 72 72 61 79 6e 61 6d 65 28 2a 29   ** arrayname(*)
e0d0: 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
e0e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
e0f0: 20 28 70 41 72 72 61 79 20 26 26 20 6e 43 6f 6c   (pArray && nCol
e100: 20 3c 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20   < 0) {.        
e110: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20    Tcl_Obj ***ap 
e120: 3d 20 28 70 53 63 72 69 70 74 3f 26 61 70 43 6f  = (pScript?&apCo
e130: 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20 20 20 20 20  lName:0);.      
e140: 20 20 20 20 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75      nCol = compu
e150: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e  teColumnNames(in
e160: 74 65 72 70 2c 20 70 53 74 6d 74 2c 20 61 70 2c  terp, pStmt, ap,
e170: 20 70 41 72 72 61 79 29 3b 0a 20 20 20 20 20 20   pArray);.      
e180: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
e190: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
e1a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
e1b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _DecrRefCount(ap
e1c0: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
e1d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
e1e0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61  cl_Free((char*)a
e1f0: 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  pColName);.     
e200: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   }..      /* Fre
e210: 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69  e the bound stri
e220: 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61  ng and blob para
e230: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  meters */.      
e240: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d  for(i=0; i<nParm
e250: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e260: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
e270: 28 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20  (apParm[i]);.   
e280: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
e290: 70 50 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a  pParm!=aParm ){.
e2a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
e2b0: 28 28 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b  ((char*)apParm);
e2c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e2d0: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 73 74 61  /* Reset the sta
e2e0: 74 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20  tement.  If the 
e2f0: 72 65 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53  result code is S
e300: 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68  QLITE_SCHEMA, th
e310: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  en.      ** flus
e320: 68 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  h the statement 
e330: 63 61 63 68 65 20 61 6e 64 20 74 72 79 20 74 68  cache and try th
e340: 65 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69  e statement agai
e350: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
e360: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
e370: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
e380: 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d      pDb->nStep =
e390: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
e3a0: 61 74 75 73 28 70 53 74 6d 74 2c 20 0a 20 20 20  atus(pStmt, .   
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
e3d0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
e3e0: 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 20  _FULLSCAN_STEP, 
e3f0: 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e  1);.      pDb->n
e400: 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 73  Sort = sqlite3_s
e410: 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74  tmt_status(pStmt
e420: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53      SQLITE_STMTS
e450: 54 41 54 55 53 5f 53 4f 52 54 2c 20 31 29 3b 0a  TATUS_SORT, 1);.
e460: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
e470: 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20 20 20  _OK!=rc2 ){.    
e480: 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75 6e 2d      /* If a run-
e490: 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72  time error occur
e4a0: 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65 72  s, report the er
e4b0: 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72 65 61  ror and stop rea
e4c0: 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
e4d0: 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20 20 20  the SQL.        
e4e0: 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  */.        Tcl_S
e4f0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
e500: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
e510: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
e520: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20  Db->db)));.     
e530: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
e540: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
e550: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
e560: 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OR;.        if( 
e570: 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46  pPreStmt ) Tcl_F
e580: 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65 53  ree((char*)pPreS
e590: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  tmt);.        br
e5a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
e5b0: 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74 6d   if( pDb->maxStm
e5c0: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t<=0 ){.        
e5d0: 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
e5e0: 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64  is turned off, d
e5f0: 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73  eallocated the s
e600: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
e610: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
e620: 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61   ) Tcl_Free((cha
e630: 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  r*)pPreStmt);.  
e640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
e650: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
e660: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e670: 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68 69 6e      /* Everythin
e680: 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74 68 65  g worked and the
e690: 20 63 61 63 68 65 20 69 73 20 6f 70 65 72 61 74   cache is operat
e6a0: 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a  ional..        *
e6b0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
e6c0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 73  qlPreparedStmt s
e6d0: 74 72 75 63 74 75 72 65 20 69 66 20 77 65 20 6e  tructure if we n
e6e0: 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20 20 20  eed one..       
e6f0: 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72 65 61   ** (If we alrea
e700: 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65 20 63  dy have one we c
e710: 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20 69 74  an just reuse it
e720: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .).        */.  
e730: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
e740: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt==0 ){.       
e750: 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74 20 2d     len = zLeft -
e760: 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 20   zSql;.         
e770: 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c   pPreStmt = (Sql
e780: 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63  PreparedStmt*)Tc
e790: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
e7a0: 2a 70 50 72 65 53 74 6d 74 29 20 29 3b 0a 20 20  *pPreStmt) );.  
e7b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
e7c0: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
e7d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e7e0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
e7f0: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
e800: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
e810: 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20  t->nSql = len;. 
e820: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
e830: 74 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  t->zSql = sqlite
e840: 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
e850: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e860: 73 74 72 6c 65 6e 33 30 28 70 50 72 65 53 74 6d  strlen30(pPreStm
e870: 74 2d 3e 7a 53 71 6c 29 3d 3d 6c 65 6e 20 29 3b  t->zSql)==len );
e880: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
e890: 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72  t( 0==memcmp(pPr
e8a0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
e8b0: 6c 2c 20 6c 65 6e 29 20 29 3b 0a 20 20 20 20 20  l, len) );.     
e8c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
e8d0: 20 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65   Add the prepare
e8e0: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  d statement to t
e8f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
e900: 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 0a 20  the cache list. 
e910: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e920: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
e930: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
e940: 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  t;.        pPreS
e950: 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  tmt->pPrev = 0;.
e960: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d          if( pDb-
e970: 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20  >stmtList ){.   
e980: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
e990: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ist->pPrev = pPr
e9a0: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  eStmt;.        }
e9b0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74  .        pDb->st
e9c0: 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d  mtList = pPreStm
e9d0: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
e9e0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20  Db->stmtLast==0 
e9f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
ea00: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d  ert( pDb->nStmt=
ea10: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
ea20: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
ea30: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20  pPreStmt;.      
ea40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ea50: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
ea60: 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 20  nStmt>0 );.     
ea70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
ea80: 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20  ->nStmt++;.   . 
ea90: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
eaa0: 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74  have too many st
eab0: 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65  atement in cache
eac0: 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72  , remove the sur
ead0: 70 6c 75 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  plus from the.  
eae0: 20 20 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20        ** end of 
eaf0: 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 0a  the cache list..
eb00: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
eb10: 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e     while( pDb->n
eb20: 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d  Stmt>pDb->maxStm
eb30: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
eb40: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
eb50: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
eb60: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
eb70: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
eb80: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e   pDb->stmtLast->
eb90: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  pPrev;.         
eba0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
ebb0: 29 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e  )pDb->stmtLast->
ebc0: 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  pNext);.        
ebd0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d    pDb->stmtLast-
ebe0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
ebf0: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
ec00: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
ec10: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
ec20: 50 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20 6e  Proceed to the n
ec30: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ext statement */
ec40: 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c  .      zSql = zL
ec50: 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  eft;.    }.    T
ec60: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
ec70: 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20 69  objv[2]);..    i
ec80: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
ec90: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
eca0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  ){.        Tcl_S
ecb0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ecc0: 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20  rp, pRet);.     
ecd0: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63   }.      Tcl_Dec
ece0: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
ecf0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
ed00: 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
ed10: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
ed20: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
ed30: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
ed40: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
ed50: 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d  $db function NAM
ed60: 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20  E [-argcount N] 
ed70: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
ed80: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
ed90: 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  L function calle
eda0: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
edb0: 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  r that function 
edc0: 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20  is.  ** called, 
edd0: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
ede0: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
edf0: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
ee00: 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a  ase DB_FUNCTION:
ee10: 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a   {.    SqlFunc *
ee20: 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f  pFunc;.    Tcl_O
ee30: 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20  bj *pScript;.   
ee40: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
ee50: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b    int nArg = -1;
ee60: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36  .    if( objc==6
ee70: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
ee80: 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65  char *z = Tcl_Ge
ee90: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
eea0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
eeb0: 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  strlen30(z);.   
eec0: 20 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74     if( n>2 && st
eed0: 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f  rncmp(z, "-argco
eee0: 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  unt",n)==0 ){.  
eef0: 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
ef00: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
ef10: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41  rp, objv[4], &nA
ef20: 72 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rg) ) return TCL
ef30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
ef40: 69 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20  if( nArg<0 ){.  
ef50: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
ef60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ef70: 20 22 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75   "number of argu
ef80: 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f  ments must be no
ef90: 6e 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20 20 20  n-negative",.   
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
efc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
efd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
efe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
eff0: 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
f000: 20 6f 62 6a 76 5b 35 5d 3b 0a 20 20 20 20 7d 65   objv[5];.    }e
f010: 6c 73 65 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  lse if( objc!=4 
f020: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
f030: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f040: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45  , 2, objv, "NAME
f050: 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53   [-argcount N] S
f060: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
f070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f080: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f090: 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
f0a0: 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  [3];.    }.    z
f0b0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
f0c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f0d0: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46 75  [2], 0);.    pFu
f0e0: 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63  nc = findSqlFunc
f0f0: 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  (pDb, zName);.  
f100: 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29    if( pFunc==0 )
f110: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f120: 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  R;.    if( pFunc
f130: 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20  ->pScript ){.   
f140: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
f150: 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69  unt(pFunc->pScri
f160: 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pt);.    }.    p
f170: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20  Func->pScript = 
f180: 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c  pScript;.    Tcl
f190: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
f1a0: 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e  cript);.    pFun
f1b0: 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d  c->useEvalObjv =
f1c0: 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62   safeToUseEvalOb
f1d0: 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  jv(interp, pScri
f1e0: 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  pt);.    rc = sq
f1f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
f200: 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a  ction(pDb->db, z
f210: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
f220: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
f230: 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75   pFunc, tclSqlFu
f240: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nc, 0, 0);.    i
f250: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f260: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
f270: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
f280: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
f290: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
f2a0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
f2b0: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
f2c0: 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ILE);.    }.    
f2d0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
f2e0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
f2f0: 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c  crblob ?-readonl
f300: 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
f310: 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a  LUMN ROWID.  */.
f320: 20 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c    case DB_INCRBL
f330: 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c  OB: {.#ifdef SQL
f340: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
f350: 42 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  B.    Tcl_Append
f360: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f370: 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61  incrblob not ava
f380: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
f390: 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72  uild", 0);.    r
f3a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f3b0: 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69  .#else.    int i
f3c0: 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20  sReadonly = 0;. 
f3d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f3e0: 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
f3f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
f400: 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
f410: 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20  har *zColumn;.  
f420: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
f430: 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  Row;..    /* Che
f440: 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65 61 64  ck for the -read
f450: 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  only option */. 
f460: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 26 26     if( objc>3 &&
f470: 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53   strcmp(Tcl_GetS
f480: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
f490: 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20  "-readonly")==0 
f4a0: 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  ){.      isReado
f4b0: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  nly = 1;.    }..
f4c0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 28 35      if( objc!=(5
f4d0: 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20  +isReadonly) && 
f4e0: 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61 64 6f  objc!=(6+isReado
f4f0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 54 63  nly) ){.      Tc
f500: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f510: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
f520: 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42  "?-readonly? ?DB
f530: 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52  ? TABLE COLUMN R
f540: 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20 72 65  OWID");.      re
f550: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f560: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
f570: 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e  bjc==(6+isReadon
f580: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  ly) ){.      zDb
f590: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f5a0: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d  (objv[2]);.    }
f5b0: 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63  .    zTable = Tc
f5c0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
f5d0: 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a  [objc-3]);.    z
f5e0: 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74  Column = Tcl_Get
f5f0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63  String(objv[objc
f600: 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  -2]);.    rc = T
f610: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
f620: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
f630: 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77  v[objc-1], &iRow
f640: 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
f650: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
f660: 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63 72 62  rc = createIncrb
f670: 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20  lobChannel(.    
f680: 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 70 44        interp, pD
f690: 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20  b, zDb, zTable, 
f6a0: 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69  zColumn, iRow, i
f6b0: 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20  sReadonly.      
f6c0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
f6d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f6e0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
f6f0: 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a  b interrupt.  **
f700: 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20  .  ** Interrupt 
f710: 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
f720: 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
f730: 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  SQL interpreter.
f740: 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73    This.  ** caus
f750: 65 73 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  es the SQL state
f760: 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61  ment to return a
f770: 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54  n error of SQLIT
f780: 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a  E_INTERRUPT..  *
f790: 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45  /.  case DB_INTE
f7a0: 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c  RRUPT: {.    sql
f7b0: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70  ite3_interrupt(p
f7c0: 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65  Db->db);.    bre
f7d0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
f7e0: 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76  **     $db nullv
f7f0: 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20  alue ?STRING?.  
f800: 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
f810: 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61 20  ext used when a 
f820: 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
f830: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
f840: 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20  e. If ?STRING?. 
f850: 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65   ** is not prese
f860: 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nt, then the cur
f870: 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64  rent string used
f880: 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74   for NULL is ret
f890: 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53  urned..  ** If S
f8a0: 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74  TRING is present
f8b0: 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73  , then STRING is
f8c0: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a   returned..  **.
f8d0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e    */.  case DB_N
f8e0: 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  ULLVALUE: {.    
f8f0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
f900: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
f910: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
f920: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
f930: 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a  , "NULLVALUE");.
f940: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f950: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f960: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
f970: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
f980: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c        char *zNul
f990: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
f9a0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
f9b0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
f9c0: 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
f9d0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
f9e0: 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20  e(pDb->zNull);. 
f9f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
fa00: 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20   zNull && len>0 
fa10: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
fa20: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zNull = Tcl_Allo
fa30: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
fa40: 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 70 44        strncpy(pD
fa50: 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c  b->zNull, zNull,
fa60: 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70   len);.        p
fa70: 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d  Db->zNull[len] =
fa80: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\0';.      }el
fa90: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
faa0: 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  >zNull = 0;.    
fab0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63    }.    }.    Tc
fac0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
fad0: 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
fae0: 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b  bj(pDb->zNull));
faf0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
fb00: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
fb10: 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  db last_insert_r
fb20: 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owid .  **.  ** 
fb30: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
fb40: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52  r which is the R
fb50: 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73  OWID for the mos
fb60: 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e  t recent insert.
fb70: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
fb80: 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49  LAST_INSERT_ROWI
fb90: 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  D: {.    Tcl_Obj
fba0: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54   *pResult;.    T
fbb0: 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64  cl_WideInt rowid
fbc0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
fbd0: 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
fbe0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
fbf0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
fc00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
fc10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fc20: 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69      rowid = sqli
fc30: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
fc40: 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a  rowid(pDb->db);.
fc50: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
fc60: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
fc70: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
fc80: 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52  SetWideIntObj(pR
fc90: 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20  esult, rowid);. 
fca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
fcb0: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f   /*.  ** The DB_
fcc0: 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64  ONECOLUMN method
fcd0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
fce0: 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42  together with DB
fcf0: 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  _EVAL..  */..  /
fd00: 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73  *    $db progres
fd10: 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20  s ?N CALLBACK?. 
fd20: 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65   ** .  ** Invoke
fd30: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
fd40: 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74  ack every N virt
fd50: 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f  ual machine opco
fd60: 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74  des while execut
fd70: 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  ing.  ** queries
fd80: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
fd90: 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20  _PROGRESS: {.   
fda0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
fdb0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
fdc0: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
fdd0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
fde0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
fdf0: 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b  ->zProgress, 0);
fe00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
fe10: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
fe20: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
fe30: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69  rogress;.      i
fe40: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e  nt len;.      in
fe50: 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t N;.      if( T
fe60: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
fe70: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
fe80: 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b   objv[2], &N) ){
fe90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fea0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
feb0: 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   };.      if( pD
fec0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
fed0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
fee0: 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29  (pDb->zProgress)
fef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ff00: 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
ff10: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ff20: 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b  (objv[3], &len);
ff30: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67  .      if( zProg
ff40: 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b  ress && len>0 ){
ff50: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
ff60: 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c  rogress = Tcl_Al
ff70: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
ff80: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
ff90: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a  Db->zProgress, z
ffa0: 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29  Progress, len+1)
ffb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ffc0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
ffd0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20  gress = 0;.     
ffe0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
fff0: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
10000 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69  CALLBACK.      i
10010 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
10020 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  s ){.        pDb
10030 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
10040 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
10050 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
10060 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20  ler(pDb->db, N, 
10070 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65  DbProgressHandle
10080 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
10090 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
100a0 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68  lite3_progress_h
100b0 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
100c0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
100d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
100e0 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72  se{.      Tcl_Wr
100f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10100 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43  p, 2, objv, "N C
10110 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20  ALLBACK");.     
10120 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10130 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
10140 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
10150 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43 41   $db profile ?CA
10160 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
10170 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  * Make arrangeme
10180 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  nts to invoke th
10190 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69  e CALLBACK routi
101a0 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53 51  ne after each SQ
101b0 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  L statement.  **
101c0 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20 20   that has run.  
101d0 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
101e0 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f 75  SQL and the amou
101f0 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69 6d  nt of elapse tim
10200 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e  e are.  ** appen
10210 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20  ded to CALLBACK 
10220 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69 70  before the scrip
10230 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20  t is run..  */. 
10240 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c 45   case DB_PROFILE
10250 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
10260 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
10270 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10280 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
10290 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
102a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
102b0 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
102c0 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
102d0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
102e0 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
102f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10300 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
10310 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20  Profile, 0);.   
10320 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
10330 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f        char *zPro
10340 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  file;.      int 
10350 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
10360 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
10370 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
10380 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b  (pDb->zProfile);
10390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
103a0 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65  Profile = Tcl_Ge
103b0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
103c0 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
103d0 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c       if( zProfil
103e0 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
103f0 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66        pDb->zProf
10400 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ile = Tcl_Alloc(
10410 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
10420 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
10430 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69  zProfile, zProfi
10440 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  le, len+1);.    
10450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10460 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
10470 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
10480 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10490 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28 20  TRACE.      if( 
104a0 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
104b0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
104c0 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
104d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
104e0 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
104f0 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
10500 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
10510 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10520 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
10530 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
10540 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
10550 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
10560 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
10570 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20  $db rekey KEY.  
10580 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
10590 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65  he encryption ke
105a0 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  y on the current
105b0 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ly open database
105c0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
105d0 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e  _REKEY: {.    in
105e0 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64  t nKey;.    void
105f0 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20   *pKey;.    if( 
10600 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
10610 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
10620 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
10630 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20  v, "KEY");.     
10640 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10650 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  R;.    }.    pKe
10660 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
10670 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
10680 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66  [2], &nKey);.#if
10690 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
106a0 4f 44 45 43 0a 20 20 20 20 72 63 20 3d 20 73 71  ODEC.    rc = sq
106b0 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d  lite3_rekey(pDb-
106c0 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  >db, pKey, nKey)
106d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
106e0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
106f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
10700 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
10710 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
10720 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10730 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
10740 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
10750 2a 2a 20 20 20 20 20 24 64 62 20 73 74 61 74 75  **     $db statu
10760 73 20 28 73 74 65 70 7c 73 6f 72 74 29 0a 20 20  s (step|sort).  
10770 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79 20  **.  ** Display 
10780 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
10790 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20  S_FULLSCAN_STEP 
107a0 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  or .  ** SQLITE_
107b0 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20  STMTSTATUS_SORT 
107c0 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
107d0 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20  ent eval..  */. 
107e0 20 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a   case DB_STATUS:
107f0 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20   {.    int v;.  
10800 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
10810 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  p;.    if( objc!
10820 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
10830 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10840 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28  erp, 2, objv, "(
10850 73 74 65 70 7c 73 6f 72 74 29 22 29 3b 0a 20 20  step|sort)");.  
10860 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10870 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10880 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zOp = Tcl_GetStr
10890 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
108a0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70    if( strcmp(zOp
108b0 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a  , "step")==0 ){.
108c0 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e        v = pDb->n
108d0 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Step;.    }else 
108e0 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20  if( strcmp(zOp, 
108f0 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "sort")==0 ){.  
10900 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f      v = pDb->nSo
10910 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rt;.    }else{. 
10920 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
10930 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
10940 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f  ad argument: sho
10950 75 6c 64 20 62 65 20 73 74 65 70 20 6f 72 20 73  uld be step or s
10960 6f 72 74 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ort", .         
10970 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
10980 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10990 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
109a0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
109b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
109c0 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20 20  IntObj(v));.    
109d0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  break;.  }.  .  
109e0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
109f0 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43  timeout MILLESEC
10a00 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ONDS.  **.  ** D
10a10 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d  elay for the num
10a20 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
10a30 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68  nds specified wh
10a40 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63  en a file is loc
10a50 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ked..  */.  case
10a60 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20   DB_TIMEOUT: {. 
10a70 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69     int ms;.    i
10a80 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
10a90 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10aa0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10ab0 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f  objv, "MILLISECO
10ac0 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74  NDS");.      ret
10ad0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10ae0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
10af0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
10b00 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
10b10 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  &ms) ) return TC
10b20 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  L_ERROR;.    sql
10b30 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
10b40 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a  t(pDb->db, ms);.
10b50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
10b60 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20   .  /*.  **     
10b70 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  $db total_change
10b80 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  s.  **.  ** Retu
10b90 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
10ba0 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
10bb0 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74  modified, insert
10bc0 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a  ed, or deleted .
10bd0 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64    ** since the d
10be0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
10bf0 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  as created..  */
10c00 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c  .  case DB_TOTAL
10c10 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
10c20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
10c30 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
10c40 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
10c50 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10c60 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
10c70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10c80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10c90 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
10ca0 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
10cb0 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
10cc0 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
10cd0 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  t, sqlite3_total
10ce0 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
10cf0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
10d00 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
10d10 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
10d20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
10d30 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
10d40 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
10d50 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
10d60 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
10d70 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
10d80 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
10d90 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
10da0 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
10db0 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
10dc0 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
10dd0 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
10de0 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
10df0 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
10e00 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10e10 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10e20 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
10e30 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10e40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10e50 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
10e60 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
10e70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
10e80 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10e90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
10ea0 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a  Db->zTrace, 0);.
10eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10ec0 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
10ed0 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74  Trace;.      int
10ee0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
10ef0 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
10f00 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
10f10 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
10f20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61      }.      zTra
10f30 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ce = Tcl_GetStri
10f40 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
10f50 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
10f60 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65  if( zTrace && le
10f70 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
10f80 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c  Db->zTrace = Tcl
10f90 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
10fa0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
10fb0 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a  y(pDb->zTrace, z
10fc0 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20  Trace, len+1);. 
10fd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10fe0 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
10ff0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
11000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11010 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28  _TRACE.      if(
11020 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
11030 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
11040 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
11050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
11060 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54  ace(pDb->db, DbT
11070 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  raceHandler, pDb
11080 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
110a0 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30  trace(pDb->db, 0
110b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
110c0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
110d0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
110e0 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
110f0 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
11100 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
11110 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  ive] SCRIPT.  **
11120 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  .  ** Start a ne
11130 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  w transaction (i
11140 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
11150 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73  eady in the mids
11160 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e  t of a.  ** tran
11170 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65  saction) and exe
11180 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72  cute the TCL scr
11190 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74  ipt SCRIPT.  Aft
111a0 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63  er SCRIPT.  ** c
111b0 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72  ompletes, either
111c0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
111d0 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20  saction or roll 
111e0 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50  it back if SCRIP
111f0 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e  T.  ** throws an
11200 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20   exception.  Or 
11210 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61  if no new transa
11220 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
11230 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
11240 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65  ** pass the exce
11250 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20  ption on up the 
11260 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
11270 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61   This command wa
11280 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61  s inspired by Da
11290 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b  ve Thomas's talk
112a0 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a   on Ruby at the.
112b0 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c    ** 2005 O'Reil
112c0 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43  ly Open Source C
112d0 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e  onvention (OSCON
112e0 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
112f0 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b  B_TRANSACTION: {
11300 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
11310 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74  cript;.    const
11320 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20   char *zBegin = 
11330 22 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f  "SAVEPOINT _tcl_
11340 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20  transaction";.  
11350 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
11360 6e 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  nd;.    if( objc
11370 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=3 && objc!=4 )
11380 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
11390 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
113a0 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45   2, objv, "[TYPE
113b0 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  ] SCRIPT");.    
113c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
113d0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
113e0 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63  f( pDb->nTransac
113f0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 7a 42  tion ){.      zB
11400 65 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e  egin = "SAVEPOIN
11410 54 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69  T _tcl_transacti
11420 6f 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  on";.    }else i
11430 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63  f( pDb->nTransac
11440 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d  tion==0 && objc=
11450 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74  =4 ){.      stat
11460 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54  ic const char *T
11470 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a  TYPE_strs[] = {.
11480 20 20 20 20 20 20 20 20 22 64 65 66 65 72 72 65          "deferre
11490 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65  d",   "exclusive
114a0 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c  ",  "immediate",
114b0 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
114c0 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75    enum TTYPE_enu
114d0 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50  m {.        TTYP
114e0 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59 50  E_DEFERRED, TTYP
114f0 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59  E_EXCLUSIVE, TTY
11500 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20  PE_IMMEDIATE.   
11510 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
11520 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28  ttype;.      if(
11530 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
11540 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
11550 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73  v[2], TTYPE_strs
11560 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  , "transaction t
11570 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ype",.          
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 20 29      0, &ttype) )
115a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
115b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
115c0 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68    }.      switch
115d0 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e  ( (enum TTYPE_en
115e0 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20  um)ttype ){.    
115f0 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 44      case TTYPE_D
11600 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e  EFERRED:    /* n
11610 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20  o-op */;        
11620 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
11630 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
11640 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20  PE_EXCLUSIVE:   
11650 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20  zBegin = "BEGIN 
11660 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65  EXCLUSIVE";  bre
11670 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
11680 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45   TTYPE_IMMEDIATE
11690 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45  :   zBegin = "BE
116a0 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20  GIN IMMEDIATE"; 
116b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
116c0 20 20 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70      }.    pScrip
116d0 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d  t = objv[objc-1]
116e0 3b 0a 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61  ;..    pDb->disa
116f0 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20 72  bleAuth++;.    r
11700 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
11710 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e  (pDb->db, zBegin
11720 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11730 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
11740 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  --;.    if( rc!=
11750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11760 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11770 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
11780 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
11790 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  db), 0);.      r
117a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
117b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 44 62 2d  .    }..    pDb-
117c0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
117d0 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  .    rc = Tcl_Ev
117e0 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
117f0 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
11800 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
11810 6f 6e 2d 2d 3b 0a 0a 20 20 20 20 69 66 28 20 72  on--;..    if( r
11820 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a  c!=TCL_ERROR ){.
11830 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 6e        if( pDb->n
11840 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
11850 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 52         zEnd = "R
11860 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e  ELEASE _tcl_tran
11870 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20 20 20 20  saction";.      
11880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
11890 45 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a  End = "COMMIT";.
118a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
118b0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  e{.      if( pDb
118c0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
118d0 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d  {.        zEnd =
118e0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f 74   "ROLLBACK TO _t
118f0 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20 3b  cl_transaction ;
11900 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72   RELEASE _tcl_tr
11910 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20 20  ansaction";.    
11920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11930 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43   zEnd = "ROLLBAC
11940 4b 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K";.      }.    
11950 7d 0a 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61  }..    pDb->disa
11960 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20 69  bleAuth++;.    i
11970 66 28 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  f( sqlite3_exec(
11980 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30  pDb->db, zEnd, 0
11990 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
119a0 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 72   /* This is a tr
119b0 69 63 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f  icky scenario to
119c0 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73   handle. The mos
119d0 74 20 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f  t likely cause o
119e0 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72  f an.      ** er
119f0 72 6f 72 20 69 73 20 74 68 61 74 20 74 68 65 20  ror is that the 
11a00 65 78 65 63 28 29 20 61 62 6f 76 65 20 77 61 73  exec() above was
11a10 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63   an attempt to c
11a20 6f 6d 6d 69 74 20 74 68 65 20 0a 20 20 20 20 20  ommit the .     
11a30 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72   ** top-level tr
11a40 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72  ansaction that r
11a50 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 42  eturned SQLITE_B
11a60 55 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69  USY. Or, less li
11a70 6b 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74  kely,.      ** t
11a80 68 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20  hat an IO-error 
11a90 68 61 73 20 6f 63 63 75 72 65 64 2e 20 49 6e 20  has occured. In 
11aa0 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 72  either case, thr
11ab0 6f 77 20 61 20 54 63 6c 20 65 78 63 65 70 74 69  ow a Tcl excepti
11ac0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  on.      ** and 
11ad0 74 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  try to rollback 
11ae0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
11af0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
11b00 2a 2a 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20  ** But it could 
11b10 61 6c 73 6f 20 62 65 20 74 68 61 74 20 74 68 65  also be that the
11b20 20 75 73 65 72 20 65 78 65 63 75 74 65 64 20 6f   user executed o
11b30 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e  ne or more BEGIN
11b40 2c 20 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d  , .      ** COMM
11b50 49 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20 52  IT, SAVEPOINT, R
11b60 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41  ELEASE or ROLLBA
11b70 43 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74  CK commands that
11b80 20 61 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20   are confusing. 
11b90 20 20 20 20 20 2a 2a 20 74 68 69 73 20 6d 65 74       ** this met
11ba0 68 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74  hod's logic. Not
11bb0 20 63 6c 65 61 72 20 68 6f 77 20 74 68 69 73 20   clear how this 
11bc0 77 6f 75 6c 64 20 62 65 20 62 65 73 74 20 68 61  would be best ha
11bd0 6e 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ndled..      */.
11be0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 54 43        if( rc!=TC
11bf0 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  L_ERROR ){.     
11c00 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11c10 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
11c20 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
11c30 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  db), 0);.       
11c40 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
11c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11c60 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
11c70 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  >db, "ROLLBACK",
11c80 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
11c90 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  .    pDb->disabl
11ca0 65 41 75 74 68 2d 2d 3b 0a 0a 20 20 20 20 62 72  eAuth--;..    br
11cb0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
11cc0 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74   **    $db updat
11cd0 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  e_hook ?script?.
11ce0 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c    **    $db roll
11cf0 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  back_hook ?scrip
11d00 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
11d10 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a  B_UPDATE_HOOK: .
11d20 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41    case DB_ROLLBA
11d30 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20  CK_HOOK: {..    
11d40 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f  /* set ppHook to
11d50 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74   point at pUpdat
11d60 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61  eHook or pRollba
11d70 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e  ckHook, dependin
11d80 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65  g on .    ** whe
11d90 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65  ther [$db update
11da0 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72  _hook] or [$db r
11db0 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61  ollback_hook] wa
11dc0 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a  s invoked..    *
11dd0 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
11de0 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28  ppHook; .    if(
11df0 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41   choice==DB_UPDA
11e00 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20  TE_HOOK ){.     
11e10 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
11e20 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20  pUpdateHook;.   
11e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
11e40 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f  Hook = &pDb->pRo
11e50 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20  llbackHook;.    
11e60 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  }..    if( objc!
11e70 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
11e80 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  .       Tcl_Wron
11e90 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11ea0 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49   2, objv, "?SCRI
11eb0 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65  PT?");.       re
11ec0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11ed0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70      }.    if( *p
11ee0 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54  pHook ){.      T
11ef0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11f00 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29  interp, *ppHook)
11f10 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
11f20 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ==3 ){.        T
11f30 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
11f40 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
11f50 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20    *ppHook = 0;. 
11f60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11f70 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
11f80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
11f90 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20  *ppHook) );.    
11fa0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61    if( Tcl_GetCha
11fb0 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29  rLength(objv[2])
11fc0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  >0 ){.        *p
11fd0 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b  pHook = objv[2];
11fe0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
11ff0 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
12000 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
12010 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75  }..    sqlite3_u
12020 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e  pdate_hook(pDb->
12030 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74  db, (pDb->pUpdat
12040 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61  eHook?DbUpdateHa
12050 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
12060 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c      sqlite3_roll
12070 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  back_hook(pDb->d
12080 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  b,(pDb->pRollbac
12090 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b  kHook?DbRollback
120a0 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b  Handler:0),pDb);
120b0 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ..    break;.  }
120c0 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65  ..  /*    $db ve
120d0 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rsion.  **.  ** 
120e0 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69  Return the versi
120f0 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  on string for th
12100 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  is database..  *
12110 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53  /.  case DB_VERS
12120 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ION: {.    Tcl_S
12130 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
12140 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
12150 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54  _libversion(), T
12160 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
12170 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d  break;.  }...  }
12180 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53   /* End of the S
12190 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20  WITCH statement 
121a0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
121b0 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  }../*.**   sqlit
121c0 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41  e3 DBNAME FILENA
121d0 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45  ME ?-vfs VFSNAME
121e0 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72  ? ?-key KEY? ?-r
121f0 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f  eadonly BOOLEAN?
12200 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d                ?-
12220 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20  create BOOLEAN? 
12230 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41  ?-nomutex BOOLEA
12240 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  N?.**.** This is
12250 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f   the main Tcl co
12260 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65  mmand.  When the
12270 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f   "sqlite" Tcl co
12280 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f  mmand is.** invo
12290 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ked, this routin
122a0 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73  e runs to proces
122b0 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a  s that command..
122c0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
122d0 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45  argument, DBNAME
122e0 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72  , is an arbitrar
122f0 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  y name for a new
12300 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
12310 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63  nection.  This c
12320 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61  ommand creates a
12330 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   new command nam
12340 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61  ed.** DBNAME tha
12350 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e  t is used to con
12360 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63  trol that connec
12370 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62  tion.  The datab
12380 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
12390 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65  n is deleted whe
123a0 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d  n the DBNAME com
123b0 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e  mand is deleted.
123c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
123d0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
123e0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
123f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
12400 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
12410 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54  Main(void *cd, T
12420 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12430 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f  p, int objc,Tcl_
12440 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29  Obj *const*objv)
12450 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b  {.  SqliteDb *p;
12460 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20  .  void *pKey = 
12470 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  0;.  int nKey = 
12480 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
12490 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a  *zArg;.  char *z
124a0 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b  ErrMsg;.  int i;
124b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
124c0 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  File;.  const ch
124d0 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20  ar *zVfs = 0;.  
124e0 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
124f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
12500 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
12510 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
12520 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20  OPEN_NOMUTEX;.  
12530 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61 6e  Tcl_DString tran
12540 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a  slatedFilename;.
12550 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
12560 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
12570 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
12580 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
12590 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
125a0 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30  g,"-version")==0
125b0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
125c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
125d0 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  p,sqlite3_versio
125e0 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n,0);.      retu
125f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
12600 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
12610 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63  zArg,"-has-codec
12620 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
12630 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
12640 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
12650 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
12660 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1",0);.#else.   
12670 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12680 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30  ult(interp,"0",0
12690 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
126a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
126b0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
126c0 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b  =3; i+1<objc; i+
126d0 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  =2){.    zArg = 
126e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
126f0 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  jv[i]);.    if( 
12700 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65  strcmp(zArg,"-ke
12710 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
12720 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
12730 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
12740 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29  bjv[i+1], &nKey)
12750 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
12760 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76  strcmp(zArg, "-v
12770 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
12780 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 56 66 73   i++;.      zVfs
12790 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
127a0 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  (objv[i]);.    }
127b0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
127c0 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  zArg, "-readonly
127d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
127e0 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
127f0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
12800 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12810 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
12820 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12830 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
12840 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
12850 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
12860 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
12870 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
12880 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
12890 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
128a0 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
128b0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
128c0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
128d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
128e0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
128f0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
12900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
12910 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
12920 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d  Arg, "-create")=
12930 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
12940 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
12950 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
12960 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
12970 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
12980 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12990 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66 6c      if( b && (fl
129a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
129b0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29  N_READONLY)==0 )
129c0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
129d0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  |= SQLITE_OPEN_C
129e0 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c  REATE;.      }el
129f0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
12a00 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
12a10 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
12a20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
12a30 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e  strcmp(zArg, "-n
12a40 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  omutex")==0 ){. 
12a50 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
12a60 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
12a70 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
12a80 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
12a90 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
12aa0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
12ab0 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
12ac0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
12ad0 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
12ae0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
12af0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
12b00 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TEX;.      }else
12b10 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
12b20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
12b30 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  NOMUTEX;.      }
12b40 0a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  .   }else if( st
12b50 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c  rcmp(zArg, "-ful
12b60 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  lmutex")==0 ){. 
12b70 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
12b80 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
12b90 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
12ba0 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
12bb0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
12bc0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
12bd0 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
12be0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
12bf0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
12c00 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
12c10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
12c20 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TEX;.      }else
12c30 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
12c40 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
12c50 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20  FULLMUTEX;.     
12c60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
12c70 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12c80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
12c90 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c  known option: ",
12ca0 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29   zArg, (char*)0)
12cb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
12cc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12cd0 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33    }.  if( objc<3
12ce0 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20   || (objc&1)!=1 
12cf0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
12d00 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12d10 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20  1, objv, .      
12d20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
12d30 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
12d40 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
12d50 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f  AN? ?-create BOO
12d60 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f  LEAN?".      " ?
12d70 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
12d80 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f  ? ?-fullmutex BO
12d90 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66 20 53  OLEAN?".#ifdef S
12da0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
12db0 20 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f        " ?-key CO
12dc0 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a  DECKEY?".#endif.
12dd0 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72      );.    retur
12de0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12df0 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  .  zErrMsg = 0;.
12e00 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a    p = (SqliteDb*
12e10 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
12e20 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
12e30 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  p==0 ){.    Tcl_
12e40 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
12e50 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  , "malloc failed
12e60 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ", TCL_STATIC);.
12e70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12e80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  RROR;.  }.  mems
12e90 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
12ea0 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  *p));.  zFile = 
12eb0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12ec0 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
12ed0 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
12ee0 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d  TranslateFileNam
12ef0 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c  e(interp, zFile,
12f00 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65   &translatedFile
12f10 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  name);.  sqlite3
12f20 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20  _open_v2(zFile, 
12f30 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a  &p->db, flags, z
12f40 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Vfs);.  Tcl_DStr
12f50 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61  ingFree(&transla
12f60 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  tedFilename);.  
12f70 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
12f80 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
12f90 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72  ->db) ){.    zEr
12fa0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
12fb0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
12fc0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
12fd0 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b));.    sqlite3
12fe0 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
12ff0 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
13000 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
13010 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
13020 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  p->db ){.    sql
13030 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20  ite3_key(p->db, 
13040 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d  pKey, nKey);.  }
13050 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
13060 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  >db==0 ){.    Tc
13070 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
13080 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c  rp, zErrMsg, TCL
13090 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
130a0 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
130b0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
130c0 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
130d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
130e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  ROR;.  }.  p->ma
130f0 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50  xStmt = NUM_PREP
13100 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d  ARED_STMTS;.  p-
13110 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
13120 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47  ;.  zArg = Tcl_G
13130 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
13140 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54  objv[1], 0);.  T
13150 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
13160 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67  and(interp, zArg
13170 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61  , DbObjCmd, (cha
13180 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d  r*)p, DbDeleteCm
13190 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  d);.  return TCL
131a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  _OK;.}../*.** Pr
131b0 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63  ovide a dummy Tc
131c0 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77  l_InitStubs if w
131d0 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  e are using this
131e0 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20   as a static.** 
131f0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e  library..*/.#ifn
13200 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
13210 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49  S.# undef  Tcl_I
13220 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e  nitStubs.# defin
13230 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  e Tcl_InitStubs(
13240 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
13250 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
13260 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45  e have a PACKAGE
13270 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64  _VERSION macro d
13280 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69  efined.  This wi
13290 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64  ll be.** defined
132a0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
132b0 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69  y the TEA makefi
132c0 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d  le.  But other m
132d0 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e  akefiles.** do n
132e0 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f  ot define it..*/
132f0 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45  .#ifndef PACKAGE
13300 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e  _VERSION.# defin
13310 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  e PACKAGE_VERSIO
13320 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  N SQLITE_VERSION
13330 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
13340 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
13350 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  odule..**.** Thi
13360 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e  s Tcl module con
13370 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e  tains only a sin
13380 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  gle new Tcl comm
13390 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74  and named "sqlit
133a0 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68  e"..** (Hence th
133b0 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70  ere is no namesp
133c0 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ace.  There is n
133d0 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67  o point in using
133e0 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20   a namespace.** 
133f0 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  if the extension
13400 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f   only supplies o
13410 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54  ne new name!)  T
13420 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
13430 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  and is.** used t
13440 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c  o open a new SQL
13450 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53  ite database.  S
13460 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20  ee the DbMain() 
13470 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a  routine above.**
13480 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
13490 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
134a0 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
134b0 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  e3_Init(Tcl_Inte
134c0 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54  rp *interp){.  T
134d0 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
134e0 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a  erp, "8.4", 0);.
134f0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
13500 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
13510 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f  sqlite3", (Tcl_O
13520 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
13530 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  n, 0, 0);.  Tcl_
13540 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
13550 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41  p, "sqlite3", PA
13560 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a  CKAGE_VERSION);.
13570 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
13580 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
13590 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62  sqlite", (Tcl_Ob
135a0 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
135b0 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50  , 0, 0);.  Tcl_P
135c0 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
135d0 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43 4b  , "sqlite", PACK
135e0 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  AGE_VERSION);.  
135f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
13600 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
13610 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
13620 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
13630 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
13640 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
13650 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
13660 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  e3_SafeInit(Tcl_
13670 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
13680 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
13690 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
136a0 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74  sqlite3_SafeInit
136b0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
136c0 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
136d0 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
136e0 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64  t Sqlite3_Unload
136f0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
13700 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
13710 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
13720 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
13730 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54  sqlite3_Unload(T
13740 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13750 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
13760 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
13770 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
13780 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63  e3_SafeUnload(Tc
13790 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
137a0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
137b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
137c0 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
137d0 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28  ite3_SafeUnload(
137e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
137f0 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
13800 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a  return TCL_OK;}.
13810 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13820 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 45  _3_SUFFIX_ONLY.E
13830 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
13840 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
13850 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
13860 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
13870 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e  nterp); }.EXTERN
13880 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49   int Tclsqlite_I
13890 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
138a0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
138b0 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
138c0 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69  erp); }.EXTERN i
138d0 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e  nt Sqlite_SafeIn
138e0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
138f0 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
13900 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20  CL_OK; }.EXTERN 
13910 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53 61  int Tclsqlite_Sa
13920 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
13930 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
13940 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54  rn TCL_OK; }.EXT
13950 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 55  ERN int Sqlite_U
13960 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
13970 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
13980 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
13990 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
139a0 74 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f  t Tclsqlite_Unlo
139b0 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
139c0 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
139d0 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
139e0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
139f0 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64  qlite_SafeUnload
13a00 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
13a10 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
13a20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
13a30 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
13a40 73 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f 61  sqlite_SafeUnloa
13a50 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
13a60 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
13a70 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
13a80 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
13a90 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ae0 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  *****.** The cod
13af0 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  e that follows i
13b00 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
13b10 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69  standalone TCL i
13b20 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2a 20 74  nterpreters.** t
13b30 68 61 74 20 61 72 65 20 73 74 61 74 69 63 61 6c  hat are statical
13b40 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74 68 20 53  ly linked with S
13b50 51 4c 69 74 65 2e 20 20 0a 2a 2f 0a 0a 2f 2a 0a  QLite.  .*/../*.
13b60 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
13b70 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68  TCLSH is one, th
13b80 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74  en put in code t
13b90 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22  his for the.** "
13ba0 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68  main" routine th
13bb0 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69  at will initiali
13bc0 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20  ze Tcl and take 
13bd0 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74  input from.** st
13be0 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72  andard input, or
13bf0 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61   if a file is na
13c00 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  med on the comma
13c10 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54  nd line.** the T
13c20 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  CL interpreter r
13c30 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74  eads and evaluat
13c40 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f  es that file..*/
13c50 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74  .#if TCLSH==1.st
13c60 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
13c70 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c  oop[] =.  "set l
13c80 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69  ine {}\n".  "whi
13c90 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d  le {![eof stdin]
13ca0 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b  } {\n".    "if {
13cb0 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  $line!=\"\"} {\n
13cc0 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
13cd0 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c  onewline \"> \"\
13ce0 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  n".    "} else {
13cf0 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20  \n".      "puts 
13d00 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c  -nonewline \"% \
13d10 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  "\n".    "}\n". 
13d20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74     "flush stdout
13d30 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20  \n".    "append 
13d40 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e  line [gets stdin
13d50 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69  ]\n".    "if {[i
13d60 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69  nfo complete $li
13d70 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  ne]} {\n".      
13d80 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c  "if {[catch {upl
13d90 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72  evel #0 $line} r
13da0 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20  esult]} {\n".   
13db0 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72       "puts stder
13dc0 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75  r \"Error: $resu
13dd0 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d  lt\"\n".      "}
13de0 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
13df0 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
13e00 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75       "puts $resu
13e10 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e  lt\n".      "}\n
13e20 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e  ".      "set lin
13e30 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65  e {}\n".    "} e
13e40 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
13e50 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c  append line \\n\
13e60 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22  n".    "}\n".  "
13e70 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f  }\n".;.#endif../
13e80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
13e90 6f 20 54 43 4c 53 48 20 69 73 20 74 77 6f 2c 20  o TCLSH is two, 
13ea0 74 68 65 6e 20 67 65 74 20 74 68 65 20 6d 61 69  then get the mai
13eb0 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20  n loop code out 
13ec0 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61  of.** the separa
13ed0 74 65 20 66 69 6c 65 20 22 73 70 61 63 65 61 6e  te file "spacean
13ee0 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69  al_tcl.h"..*/.#i
13ef0 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69  f TCLSH==2.stati
13f00 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
13f10 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22  [] = .#include "
13f20 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22  spaceanal_tcl.h"
13f30 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .;.#endif..#defi
13f40 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
13f50 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
13f60 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
13f70 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
13f80 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
13f90 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
13fa0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13fb0 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  rp;.  Tcl_FindEx
13fc0 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
13fd0 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63  );.  interp = Tc
13fe0 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
13ff0 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  ;.  Sqlite3_Init
14000 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66  (interp);.#ifdef
14010 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
14020 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
14030 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Md5_Init(Tcl_Int
14040 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
14050 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66  n int Sqliteconf
14060 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ig_Init(Tcl_Inte
14070 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
14080 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
14090 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
140a0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
140b0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_I
140c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
140d0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
140e0 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
140f0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
14100 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
14110 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
14120 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
14130 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
14140 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
14150 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
14160 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
14170 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f  etest6_Init(Tcl_
14180 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
14190 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
141a0 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est7_Init(Tcl_In
141b0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
141c0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
141d0 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t8_Init(Tcl_Inte
141e0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
141f0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 39   int Sqlitetest9
14200 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
14210 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
14220 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
14230 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
14240 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
14250 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
14260 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c  autoext_Init(Tcl
14270 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
14280 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
14290 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54  test_func_Init(T
142a0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
142b0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
142c0 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
142d0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
142e0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
142f0 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
14300 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
14310 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
14320 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75  nt Sqlitetest_mu
14330 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tex_Init(Tcl_Int
14340 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
14350 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
14360 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f  schema_Init(Tcl_
14370 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
14380 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
14390 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f  estsse_Init(Tcl_
143a0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
143b0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
143c0 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54  esttclvar_Init(T
143d0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
143e0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
143f0 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
14400 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
14410 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
14420 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
14430 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74  _Init();.    ext
14440 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
14450 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63  stOsinst_Init(Tc
14460 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20  l_Interp*);..   
14470 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70   Md5_Init(interp
14480 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e  );.    Sqlitecon
14490 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  fig_Init(interp)
144a0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
144b0 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
144c0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
144d0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
144e0 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
144f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
14500 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
14510 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
14520 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
14530 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
14540 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
14550 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
14560 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72  test7_Init(inter
14570 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
14580 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st8_Init(interp)
14590 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
145a0 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  9_Init(interp);.
145b0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73      Sqlitetestas
145c0 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ync_Init(interp)
145d0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
145e0 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e  _autoext_Init(in
145f0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
14600 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28  etest_func_Init(
14610 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
14620 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e  itetest_hexio_In
14630 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
14640 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
14650 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
14660 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d      Sqlitetest_m
14670 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70  utex_Init(interp
14680 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
14690 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74  tschema_Init(int
146a0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
146b0 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
146c0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
146d0 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e  itetestThread_In
146e0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
146f0 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c  SqlitetestOnefil
14700 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  e_Init(interp);.
14710 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 73      SqlitetestOs
14720 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  inst_Init(interp
14730 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
14740 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65  E_SSE.    Sqlite
14750 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74  testsse_Init(int
14760 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  erp);.#endif.  }
14770 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72  .#endif.  if( ar
14780 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d  gc>=2 || TCLSH==
14790 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
147a0 20 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33      char zArgc[3
147b0 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2];.    sqlite3_
147c0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
147d0 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22  zArgc), zArgc, "
147e0 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c  %d", argc-(3-TCL
147f0 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  SH));.    Tcl_Se
14800 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
14810 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47  c", zArgc, TCL_G
14820 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
14830 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
14840 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b  rp,"argv0",argv[
14850 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  1],TCL_GLOBAL_ON
14860 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
14870 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
14880 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  ", "", TCL_GLOBA
14890 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72  L_ONLY);.    for
148a0 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72  (i=3-TCLSH; i<ar
148b0 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
148c0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
148d0 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b  p, "argv", argv[
148e0 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43  i],.          TC
148f0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20  L_GLOBAL_ONLY | 
14900 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54  TCL_LIST_ELEMENT
14910 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41   | TCL_APPEND_VA
14920 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LUE);.    }.    
14930 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20  if( TCLSH==1 && 
14940 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74  Tcl_EvalFile(int
14950 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54  erp, argv[1])!=T
14960 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63  CL_OK ){.      c
14970 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f  onst char *zInfo
14980 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e   = Tcl_GetVar(in
14990 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f  terp, "errorInfo
149a0 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
149b0 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LY);.      if( z
149c0 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20  Info==0 ) zInfo 
149d0 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74  = interp->result
149e0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
149f0 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e  stderr,"%s: %s\n
14a00 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29  ", *argv, zInfo)
14a10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
14a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
14a30 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c  ( argc<=1 || TCL
14a40 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  SH==2 ){.    Tcl
14a50 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65  _GlobalEval(inte
14a60 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a  rp, zMainloop);.
14a70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
14a80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53  }.#endif /* TCLS
14a90 48 20 2a 2f 0a                                   H */.