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

Artifact 1367762764772a233643524c3585b4711a9adcda:


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 31 32 20 32 30 30 38  e.c,v 1.212 2008
0220: 2f 30 33 2f 32 35 20 31 36 3a 31 36 3a 32 39 20  /03/25 16:16:29 
0230: 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20  danielk1977 Exp 
0240: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 74  $.*/.#include "t
0250: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0260: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  errno.h>../*.** 
0270: 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Some additional 
0280: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61 72  include files ar
0290: 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69 73  e needed if this
02a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
02b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
02c0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
02d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
02e0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69  AMALGAMATION.# i
02f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0300: 74 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c  t.h".# include <
0310: 73 74 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c  stdlib.h>.# incl
0320: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0330: 20 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74   include <assert
0340: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 63  .h>.# include <c
0350: 74 79 70 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  type.h>.#endif..
0360: 2f 2a 0a 20 2a 20 57 69 6e 64 6f 77 73 20 6e 65  /*. * Windows ne
0370: 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 69 63  eds to know whic
0380: 68 20 73 79 6d 62 6f 6c 73 20 74 6f 20 65 78 70  h symbols to exp
0390: 6f 72 74 2e 20 20 55 6e 69 78 20 64 6f 65 73 20  ort.  Unix does 
03a0: 6e 6f 74 2e 0a 20 2a 20 42 55 49 4c 44 5f 73 71  not.. * BUILD_sq
03b0: 6c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 75  lite should be u
03c0: 6e 64 65 66 69 6e 65 64 20 66 6f 72 20 55 6e 69  ndefined for Uni
03d0: 78 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 42 55  x.. */.#ifdef BU
03e0: 49 4c 44 5f 73 71 6c 69 74 65 0a 23 75 6e 64 65  ILD_sqlite.#unde
03f0: 66 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c  f TCL_STORAGE_CL
0400: 41 53 53 0a 23 64 65 66 69 6e 65 20 54 43 4c 5f  ASS.#define TCL_
0410: 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 20 44 4c  STORAGE_CLASS DL
0420: 4c 45 58 50 4f 52 54 0a 23 65 6e 64 69 66 20 2f  LEXPORT.#endif /
0430: 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 2a  * BUILD_sqlite *
0440: 2f 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f 50  /..#define NUM_P
0450: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30  REPARED_STMTS 10
0460: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 52 45  .#define MAX_PRE
0470: 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30 30 0a  PARED_STMTS 100.
0480: 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c 20 75 73  ./*.** If TCL us
0490: 65 73 20 55 54 46 2d 38 20 61 6e 64 20 53 51 4c  es UTF-8 and SQL
04a0: 69 74 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ite is configure
04b0: 64 20 74 6f 20 75 73 65 20 69 73 6f 38 38 35 39  d to use iso8859
04c0: 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20 68 61 76  , then we.** hav
04d0: 65 20 74 6f 20 64 6f 20 61 20 74 72 61 6e 73 6c  e to do a transl
04e0: 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f 69 6e 67  ation when going
04f0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
0500: 2e 20 20 53 65 74 20 74 68 65 20 0a 2a 2a 20 55  .  Set the .** U
0510: 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e  TF_TRANSLATION_N
0520: 45 45 44 45 44 20 6d 61 63 72 6f 20 74 6f 20 69  EEDED macro to i
0530: 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20  ndicate that we 
0540: 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74 68  need to do.** th
0550: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 20  is translation. 
0560: 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
0570: 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29 20 26 26  (TCL_UTF_MAX) &&
0580: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0590: 5f 55 54 46 38 29 0a 23 20 64 65 66 69 6e 65 20  _UTF8).# define 
05a0: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
05b0: 4e 45 45 44 45 44 20 31 0a 23 65 6e 64 69 66 0a  NEEDED 1.#endif.
05c0: 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c 20 66  ./*.** New SQL f
05d0: 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20  unctions can be 
05e0: 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20 73  created as TCL s
05f0: 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73 75  cripts.  Each su
0600: 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ch function.** i
0610: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
0620: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0630: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0640: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
0650: 66 20 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  f struct SqlFunc
0660: 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72 75 63 74   SqlFunc;.struct
0670: 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20 54 63 6c   SqlFunc {.  Tcl
0680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
0690: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
06a0: 74 65 72 70 72 65 74 20 74 6f 20 65 78 65 63 75  terpret to execu
06b0: 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  te the function 
06c0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
06d0: 63 72 69 70 74 3b 20 20 20 20 20 2f 2a 20 54 68  cript;     /* Th
06e0: 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70 72 65 73  e Tcl_Obj repres
06f0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0700: 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74 20  script */.  int 
0710: 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20 20  useEvalObjv;    
0720: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 20    /* True if it 
0730: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
0740: 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20  cl_EvalObjv */. 
0750: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
0760: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0770: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
0780: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e  */.  SqlFunc *pN
0790: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
07a0: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
07b0: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
07c0: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
07d0: 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   New collation s
07e0: 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f  equences functio
07f0: 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  n can be created
0800: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0810: 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66    Each such.** f
0820: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72  unction is descr
0830: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0840: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0850: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0870: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c  t SqlCollate Sql
0880: 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20  Collate;.struct 
0890: 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54  SqlCollate {.  T
08a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
08b0: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
08c0: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
08d0: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
08e0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63  n */.  char *zSc
08f0: 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ript;        /* 
0900: 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65  The script to be
0910: 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c   run */.  SqlCol
0920: 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  late *pNext;    
0930: 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e  /* Next function
0940: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20   on the list of 
0950: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a  them all */.};..
0960: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20 73  /*.** Prepared s
0970: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 61  tatements are ca
0980: 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72 20  ched for faster 
0990: 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63 68  execution.  Each
09a0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
09b0: 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72 69  tement is descri
09c0: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
09d0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
09e0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
09f0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a00: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0a10: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0a20: 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  ;.struct SqlPrep
0a30: 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71 6c  aredStmt {.  Sql
0a40: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
0a50: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
0a60: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
0a70: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0a80: 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50 72  t *pPrev;  /* Pr
0a90: 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c 69  evious on the li
0aa0: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
0ab0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
0ac0: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
0ad0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0ae0: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
0af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61 72           /* char
0b00: 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  s in zSql[] */. 
0b10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
0b20: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  l;        /* Tex
0b30: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
0b40: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 74 79  tement */.};..ty
0b50: 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 63  pedef struct Inc
0b60: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 49 6e 63  rblobChannel Inc
0b70: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 3b 0a 0a 2f  rblobChannel;../
0b80: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
0b90: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
0ba0: 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
0bb0: 20 65 61 63 68 20 53 51 4c 69 74 65 20 64 61 74   each SQLite dat
0bc0: 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20 68 61  abase.** that ha
0bd0: 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
0be0: 20 74 68 65 20 53 51 4c 69 74 65 20 54 43 4c 20   the SQLite TCL 
0bf0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 74 79  interface..*/.ty
0c00: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0c10: 69 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a  iteDb SqliteDb;.
0c20: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
0c30: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c50: 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74  * The "real" dat
0c60: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
0c70: 20 4d 55 53 54 20 42 45 20 46 49 52 53 54 20 2a   MUST BE FIRST *
0c80: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
0c90: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f  interp;        /
0ca0: 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65  * The interprete
0cb0: 72 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  r used for this 
0cc0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
0cd0: 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20  ar *zBusy;      
0ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0cf0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f  busy callback ro
0d00: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0d10: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
0d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
0d30: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
0d40: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0d50: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0d70: 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
0d80: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0d90: 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20 20 20  r *zProfile;    
0da0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0db0: 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20  rofile callback 
0dc0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0dd0: 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20  r *zProgress;   
0de0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
0df0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
0e00: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0e10: 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20  ar *zAuth;      
0e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0e30: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
0e40: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0e50: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b  /.  char *zNull;
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0e70: 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69  * Text to substi
0e80: 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20  tute for an SQL 
0e90: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
0ea0: 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20  SqlFunc *pFunc; 
0eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
0ec0: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
0ed0: 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ons */.  Tcl_Obj
0ee0: 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20   *pUpdateHook;  
0ef0: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f      /* Update ho
0f00: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0f10: 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  y) */.  Tcl_Obj 
0f20: 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20  *pRollbackHook; 
0f30: 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68     /* Rollback h
0f40: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
0f50: 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ny) */.  SqlColl
0f60: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20  ate *pCollate;  
0f70: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53      /* List of S
0f80: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
0f90: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
0fa0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
0fb0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
0fc0: 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65   code of most re
0fd0: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  cent sqlite3_exe
0fe0: 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  c() */.  Tcl_Obj
0ff0: 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64   *pCollateNeeded
1000: 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e  ;   /* Collation
1010: 20 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a   needed script *
1020: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
1030: 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f  tmt *stmtList; /
1040: 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72  * List of prepar
1050: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a  ed statements*/.
1060: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
1070: 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20  t *stmtLast; /* 
1080: 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69  Last statement i
1090: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
10a0: 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20  int maxStmt;    
10b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10c0: 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e  e next maximum n
10d0: 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73  umber of stmtLis
10e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74  t */.  int nStmt
10f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1100: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
1110: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d  tatements in stm
1120: 74 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62  tList */.  Incrb
1130: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63  lobChannel *pInc
1140: 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20  rblob;/* Linked 
1150: 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63  list of open inc
1160: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
1170: 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63  /.};..struct Inc
1180: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20  rblobChannel {. 
1190: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
11a0: 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73 71  Blob;      /* sq
11b0: 6c 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c  lite3 blob handl
11c0: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
11d0: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
11e0: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
11f0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1200: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65  on */.  int iSee
1210: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1220: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65 65    /* Current see
1230: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54 63  k offset */.  Tc
1240: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65  l_Channel channe
1250: 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e  l;      /* Chann
1260: 65 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  el identifier */
1270: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1280: 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20  el *pNext;   /* 
1290: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
12a0: 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  ll open incrblob
12b0: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49   channels */.  I
12c0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
12d0: 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b  pPrev;   /* Link
12e0: 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f  ed list of all o
12f0: 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  pen incrblob cha
1300: 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  nnels */.};..#if
1310: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1320: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
1330: 43 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72 62 6c  Close all incrbl
1340: 6f 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70 65 6e  ob channels open
1350: 65 64 20 75 73 69 6e 67 20 64 61 74 61 62 61 73  ed using databas
1360: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62  e connection pDb
1370: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  ..** This is cal
1380: 6c 65 64 20 77 68 65 6e 20 73 68 75 74 74 69 6e  led when shuttin
1390: 67 20 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62  g down the datab
13a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
13b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
13c0: 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  loseIncrblobChan
13d0: 6e 65 6c 73 28 53 71 6c 69 74 65 44 62 20 2a 70  nels(SqliteDb *p
13e0: 44 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  Db){.  IncrblobC
13f0: 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49 6e 63  hannel *p;.  Inc
1400: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e  rblobChannel *pN
1410: 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 44  ext;..  for(p=pD
1420: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20 70 3b  b->pIncrblob; p;
1430: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
1440: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
1450: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 43  ..    /* Note: C
1460: 61 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73 74 65  alling unregiste
1470: 72 20 68 65 72 65 20 63 61 6c 6c 20 54 63 6c 5f  r here call Tcl_
1480: 43 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69 6e 63  Close on the inc
1490: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c 20 0a  rblob channel, .
14a0: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 64 65 6c      ** which del
14b0: 65 74 65 73 20 74 68 65 20 49 6e 63 72 62 6c 6f  etes the Incrblo
14c0: 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75  bChannel structu
14d0: 72 65 20 61 74 20 2a 70 2e 20 53 6f 20 64 6f 20  re at *p. So do 
14e0: 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  not.    ** call 
14f0: 54 63 6c 5f 46 72 65 65 28 29 20 68 65 72 65 2e  Tcl_Free() here.
1500: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  .    */.    Tcl_
1510: 55 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65  UnregisterChanne
1520: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
1530: 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a  ->channel);.  }.
1540: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1550: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
1560: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
1570: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
1580: 6f 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74 44 61  obClose(ClientDa
1590: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
15a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15b0: 65 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  erp){.  Incrblob
15c0: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
15d0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
15e0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
15f0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1600: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70  _blob_close(p->p
1610: 42 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  Blob);.  sqlite3
1620: 20 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d 3e 64   *db = p->pDb->d
1630: 62 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  b;..  /* Remove 
1640: 74 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d  the channel from
1650: 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49   the SqliteDb.pI
1660: 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f  ncrblob list. */
1670: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
1680: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
1690: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
16a0: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  v;.  }.  if( p->
16b0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
16c0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
16d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
16e0: 66 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72  f( p->pDb->pIncr
16f0: 62 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20 20 70  blob==p ){.    p
1700: 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  ->pDb->pIncrblob
1710: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
1720: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
1730: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1740: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54  structure */.  T
1750: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
1760: 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  p);..  if( rc!=S
1770: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1780: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1790: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
17a0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
17b0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
17c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
17e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
17f0: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
1800: 72 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rom an increment
1810: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1830: 6e 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20 20  ncrblobInput(.  
1840: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
1850: 6e 63 65 44 61 74 61 2c 20 0a 20 20 63 68 61 72  nceData, .  char
1860: 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 62 75   *buf, .  int bu
1870: 66 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65 72  fSize,.  int *er
1880: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
1890: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
18a0: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
18b0: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
18c0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65 61  Data;.  int nRea
18d0: 64 20 3d 20 62 75 66 53 69 7a 65 3b 20 20 20 20  d = bufSize;    
18e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18f0: 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
1900: 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20  */.  int nBlob; 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
1930: 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20  of the blob */. 
1940: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1960: 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
1970: 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d  de */..  nBlob =
1980: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
1990: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  tes(p->pBlob);. 
19a0: 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e   if( (p->iSeek+n
19b0: 52 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20  Read)>nBlob ){. 
19c0: 20 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f 62     nRead = nBlob
19d0: 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a 20  -p->iSeek;.  }. 
19e0: 20 69 66 28 20 6e 52 65 61 64 3c 3d 30 20 29 7b   if( nRead<=0 ){
19f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1a00: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
1a10: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e  e3_blob_read(p->
1a20: 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62  pBlob, (void *)b
1a30: 75 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 53  uf, nRead, p->iS
1a40: 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  eek);.  if( rc!=
1a50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a60: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
1a70: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   rc;.    return 
1a80: 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53  -1;.  }..  p->iS
1a90: 65 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20  eek += nRead;.  
1aa0: 72 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a  return nRead;.}.
1ab0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
1ac0: 61 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  a to an incremen
1ad0: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
1ae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1af0: 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 28 0a  incrblobOutput(.
1b00: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
1b10: 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 43 4f  tanceData, .  CO
1b20: 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 0a  NST char *buf, .
1b30: 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20    int toWrite,. 
1b40: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
1b50: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
1b60: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
1b70: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
1b80: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
1b90: 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f 57  int nWrite = toW
1ba0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  rite;        /* 
1bb0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1bc0: 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e  to write */.  in
1bd0: 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20  t nBlob;        
1be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
1bf0: 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
1c00: 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63  blob */.  int rc
1c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c20: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1c30: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a   error code */..
1c40: 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    nBlob = sqlite
1c50: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
1c60: 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70  pBlob);.  if( (p
1c70: 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29 3e  ->iSeek+nWrite)>
1c80: 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65 72  nBlob ){.    *er
1c90: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e  rorCodePtr = EIN
1ca0: 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  VAL;.    return 
1cb0: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 57  -1;.  }.  if( nW
1cc0: 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 72  rite<=0 ){.    r
1cd0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
1cf0: 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f 62  b_write(p->pBlob
1d00: 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e  , (void *)buf, n
1d10: 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b 29  Write, p->iSeek)
1d20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1d30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72  TE_OK ){.    *er
1d40: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f  rorCodePtr = EIO
1d50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
1d60: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b  .  }..  p->iSeek
1d70: 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72 65   += nWrite;.  re
1d80: 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a  turn nWrite;.}..
1d90: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69 6e  /*.** Seek an in
1da0: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1db0: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1dc0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 53 65  c int incrblobSe
1dd0: 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ek(.  ClientData
1de0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a   instanceData, .
1df0: 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20    long offset,. 
1e00: 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20   int seekMode,. 
1e10: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
1e20: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
1e30: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
1e40: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
1e50: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20  instanceData;.. 
1e60: 20 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64   switch( seekMod
1e70: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45  e ){.    case SE
1e80: 45 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d  EK_SET:.      p-
1e90: 3e 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b  >iSeek = offset;
1ea0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1eb0: 20 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a    case SEEK_CUR:
1ec0: 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20  .      p->iSeek 
1ed0: 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20  += offset;.     
1ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1ef0: 20 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20   SEEK_END:.     
1f00: 20 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69   p->iSeek = sqli
1f10: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
1f20: 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65  ->pBlob) + offse
1f30: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
1f40: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
1f50: 73 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d  sert(!"Bad seekM
1f60: 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ode");.  }..  re
1f70: 74 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d  turn p->iSeek;.}
1f80: 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  ...static void i
1f90: 6e 63 72 62 6c 6f 62 57 61 74 63 68 28 43 6c 69  ncrblobWatch(Cli
1fa0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
1fb0: 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  Data, int mode){
1fc0: 20 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20   .  /* NO-OP */ 
1fd0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  .}.static int in
1fe0: 63 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43 6c 69  crblobHandle(Cli
1ff0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2000: 44 61 74 61 2c 20 69 6e 74 20 64 69 72 2c 20 43  Data, int dir, C
2010: 6c 69 65 6e 74 44 61 74 61 20 2a 68 50 74 72 29  lientData *hPtr)
2020: 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  {.  return TCL_E
2030: 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RROR;.}..static 
2040: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20  Tcl_ChannelType 
2050: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54  IncrblobChannelT
2060: 79 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72 62  ype = {.  "incrb
2070: 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2090: 74 79 70 65 4e 61 6d 65 20 20 20 20 20 20 20 20  typeName        
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43 48       */.  TCL_CH
20c0: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c  ANNEL_VERSION_2,
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e0: 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20  version         
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2110: 6f 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  obClose,        
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2130: 63 6c 6f 73 65 50 72 6f 63 20 20 20 20 20 20 20  closeProc       
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2160: 6f 62 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20  obInput,        
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2180: 69 6e 70 75 74 50 72 6f 63 20 20 20 20 20 20 20  inputProc       
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
21b0: 6f 62 4f 75 74 70 75 74 2c 20 20 20 20 20 20 20  obOutput,       
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d0: 6f 75 74 70 75 74 50 72 6f 63 20 20 20 20 20 20  outputProc      
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2200: 6f 62 53 65 65 6b 2c 20 20 20 20 20 20 20 20 20  obSeek,         
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2220: 73 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20  seekProc        
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2270: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20  setOptionProc   
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22c0: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20  getOptionProc   
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
22f0: 6f 62 57 61 74 63 68 2c 20 20 20 20 20 20 20 20  obWatch,        
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2310: 77 61 74 63 68 50 72 6f 63 20 28 74 68 69 73 20  watchProc (this 
2320: 69 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20 20  is a no-op)     
2330: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2340: 6f 62 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20  obHandle,       
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2360: 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 28 61  getHandleProc (a
2370: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 65 72  lways returns er
2380: 72 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20 20  ror) */.  0,    
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b0: 63 6c 6f 73 65 32 50 72 6f 63 20 20 20 20 20 20  close2Proc      
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2400: 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20 20  blockModeProc   
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2450: 66 6c 75 73 68 50 72 6f 63 20 20 20 20 20 20 20  flushProc       
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 68 61 6e 64 6c 65 72 50 72 6f 63 20 20 20 20 20  handlerProc     
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24f0: 77 69 64 65 53 65 65 6b 50 72 6f 63 20 20 20 20  wideSeekProc    
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a       */.};../*.*
2520: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
2530: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  ncrblob channel.
2540: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2550: 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61  reateIncrblobCha
2560: 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74 65  nnel(.  Tcl_Inte
2570: 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 53  rp *interp, .  S
2580: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 0a 20  qliteDb *pDb, . 
2590: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
25a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
25b0: 7a 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e 73 74  zTable, .  const
25c0: 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20   char *zColumn, 
25d0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
25e0: 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73 52 65  iRow,.  int isRe
25f0: 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e 63 72  adonly.){.  Incr
2600: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a  blobChannel *p;.
2610: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2620: 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74  pDb->db;.  sqlit
2630: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a  e3_blob *pBlob;.
2640: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2650: 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45 41 44  flags = TCL_READ
2660: 41 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e 6c 79  ABLE|(isReadonly
2670: 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49 54 41   ? 0 : TCL_WRITA
2680: 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  BLE);..  /* This
2690: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
26a0: 64 20 74 6f 20 6e 61 6d 65 20 74 68 65 20 63 68  d to name the ch
26b0: 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62 6c 6f  annels: "incrblo
26c0: 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d 22 20  b_[incr count]" 
26d0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  */.  static int 
26e0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61  count = 0;.  cha
26f0: 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a  r zChannel[64];.
2700: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2710: 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 7a 44  blob_open(db, zD
2720: 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75  b, zTable, zColu
2730: 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52 65 61  mn, iRow, !isRea
2740: 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29 3b 0a  donly, &pBlob);.
2750: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2760: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
2770: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
2780: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2790: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
27a0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
27b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
27c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 20  ERROR;.  }..  p 
27d0: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
27e0: 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73  el *)Tcl_Alloc(s
27f0: 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43 68  izeof(IncrblobCh
2800: 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69 53  annel));.  p->iS
2810: 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 42  eek = 0;.  p->pB
2820: 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20  lob = pBlob;..  
2830: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2840: 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e 65 6c  (sizeof(zChannel
2850: 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22 69 6e  ), zChannel, "in
2860: 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f  crblob_%d", ++co
2870: 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e  unt);.  p->chann
2880: 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43  el = Tcl_CreateC
2890: 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f 62  hannel(&Incrblob
28a0: 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43 68  ChannelType, zCh
28b0: 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73 29  annel, p, flags)
28c0: 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65 72  ;.  Tcl_Register
28d0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
28e0: 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20  p->channel);..  
28f0: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
2900: 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74 68 65  channel into the
2910: 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62   SqliteDb.pIncrb
2920: 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70  lob list. */.  p
2930: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
2940: 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70  Incrblob;.  p->p
2950: 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  Prev = 0;.  if( 
2960: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
2970: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
2980: 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e  = p;.  }.  pDb->
2990: 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b 0a 20  pIncrblob = p;. 
29a0: 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 0a   p->pDb = pDb;..
29b0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
29c0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
29d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
29e0: 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20  me(p->channel), 
29f0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
2a00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2a10: 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c 73 65  }.#else  /* else
2a20: 20 63 6c 61 75 73 65 20 66 6f 72 20 22 23 69 66   clause for "#if
2a30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a40: 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a 20 20  _INCRBLOB" */.  
2a50: 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 49 6e 63  #define closeInc
2a60: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44  rblobChannels(pD
2a70: 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  b).#endif../*.**
2a80: 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72   Look at the scr
2a90: 69 70 74 20 70 72 65 66 69 78 20 69 6e 20 70 43  ipt prefix in pC
2aa0: 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20  md.  We will be 
2ab0: 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 73  executing this s
2ac0: 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66  cript.** after f
2ad0: 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f  irst appending o
2ae0: 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ne or more argum
2af0: 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74  ents.  This rout
2b00: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20  ine analyzes.** 
2b10: 74 68 65 20 73 63 72 69 70 74 20 74 6f 20 73 65  the script to se
2b20: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
2b30: 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f  to use Tcl_EvalO
2b40: 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72  bjv() on the scr
2b50: 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ipt.** rather th
2b60: 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  an the more gene
2b70: 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29  ral Tcl_EvalEx()
2b80: 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  .  Tcl_EvalObjv(
2b90: 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73  ) is much.** fas
2ba0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70  ter..**.** Scrip
2bb0: 74 73 20 74 68 61 74 20 61 72 65 20 73 61 66 65  ts that are safe
2bc0: 20 74 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c   to use with Tcl
2bd0: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73  _EvalObjv() cons
2be0: 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d  ists of a.** com
2bf0: 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77  mand name follow
2c00: 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f  ed by zero or mo
2c10: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74  re arguments wit
2c20: 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a  h no [...] or $.
2c30: 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b  ** or {...} or ;
2c40: 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77   to be seen anyw
2c50: 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c  here.  Most call
2c60: 62 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e  back scripts con
2c70: 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20  sist.** of just 
2c80: 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75  a single procedu
2c90: 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79  re name and they
2ca0: 20 6d 65 65 74 20 74 68 69 73 20 72 65 71 75 69   meet this requi
2cb0: 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  rement..*/.stati
2cc0: 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45  c int safeToUseE
2cd0: 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65  valObjv(Tcl_Inte
2ce0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f  rp *interp, Tcl_
2cf0: 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a  Obj *pCmd){.  /*
2d00: 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f   We could try to
2d10: 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   do something wi
2d20: 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20  th Tcl_Parse(). 
2d30: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73   But we will ins
2d40: 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64  tead.  ** just d
2d50: 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 66  o a search for f
2d60: 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61 63 74  orbidden charact
2d70: 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20  ers.  If any of 
2d80: 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20  the forbidden.  
2d90: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 70  ** characters ap
2da0: 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65  pear in pCmd, we
2db0: 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65   will report the
2dc0: 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66   string as unsaf
2dd0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  e..  */.  const 
2de0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
2df0: 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53  ;.  z = Tcl_GetS
2e00: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d  tringFromObj(pCm
2e10: 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28  d, &n);.  while(
2e20: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
2e30: 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a  int c = *(z++);.
2e40: 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c      if( c=='$' |
2e50: 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27  | c=='[' || c=='
2e60: 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ;' ) return 0;. 
2e70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
2e80: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20  ../*.** Find an 
2e90: 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72  SqlFunc structur
2ea0: 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  e with the given
2eb0: 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74   name.  Or creat
2ec0: 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69  e a new.** one i
2ed0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e  f an existing on
2ee0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
2ef0: 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  d.  Return a poi
2f00: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  nter to the.** s
2f10: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2f20: 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e  tic SqlFunc *fin
2f30: 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44  dSqlFunc(SqliteD
2f40: 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68  b *pDb, const ch
2f50: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71  ar *zName){.  Sq
2f60: 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b  lFunc *p, *pNew;
2f70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77  .  int i;.  pNew
2f80: 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c   = (SqlFunc*)Tcl
2f90: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
2fa0: 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e 28 7a  pNew) + strlen(z
2fb0: 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70  Name) + 1 );.  p
2fc0: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  New->zName = (ch
2fd0: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
2fe0: 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69  for(i=0; zName[i
2ff0: 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a  ]; i++){ pNew->z
3000: 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65  Name[i] = tolowe
3010: 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20  r(zName[i]); }. 
3020: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20   pNew->zName[i] 
3030: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62  = 0;.  for(p=pDb
3040: 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d  ->pFunc; p; p=p-
3050: 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66  >pNext){ .    if
3060: 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d  ( strcmp(p->zNam
3070: 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d  e, pNew->zName)=
3080: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
3090: 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77  Free((char*)pNew
30a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
30b0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  p;.    }.  }.  p
30c0: 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44  New->interp = pD
30d0: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65  b->interp;.  pNe
30e0: 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a  w->pScript = 0;.
30f0: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
3100: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44  pDb->pFunc;.  pD
3110: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b  b->pFunc = pNew;
3120: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3130: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a  }../*.** Finaliz
3140: 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73  e and free a lis
3150: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
3160: 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  atements.*/.stat
3170: 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d  ic void flushStm
3180: 74 43 61 63 68 65 28 20 53 71 6c 69 74 65 44 62  tCache( SqliteDb
3190: 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72   *pDb ){.  SqlPr
31a0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
31b0: 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20  Stmt;..  while( 
31c0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29   pDb->stmtList )
31d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
31e0: 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d  nalize( pDb->stm
31f0: 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  tList->pStmt );.
3200: 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70      pPreStmt = p
3210: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20  Db->stmtList;.  
3220: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
3230: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d  = pDb->stmtList-
3240: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f  >pNext;.    Tcl_
3250: 46 72 65 65 28 20 28 63 68 61 72 2a 29 70 50 72  Free( (char*)pPr
3260: 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70  eStmt );.  }.  p
3270: 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  Db->nStmt = 0;. 
3280: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
3290: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c   0;.}../*.** TCL
32a0: 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63   calls this proc
32b0: 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71  edure when an sq
32c0: 6c 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63  lite3 database c
32d0: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c  ommand is.** del
32e0: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
32f0: 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64  void DbDeleteCmd
3300: 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71  (void *db){.  Sq
3310: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3320: 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66  qliteDb*)db;.  f
3330: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44  lushStmtCache(pD
3340: 62 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62  b);.  closeIncrb
3350: 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29  lobChannels(pDb)
3360: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ;.  sqlite3_clos
3370: 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68  e(pDb->db);.  wh
3380: 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20  ile( pDb->pFunc 
3390: 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a  ){.    SqlFunc *
33a0: 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75  pFunc = pDb->pFu
33b0: 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75  nc;.    pDb->pFu
33c0: 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78  nc = pFunc->pNex
33d0: 74 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  t;.    Tcl_DecrR
33e0: 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70  efCount(pFunc->p
33f0: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c  Script);.    Tcl
3400: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75  _Free((char*)pFu
3410: 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  nc);.  }.  while
3420: 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20  ( pDb->pCollate 
3430: 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74  ){.    SqlCollat
3440: 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44  e *pCollate = pD
3450: 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  b->pCollate;.   
3460: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
3470: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
3480: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
3490: 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b  char*)pCollate);
34a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
34b0: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c  zBusy ){.    Tcl
34c0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79  _Free(pDb->zBusy
34d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
34e0: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
34f0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54  Tcl_Free(pDb->zT
3500: 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  race);.  }.  if(
3510: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
3520: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
3530: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  Db->zProfile);. 
3540: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41   }.  if( pDb->zA
3550: 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  uth ){.    Tcl_F
3560: 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b  ree(pDb->zAuth);
3570: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3580: 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c  zNull ){.    Tcl
3590: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c  _Free(pDb->zNull
35a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
35b0: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b  ->pUpdateHook ){
35c0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
35d0: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61  Count(pDb->pUpda
35e0: 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  teHook);.  }.  i
35f0: 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  f( pDb->pRollbac
3600: 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  kHook ){.    Tcl
3610: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
3620: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
3630: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3640: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
3650: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
3660: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
3670: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
3680: 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63   }.  Tcl_Free((c
3690: 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a  har*)pDb);.}../*
36a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36b0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
36c0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
36d0: 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20  is locked while 
36e0: 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65  trying.** to exe
36f0: 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61  cute SQL..*/.sta
3700: 74 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61  tic int DbBusyHa
3710: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
3720: 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53  int nTries){.  S
3730: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3740: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
3750: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
3760: 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69  Val[30];..  sqli
3770: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
3780: 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c  eof(zVal), zVal,
3790: 20 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a   "%d", nTries);.
37a0: 20 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76    rc = Tcl_VarEv
37b0: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
37c0: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c  pDb->zBusy, " ",
37d0: 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29   zVal, (char*)0)
37e0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
37f0: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
3800: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
3810: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
3820: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3830: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
3840: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3850: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
3860: 73 20 74 68 65 20 27 70 72 6f 67 72 65 73 73 20  s the 'progress 
3870: 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68  callback' for th
3880: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
3890: 74 61 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67  tatic int DbProg
38a0: 72 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64  ressHandler(void
38b0: 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44   *cd){.  SqliteD
38c0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
38d0: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
38e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ;..  assert( pDb
38f0: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20  ->zProgress );. 
3900: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
3910: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
3920: 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69  >zProgress);.  i
3930: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
3940: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
3950: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
3960: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
3970: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
3980: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
3990: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
39a0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  TRACE./*.** This
39b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
39c0: 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ed by the SQLite
39d0: 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77   trace handler w
39e0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a  henever a new.**
39f0: 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73   block of SQL is
3a00: 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
3a10: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
3a20: 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65  b->zTrace is exe
3a30: 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cuted..*/.static
3a40: 20 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e   void DbTraceHan
3a50: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63  dler(void *cd, c
3a60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
3a70: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3a80: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
3a90: 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  d;.  Tcl_DString
3aa0: 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74   str;..  Tcl_DSt
3ab0: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
3ac0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
3ad0: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
3ae0: 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63  Trace, -1);.  Tc
3af0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
3b00: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71  lement(&str, zSq
3b10: 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70  l);.  Tcl_Eval(p
3b20: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
3b30: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
3b40: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
3b50: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
3b60: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
3b70: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a  pDb->interp);.}.
3b80: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
3b90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
3ba0: 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
3bb0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
3bc0: 79 20 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f  y the SQLite pro
3bd0: 66 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74  file handler aft
3be0: 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  er a statement.*
3bf0: 2a 20 53 51 4c 20 68 61 73 20 65 78 65 63 75 74  * SQL has execut
3c00: 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72  ed.  The TCL scr
3c10: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f  ipt in pDb->zPro
3c20: 66 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65  file is evaluate
3c30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3c40: 64 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c  d DbProfileHandl
3c50: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e  er(void *cd, con
3c60: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73  st char *zSql, s
3c70: 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29  qlite_uint64 tm)
3c80: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3c90: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
3ca0: 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  d;.  Tcl_DString
3cb0: 20 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d   str;.  char zTm
3cc0: 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  [100];..  sqlite
3cd0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
3ce0: 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22  f(zTm)-1, zTm, "
3cf0: 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63  %lld", tm);.  Tc
3d00: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
3d10: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
3d20: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
3d30: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31  Db->zProfile, -1
3d40: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3d50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
3d60: 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c  tr, zSql);.  Tcl
3d70: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
3d80: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29  ement(&str, zTm)
3d90: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  ;.  Tcl_Eval(pDb
3da0: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
3db0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
3dc0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3dd0: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63  Free(&str);.  Tc
3de0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44  l_ResetResult(pD
3df0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65  b->interp);.}.#e
3e00: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
3e10: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
3e20: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
3e30: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
3e40: 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20  ed.  The.** TCL 
3e50: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
3e60: 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74  Commit is execut
3e70: 65 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72  ed.  If it retur
3e80: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a  ns non-zero or.*
3e90: 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61  * if it throws a
3ea0: 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65  n exception, the
3eb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
3ec0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74  rolled back inst
3ed0: 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20  ead.** of being 
3ee0: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74  committed..*/.st
3ef0: 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69  atic int DbCommi
3f00: 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  tHandler(void *c
3f10: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
3f20: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3f30: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
3f40: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28    rc = Tcl_Eval(
3f50: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
3f60: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66  ->zCommit);.  if
3f70: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc!=TCL_OK || 
3f80: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
3f90: 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  ngResult(pDb->in
3fa0: 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65  terp)) ){.    re
3fb0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
3fc0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
3fd0: 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63  c void DbRollbac
3fe0: 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  kHandler(void *c
3ff0: 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71  lientData){.  Sq
4000: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4010: 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44  qliteDb*)clientD
4020: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44  ata;.  assert(pD
4030: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
4040: 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  );.  if( TCL_OK!
4050: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
4060: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
4070: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20  >pRollbackHook, 
4080: 30 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  0) ){.    Tcl_Ba
4090: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44  ckgroundError(pD
40a0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  b->interp);.  }.
40b0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  }..static void D
40c0: 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a  bUpdateHandler(.
40d0: 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e    void *p, .  in
40e0: 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  t op,.  const ch
40f0: 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73  ar *zDb, .  cons
4100: 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20  t char *zTbl, . 
4110: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f   sqlite_int64 ro
4120: 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  wid.){.  SqliteD
4130: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4140: 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62  Db *)p;.  Tcl_Ob
4150: 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65  j *pCmd;..  asse
4160: 72 74 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65  rt( pDb->pUpdate
4170: 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74  Hook );.  assert
4180: 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53  ( op==SQLITE_INS
4190: 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54  ERT || op==SQLIT
41a0: 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d  E_UPDATE || op==
41b0: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b  SQLITE_DELETE );
41c0: 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44  ..  pCmd = Tcl_D
41d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
41e0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  >pUpdateHook);. 
41f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4200: 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c  t(pCmd);.  Tcl_L
4210: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4220: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
4230: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20  _NewStringObj(. 
4240: 20 20 20 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45     ( (op==SQLITE
4250: 5f 49 4e 53 45 52 54 29 3f 22 49 4e 53 45 52 54  _INSERT)?"INSERT
4260: 22 3a 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  ":(op==SQLITE_UP
4270: 44 41 54 45 29 3f 22 55 50 44 41 54 45 22 3a 22  DATE)?"UPDATE":"
4280: 44 45 4c 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a  DELETE"), -1));.
4290: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
42a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
42b0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
42c0: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
42d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
42e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
42f0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
4300: 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b  gObj(zTbl, -1));
4310: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4320: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4330: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  Cmd, Tcl_NewWide
4340: 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a  IntObj(rowid));.
4350: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
4360: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  pDb->interp, pCm
4370: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
4380: 43 54 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  CT);.}..static v
4390: 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65  oid tclCollateNe
43a0: 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 43  eded(.  void *pC
43b0: 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  tx,.  sqlite3 *d
43c0: 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  b,.  int enc,.  
43d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
43e0: 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  e.){.  SqliteDb 
43f0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
4400: 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f   *)pCtx;.  Tcl_O
4410: 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63  bj *pScript = Tc
4420: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
4430: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
4440: 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  ed);.  Tcl_IncrR
4450: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
4460: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
4470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
4480: 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77  pScript, Tcl_New
4490: 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c  StringObj(zName,
44a0: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
44b0: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
44c0: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
44d0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
44e0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a  unt(pScript);.}.
44f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4500: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
4510: 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c   evaluate an SQL
4520: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
4530: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  ion implemented.
4540: 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72  ** using TCL scr
4550: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ipt..*/.static i
4560: 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65  nt tclSqlCollate
4570: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
4580: 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73    int nA,.  cons
4590: 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e  t void *zA,.  in
45a0: 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  t nB,.  const vo
45b0: 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43  id *zB.){.  SqlC
45c0: 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53 71 6c  ollate *p = (Sql
45d0: 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a  Collate *)pCtx;.
45e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
45f0: 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e  ..  pCmd = Tcl_N
4600: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a  ewStringObj(p->z
4610: 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54  Script, -1);.  T
4620: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4630: 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  pCmd);.  Tcl_Lis
4640: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4650: 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  t(p->interp, pCm
4660: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
4670: 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20  Obj(zA, nA));.  
4680: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4690: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
46a0: 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  rp, pCmd, Tcl_Ne
46b0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e  wStringObj(zB, n
46c0: 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  B));.  Tcl_EvalO
46d0: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
46e0: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
46f0: 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65  IRECT);.  Tcl_De
4700: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
4710: 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69  ;.  return (atoi
4720: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
4730: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29  sult(p->interp))
4740: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
4750: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4760: 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  ed to evaluate a
4770: 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69  n SQL function i
4780: 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73  mplemented.** us
4790: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a  ing TCL script..
47a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
47b0: 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65  clSqlFunc(sqlite
47c0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
47d0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
47e0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67  lite3_value**arg
47f0: 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70  v){.  SqlFunc *p
4800: 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
4810: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20  data(context);. 
4820: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
4830: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4840: 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  c;..  if( argc==
4850: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
4860: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75  here are no argu
4870: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
4880: 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f  ction, call Tcl_
4890: 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65  EvalObjEx on the
48a0: 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f  .    ** script o
48b0: 62 6a 65 63 74 20 64 69 72 65 63 74 6c 79 2e 20  bject directly. 
48c0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
48d0: 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f   TCL compiler to
48e0: 20 67 65 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a   generate.    **
48f0: 20 62 79 74 65 63 6f 64 65 20 66 6f 72 20 74 68   bytecode for th
4900: 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65  e command on the
4910: 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f   first invocatio
4920: 6e 20 61 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a  n and thus make.
4930: 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e      ** subsequen
4940: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75  t invocations mu
4950: 63 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20  ch faster. */.  
4960: 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72    pCmd = p->pScr
4970: 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  ipt;.    Tcl_Inc
4980: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4990: 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  .    rc = Tcl_Ev
49a0: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
49b0: 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20  p, pCmd, 0);.   
49c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
49d0: 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65  t(pCmd);.  }else
49e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
49f0: 65 20 61 72 65 20 61 72 67 75 6d 65 6e 74 73 20  e are arguments 
4a00: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  to the function,
4a10: 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20   make a shallow 
4a20: 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20  copy of the.    
4a30: 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74  ** script object
4a40: 2c 20 6c 61 70 70 65 6e 64 20 74 68 65 20 61 72  , lappend the ar
4a50: 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65 76  guments, then ev
4a60: 61 6c 75 61 74 65 20 74 68 65 20 63 6f 70 79 2e  aluate the copy.
4a70: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42  .    **.    ** B
4a80: 79 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79  y "shallow" copy
4a90: 2c 20 77 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79  , we mean a only
4aa0: 20 74 68 65 20 6f 75 74 65 72 20 6c 69 73 74 20   the outer list 
4ab0: 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69  Tcl_Obj is dupli
4ac0: 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68  cated..    ** Th
4ad0: 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f  e new Tcl_Obj co
4ae0: 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
4af0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
4b00: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  list elements. .
4b10: 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c      ** That way,
4b20: 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62   when Tcl_EvalOb
4b30: 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e 64 20  jv() is run and 
4b40: 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66 69 72  shimmers the fir
4b50: 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a  st element.    *
4b60: 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20 74 6f  * of the list to
4b70: 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c   tclCmdNameType,
4b80: 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74 65 20   that alternate 
4b90: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77  representation w
4ba0: 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 72  ill.    ** be pr
4bb0: 65 73 65 72 76 65 64 20 61 6e 64 20 72 65 75 73  eserved and reus
4bc0: 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69  ed on the next i
4bd0: 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  nvocation..    *
4be0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
4bf0: 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41  aArg;.    int nA
4c00: 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  rg;.    if( Tcl_
4c10: 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e  ListObjGetElemen
4c20: 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d  ts(p->interp, p-
4c30: 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72 67 2c  >pScript, &nArg,
4c40: 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20 20 20   &aArg) ){.     
4c50: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4c60: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
4c70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4c80: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
4c90: 31 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72  1); .      retur
4ca0: 6e 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a 20 20  n;.    }     .  
4cb0: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77    pCmd = Tcl_New
4cc0: 4c 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41  ListObj(nArg, aA
4cd0: 72 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  rg);.    Tcl_Inc
4ce0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4cf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4d00: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
4d10: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4d20: 2a 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  *pIn = argv[i];.
4d30: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
4d40: 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Val;.           
4d50: 20 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70   .      /* Set p
4d60: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
4d70: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
4d80: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
4d90: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
4da0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
4db0: 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pIn) ){.        
4dc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
4dd0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
4de0: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
4df0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
4e00: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
4e10: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  al = Tcl_NewByte
4e20: 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33  ArrayObj(sqlite3
4e30: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29  _value_blob(pIn)
4e40: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
4e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4e60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
4e70: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
4e80: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  : {.          sq
4e90: 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73  lite_int64 v = s
4ea0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
4eb0: 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  64(pIn);.       
4ec0: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
4ed0: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
4ee0: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
4ef0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
4f00: 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  _NewIntObj(v);. 
4f10: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
4f30: 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
4f40: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20  tObj(v);.       
4f50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
4f60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4f70: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4f80: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
4f90: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
4fa0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4fb0: 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20  double(pIn);.   
4fc0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
4fd0: 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
4fe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
4ff0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5000: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
5010: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
5020: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5030: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20  ewStringObj("", 
5040: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
5050: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5060: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
5070: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
5080: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
5090: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29  value_bytes(pIn)
50a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
50b0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
50c0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
50d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
50e0: 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  In), bytes);.   
50f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5110: 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c        rc = Tcl_L
5120: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5130: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
5140: 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  Cmd, pVal);.    
5150: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
5160: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
5170: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5180: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5190: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
51a0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
51b0: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
51c0: 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20  , -1); .        
51d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
51e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
51f0: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b  ->useEvalObjv ){
5200: 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76  .      /* Tcl_Ev
5210: 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61  alObjEx() will a
5220: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c  utomatically cal
5230: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  l Tcl_EvalObjv()
5240: 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a   if pCmd.      *
5250: 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68  * is a list with
5260: 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70  out a string rep
5270: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f  resentation.  To
5280: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
5290: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70  om.      ** happ
52a0: 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65  ening, make sure
52b0: 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69   pCmd has a vali
52c0: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
52d0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
52e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
52f0: 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cmd);.    }.    
5300: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
5310: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
5320: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
5330: 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ECT);.    Tcl_De
5340: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5350: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
5360: 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52  && rc!=TCL_RETUR
5370: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
5380: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
5390: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
53a0: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
53b0: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d  terp), -1); .  }
53c0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  else{.    Tcl_Ob
53d0: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
53e0: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
53f0: 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e  terp);.    int n
5400: 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a  ;.    u8 *data;.
5410: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20      char *zType 
5420: 3d 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20  = pVar->typePtr 
5430: 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d  ? pVar->typePtr-
5440: 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20  >name : "";.    
5450: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
5460: 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62  ];.    if( c=='b
5470: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
5480: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
5490: 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73  0 && pVar->bytes
54a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
54b0: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c  Only return a BL
54c0: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
54d0: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
54e0: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
54f0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73       ** has no s
5500: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
5510: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64  tion. */.      d
5520: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
5530: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
5540: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
5550: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
5560: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61  ob(context, data
5570: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
5580: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
5590: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
55a0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
55b0: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
55c0: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
55d0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
55e0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
55f0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
5600: 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  text, n);.    }e
5610: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
5620: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
5630: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
5640: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
5650: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
5660: 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  leFromObj(0, pVa
5670: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r, &r);.      sq
5680: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
5690: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  ble(context, r);
56a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
56b0: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
56c0: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
56d0: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
56e0: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
56f0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
5700: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54  )==0) ){.      T
5710: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
5720: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
5730: 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  ntFromObj(0, pVa
5740: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71  r, &v);.      sq
5750: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5760: 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a  64(context, v);.
5770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5780: 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65   data = (unsigne
5790: 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  d char *)Tcl_Get
57a0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56  StringFromObj(pV
57b0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
57c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
57d0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
57e0: 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c  r *)data, n, SQL
57f0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5800: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
5810: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5820: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
5830: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
5840: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
5850: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70  function.  It ap
5860: 70 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e  pends the authen
5870: 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65  tication.** type
5880: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77   code and the tw
5890: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a  o arguments to z
58a0: 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b  Cmd[] then invok
58b0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
58c0: 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   on the interpre
58d0: 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20  ter.  The reply 
58e0: 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64  is examined to d
58f0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a  etermine if the.
5900: 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ** authenticatio
5910: 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65  n fails or succe
5920: 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eds..*/.static i
5930: 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  nt auth_callback
5940: 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  (.  void *pArg,.
5950: 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f    int code,.  co
5960: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c  nst char *zArg1,
5970: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5980: 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg2,.  const ch
5990: 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e  ar *zArg3,.  con
59a0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29  st char *zArg4.)
59b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
59c0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
59d0: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
59e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70  const char *zRep
59f0: 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  ly;.  SqliteDb *
5a00: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
5a10: 29 70 41 72 67 3b 0a 0a 20 20 73 77 69 74 63 68  )pArg;..  switch
5a20: 28 20 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  ( code ){.    ca
5a30: 73 65 20 53 51 4c 49 54 45 5f 43 4f 50 59 20 20  se SQLITE_COPY  
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
5a50: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59  ode="SQLITE_COPY
5a60: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5a70: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
5a80: 5f 49 4e 44 45 58 20 20 20 20 20 20 3a 20 7a 43  _INDEX      : zC
5a90: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5aa0: 54 45 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  TE_INDEX"; break
5ab0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5ac0: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 20 20  E_CREATE_TABLE  
5ad0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5ae0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5af0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5b00: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
5b10: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43  _TEMP_INDEX : zC
5b20: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5b30: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20  TE_TEMP_INDEX"; 
5b40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5b50: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5b60: 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65  MP_TABLE : zCode
5b70: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5b80: 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  TEMP_TABLE"; bre
5b90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5ba0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5bb0: 54 52 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22  TRIGGER: zCode="
5bc0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5bd0: 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  MP_TRIGGER"; bre
5be0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5bf0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5c00: 56 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53  VIEW  : zCode="S
5c10: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5c20: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
5c30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5c40: 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 20 20  CREATE_TRIGGER  
5c50: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
5c60: 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52  E_CREATE_TRIGGER
5c70: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5c80: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
5c90: 5f 56 49 45 57 20 20 20 20 20 20 20 3a 20 7a 43  _VIEW       : zC
5ca0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5cb0: 54 45 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  TE_VIEW"; break;
5cc0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5cd0: 5f 44 45 4c 45 54 45 20 20 20 20 20 20 20 20 20  _DELETE         
5ce0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5cf0: 54 45 5f 44 45 4c 45 54 45 22 3b 20 62 72 65 61  TE_DELETE"; brea
5d00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5d10: 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20 20  TE_DROP_INDEX   
5d20: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5d30: 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22  LITE_DROP_INDEX"
5d40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5d50: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  e SQLITE_DROP_TA
5d60: 42 4c 45 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  BLE        : zCo
5d70: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
5d80: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
5d90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
5da0: 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20  ROP_TEMP_INDEX  
5db0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5dc0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
5dd0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5de0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
5df0: 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43  EMP_TABLE   : zC
5e00: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
5e10: 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72  _TEMP_TABLE"; br
5e20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5e30: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
5e40: 52 49 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22  RIGGER : zCode="
5e50: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
5e60: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
5e70: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5e80: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
5e90: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5ea0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
5eb0: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
5ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5ed0: 5f 54 52 49 47 47 45 52 20 20 20 20 20 20 3a 20  _TRIGGER      : 
5ee0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5ef0: 4f 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  OP_TRIGGER"; bre
5f00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5f10: 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 20 20 20  ITE_DROP_VIEW   
5f20: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5f30: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 22  QLITE_DROP_VIEW"
5f40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5f50: 65 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  e SQLITE_INSERT 
5f60: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
5f70: 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45 52  de="SQLITE_INSER
5f80: 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
5f90: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d  ase SQLITE_PRAGM
5fa0: 41 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  A            : z
5fb0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50 52 41  Code="SQLITE_PRA
5fc0: 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GMA"; break;.   
5fd0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
5fe0: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a  D              :
5ff0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52   zCode="SQLITE_R
6000: 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  EAD"; break;.   
6010: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c   case SQLITE_SEL
6020: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 3a  ECT            :
6030: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53   zCode="SQLITE_S
6040: 45 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20  ELECT"; break;. 
6050: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
6060: 52 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20  RANSACTION      
6070: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6080: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62  _TRANSACTION"; b
6090: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
60a0: 51 4c 49 54 45 5f 55 50 44 41 54 45 20 20 20 20  QLITE_UPDATE    
60b0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
60c0: 22 53 51 4c 49 54 45 5f 55 50 44 41 54 45 22 3b  "SQLITE_UPDATE";
60d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
60e0: 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20 20   SQLITE_ATTACH  
60f0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6100: 65 3d 22 53 51 4c 49 54 45 5f 41 54 54 41 43 48  e="SQLITE_ATTACH
6110: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6120: 73 65 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48  se SQLITE_DETACH
6130: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6140: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 54 41  ode="SQLITE_DETA
6150: 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CH"; break;.    
6160: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4c 54 45  case SQLITE_ALTE
6170: 52 5f 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20  R_TABLE       : 
6180: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c  zCode="SQLITE_AL
6190: 54 45 52 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  TER_TABLE"; brea
61a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
61b0: 54 45 5f 52 45 49 4e 44 45 58 20 20 20 20 20 20  TE_REINDEX      
61c0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
61d0: 4c 49 54 45 5f 52 45 49 4e 44 45 58 22 3b 20 62  LITE_REINDEX"; b
61e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
61f0: 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20  QLITE_ANALYZE   
6200: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6210: 22 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22  "SQLITE_ANALYZE"
6220: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6230: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6240: 56 54 41 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f  VTABLE     : zCo
6250: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6260: 45 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  E_VTABLE"; break
6270: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6280: 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 20 20 20  E_DROP_VTABLE   
6290: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
62a0: 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22  ITE_DROP_VTABLE"
62b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
62c0: 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f  e SQLITE_FUNCTIO
62d0: 4e 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  N          : zCo
62e0: 64 65 3d 22 53 51 4c 49 54 45 5f 46 55 4e 43 54  de="SQLITE_FUNCT
62f0: 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ION"; break;.   
6300: 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20   default        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
6320: 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62   zCode="????"; b
6330: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  reak;.  }.  Tcl_
6340: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
6350: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
6360: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
6370: 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20  ->zAuth, -1);.  
6380: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
6390: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
63a0: 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74  Code);.  Tcl_DSt
63b0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
63c0: 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20  t(&str, zArg1 ? 
63d0: 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54  zArg1 : "");.  T
63e0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
63f0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
6400: 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22  rg2 ? zArg2 : ""
6410: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
6420: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
6430: 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67  tr, zArg3 ? zArg
6440: 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  3 : "");.  Tcl_D
6450: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
6460: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20  ent(&str, zArg4 
6470: 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20  ? zArg4 : "");. 
6480: 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c   rc = Tcl_Global
6490: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
64a0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
64b0: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
64c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
64d0: 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54  r);.  zReply = T
64e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
64f0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
6500: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  .  if( strcmp(zR
6510: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22  eply,"SQLITE_OK"
6520: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
6530: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
6540: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6550: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45  Reply,"SQLITE_DE
6560: 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  NY")==0 ){.    r
6570: 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b  c = SQLITE_DENY;
6580: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6590: 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49  cmp(zReply,"SQLI
65a0: 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29  TE_IGNORE")==0 )
65b0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
65c0: 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73  E_IGNORE;.  }els
65d0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b  e{.    rc = 999;
65e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
65f0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6600: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
6610: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  IZATION */../*.*
6620: 2a 20 7a 54 65 78 74 20 69 73 20 61 20 70 6f 69  * zText is a poi
6630: 6e 74 65 72 20 74 6f 20 74 65 78 74 20 6f 62 74  nter to text obt
6640: 61 69 6e 65 64 20 76 69 61 20 61 6e 20 73 71 6c  ained via an sql
6650: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
6660: 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72  ().** or similar
6670: 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69 73   interface. This
6680: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
6690: 20 61 20 54 63 6c 20 73 74 72 69 6e 67 20 6f 62   a Tcl string ob
66a0: 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65  ject, .** refere
66b0: 6e 63 65 20 63 6f 75 6e 74 20 73 65 74 20 74 6f  nce count set to
66c0: 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   0, containing t
66d0: 68 65 20 74 65 78 74 2e 20 49 66 20 61 20 74 72  he text. If a tr
66e0: 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74  anslation.** bet
66f0: 77 65 65 6e 20 69 73 6f 38 38 35 39 20 61 6e 64  ween iso8859 and
6700: 20 55 54 46 2d 38 20 69 73 20 72 65 71 75 69 72   UTF-8 is requir
6710: 65 64 2c 20 69 74 20 69 73 20 70 72 65 66 6f 72  ed, it is prefor
6720: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  med..*/.static T
6730: 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f  cl_Obj *dbTextTo
6740: 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73 74 20 2a  Obj(char const *
6750: 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62  zText){.  Tcl_Ob
6760: 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66 20  j *pVal;.#ifdef 
6770: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
6780: 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f 44 53 74  NEEDED.  Tcl_DSt
6790: 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c  ring dCol;.  Tcl
67a0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 43  _DStringInit(&dC
67b0: 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72  ol);.  Tcl_Exter
67c0: 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28  nalToUtfDString(
67d0: 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  NULL, zText, -1,
67e0: 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20   &dCol);.  pVal 
67f0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
6800: 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  bj(Tcl_DStringVa
6810: 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b  lue(&dCol), -1);
6820: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
6830: 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65  ee(&dCol);.#else
6840: 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65  .  pVal = Tcl_Ne
6850: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74  wStringObj(zText
6860: 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
6870: 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a  return pVal;.}..
6880: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6890: 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20  ne reads a line 
68a0: 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c  of text from FIL
68b0: 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20  E in, stores.** 
68c0: 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f  the text in memo
68d0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
68e0: 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65   malloc() and re
68f0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
6900: 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20  ** to the text. 
6910: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
6920: 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65  d at end of file
6930: 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29  , or if malloc()
6940: 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  .** fails..**.**
6950: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
6960: 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e 65  s like "readline
6970: 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64  " but no command
6980: 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a  -line editing.**
6990: 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
69a0: 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68 65 6c  copied from shel
69b0: 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72  l.c from '.impor
69c0: 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74  t' command.*/.st
69d0: 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c  atic char *local
69e0: 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a  _getline(char *z
69f0: 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e  Prompt, FILE *in
6a00: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  ){.  char *zLine
6a10: 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20  ;.  int nLine;. 
6a20: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f   int n;.  int eo
6a30: 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30  l;..  nLine = 10
6a40: 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c  0;.  zLine = mal
6a50: 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20  loc( nLine );.  
6a60: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
6a70: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30  eturn 0;.  n = 0
6a80: 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77  ;.  eol = 0;.  w
6a90: 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20  hile( !eol ){.  
6aa0: 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e    if( n+100>nLin
6ab0: 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  e ){.      nLine
6ac0: 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30   = nLine*2 + 100
6ad0: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20  ;.      zLine = 
6ae0: 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e  realloc(zLine, n
6af0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
6b00: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
6b10: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
6b20: 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65  if( fgets(&zLine
6b30: 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20  [n], nLine - n, 
6b40: 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  in)==0 ){.      
6b50: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
6b60: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
6b70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6b80: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
6b90: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
6ba0: 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20       eol = 1;.  
6bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6bc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  .    while( zLin
6bd0: 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  e[n] ){ n++; }. 
6be0: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
6bf0: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29  ine[n-1]=='\n' )
6c00: 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  {.      n--;.   
6c10: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
6c20: 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a  .      eol = 1;.
6c30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e      }.  }.  zLin
6c40: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69  e = realloc( zLi
6c50: 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74  ne, n+1 );.  ret
6c60: 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f  urn zLine;.}.../
6c70: 2a 0a 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20  *.** Figure out 
6c80: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
6c90: 20 66 6f 72 20 74 68 65 20 64 61 74 61 20 72 65   for the data re
6ca0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 74  turned by the st
6cb0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 70 61 73 73 65  atement.** passe
6cc0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
6cd0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
6ce0: 49 66 20 70 61 72 61 6d 65 74 65 72 20 70 61 70  If parameter pap
6cf0: 43 6f 6c 4e 61 6d 65 20 69 73 20 6e 6f 74 20 4e  ColName is not N
6d00: 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 61 70 43 6f  ULL, then *papCo
6d10: 6c 4e 61 6d 65 20 69 73 20 73 65 74 20 74 6f 20  lName is set to 
6d20: 70 6f 69 6e 74 0a 2a 2a 20 61 74 20 61 6e 20 61  point.** at an a
6d30: 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 75  rray allocated u
6d40: 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29  sing Tcl_Alloc()
6d50: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
6d60: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
6d70: 74 79 0a 2a 2a 20 74 6f 20 66 72 65 65 20 74 68  ty.** to free th
6d80: 69 73 20 61 72 72 61 79 20 75 73 69 6e 67 20 54  is array using T
6d90: 63 6c 5f 46 72 65 65 28 29 2c 20 61 6e 64 20 74  cl_Free(), and t
6da0: 6f 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  o decrement the 
6db0: 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 63 6f 75  reference.** cou
6dc0: 6e 74 20 6f 66 20 65 61 63 68 20 54 63 6c 5f 4f  nt of each Tcl_O
6dd0: 62 6a 2a 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  bj* member of th
6de0: 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54  e array..**.** T
6df0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
6e00: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
6e10: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
6e20: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
6e30: 61 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79  a.** returned by
6e40: 20 70 53 74 6d 74 20 28 61 6e 64 20 68 65 6e 63   pStmt (and henc
6e50: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
6e60: 65 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 61 72  e *papColName ar
6e70: 72 61 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ray)..**.** If p
6e80: 41 72 72 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c  Array is not NUL
6e90: 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61  L, then it conta
6ea0: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
6eb0: 61 20 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76  a Tcl array.** v
6ec0: 61 72 69 61 62 6c 65 2e 20 54 68 65 20 22 2a 22  ariable. The "*"
6ed0: 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 69 73 20   member of this 
6ee0: 61 72 72 61 79 20 69 73 20 73 65 74 20 74 6f 20  array is set to 
6ef0: 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  a list containin
6f00: 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f  g.** the names o
6f10: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65  f the columns re
6f20: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 74  turned by the st
6f30: 61 74 65 6d 65 6e 74 2c 20 69 6e 20 6f 72 64 65  atement, in orde
6f40: 72 20 66 72 6f 6d 0a 2a 2a 20 6c 65 66 74 20 74  r from.** left t
6f50: 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66  o right. e.g. if
6f60: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
6f70: 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d  e returned colum
6f80: 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e 64 0a  ns are a, b and.
6f90: 2a 2a 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68  ** c, it does th
6fa0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
6fb0: 74 68 65 20 74 63 6c 20 63 6f 6d 6d 61 6e 64 3a  the tcl command:
6fc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74 20 24  .**.**     set $
6fd0: 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61 20 62  {pArray}(*) {a b
6fe0: 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   c}.*/.static in
6ff0: 74 0a 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e  t.computeColumnN
7000: 61 6d 65 73 28 0a 20 20 54 63 6c 5f 49 6e 74 65  ames(.  Tcl_Inte
7010: 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 73  rp *interp, .  s
7020: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
7030: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
7040: 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
7050: 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  t */.  Tcl_Obj *
7060: 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 2c 20 20 20  **papColName,   
7070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
7080: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
7090: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54 63 6c 5f   names */.  Tcl_
70a0: 4f 62 6a 20 2a 70 41 72 72 61 79 20 20 20 20 20  Obj *pArray     
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70c0: 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 76   Name of array v
70d0: 61 72 69 61 62 6c 65 20 28 6d 61 79 20 62 65 20  ariable (may be 
70e0: 6e 75 6c 6c 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  null) */.){.  in
70f0: 74 20 6e 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 43 6f  t nCol;..  /* Co
7100: 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  mpute column nam
7110: 65 73 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 73  es */.  nCol = s
7120: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
7130: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  unt(pStmt);.  if
7140: 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a  ( papColName ){.
7150: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54      int i;.    T
7160: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61  cl_Obj **apColNa
7170: 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29  me = (Tcl_Obj**)
7180: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
7190: 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c  f(Tcl_Obj*)*nCol
71a0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
71b0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
71c0: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
71d0: 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  ] = dbTextToObj(
71e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
71f0: 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
7200: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
7210: 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b  Count(apColName[
7220: 69 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  i]);.    }..    
7230: 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72  /* If results ar
7240: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69  e being stored i
7250: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61  n an array varia
7260: 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ble, then create
7270: 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61  .    ** the arra
7280: 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74  y(*) entry for t
7290: 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2f  hat array.    */
72a0: 0a 20 20 20 20 69 66 28 20 70 41 72 72 61 79 20  .    if( pArray 
72b0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  ){.      Tcl_Obj
72c0: 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c   *pColList = Tcl
72d0: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
72e0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20   Tcl_Obj *pStar 
72f0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
7300: 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 20 20 20  bj("*", -1);.   
7310: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
7320: 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20  unt(pColList);. 
7330: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7340: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7350: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
7360: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7370: 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61  erp, pColList, a
7380: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
7390: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
73a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74  IncrRefCount(pSt
73b0: 61 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  ar);.      Tcl_O
73c0: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
73d0: 2c 20 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c  , pArray, pStar,
73e0: 20 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20   pColList,0);.  
73f0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
7400: 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a  ount(pColList);.
7410: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
7420: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
7430: 20 20 20 7d 0a 20 20 20 20 2a 70 61 70 43 6f 6c     }.    *papCol
7440: 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65  Name = apColName
7450: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
7460: 6e 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  nCol;.}../*.** T
7470: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
7480: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
7490: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
74a0: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
74b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
74c0: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
74d0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
74e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
74f0: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
7500: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
7510: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
7520: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
7530: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
7540: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
7550: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
7560: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
7570: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
7580: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
7590: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
75a0: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
75b0: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
75c0: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
75d0: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
75e0: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
75f0: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
7600: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
7610: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
7620: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
7630: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
7640: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
7650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7660: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
7670: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
7680: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
7690: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
76a0: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
76b0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
76c0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
76d0: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
76e0: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
76f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
7700: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
7710: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
7720: 20 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 20       "busy",    
7730: 20 20 20 20 20 20 20 20 20 20 22 63 61 63 68 65            "cache
7740: 22 2c 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22  ",.    "changes"
7750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6c  ,            "cl
7760: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
7770: 20 20 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20    "collate",.   
7780: 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64   "collation_need
7790: 65 64 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68  ed",   "commit_h
77a0: 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d  ook",       "com
77b0: 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70  plete",.    "cop
77c0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
77d0: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
77e0: 78 74 65 6e 73 69 6f 6e 22 2c 22 65 72 72 6f 72  xtension","error
77f0: 63 6f 64 65 22 2c 0a 20 20 20 20 22 65 76 61 6c  code",.    "eval
7800: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7810: 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20 20   "exists",      
7820: 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22        "function"
7830: 2c 0a 20 20 20 20 22 69 6e 63 72 62 6c 6f 62 22  ,.    "incrblob"
7840: 2c 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 74  ,           "int
7850: 65 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20  errupt",        
7860: 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f   "last_insert_ro
7870: 77 69 64 22 2c 0a 20 20 20 20 22 6e 75 6c 6c 76  wid",.    "nullv
7880: 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20 20  alue",          
7890: 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20 20 20 20  "onecolumn",    
78a0: 20 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 0a       "profile",.
78b0: 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c 20      "progress", 
78c0: 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65 79            "rekey
78d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
78e0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a  rollback_hook",.
78f0: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20      "timeout",  
7900: 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c            "total
7910: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22  _changes",     "
7920: 74 72 61 63 65 22 2c 0a 20 20 20 20 22 74 72 61  trace",.    "tra
7930: 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  nsaction",      
7940: 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c    "update_hook",
7950: 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22         "version"
7960: 2c 0a 20 20 20 20 30 20 20 20 20 20 20 20 20 20  ,.    0         
7970: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b             .  };
7980: 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20  .  enum DB_enum 
7990: 7b 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49  {.    DB_AUTHORI
79a0: 5a 45 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42  ZER,        DB_B
79b0: 55 53 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  USY,            
79c0: 20 44 42 5f 43 41 43 48 45 2c 0a 20 20 20 20 44   DB_CACHE,.    D
79d0: 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20  B_CHANGES,      
79e0: 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20       DB_CLOSE,  
79f0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c            DB_COL
7a00: 4c 41 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c  LATE,.    DB_COL
7a10: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20  LATION_NEEDED,  
7a20: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20  DB_COMMIT_HOOK, 
7a30: 20 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45       DB_COMPLETE
7a40: 2c 0a 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20  ,.    DB_COPY,  
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45              DB_E
7a60: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
7a70: 53 49 4f 4e 2c 44 42 5f 45 52 52 4f 52 43 4f 44  SION,DB_ERRORCOD
7a80: 45 2c 0a 20 20 20 20 44 42 5f 45 56 41 4c 2c 20  E,.    DB_EVAL, 
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
7aa0: 45 58 49 53 54 53 2c 20 20 20 20 20 20 20 20 20  EXISTS,         
7ab0: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 0a 20    DB_FUNCTION,. 
7ac0: 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20     DB_INCRBLOB, 
7ad0: 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45           DB_INTE
7ae0: 52 52 55 50 54 2c 20 20 20 20 20 20 20 20 44 42  RRUPT,        DB
7af0: 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57  _LAST_INSERT_ROW
7b00: 49 44 2c 0a 20 20 20 20 44 42 5f 4e 55 4c 4c 56  ID,.    DB_NULLV
7b10: 41 4c 55 45 2c 20 20 20 20 20 20 20 20 20 44 42  ALUE,         DB
7b20: 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20  _ONECOLUMN,     
7b30: 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 0a 20     DB_PROFILE,. 
7b40: 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20     DB_PROGRESS, 
7b50: 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45           DB_REKE
7b60: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42  Y,            DB
7b70: 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a  _ROLLBACK_HOOK,.
7b80: 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20      DB_TIMEOUT, 
7b90: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54            DB_TOT
7ba0: 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 44  AL_CHANGES,    D
7bb0: 42 5f 54 52 41 43 45 2c 0a 20 20 20 20 44 42 5f  B_TRACE,.    DB_
7bc0: 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20  TRANSACTION,    
7bd0: 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f     DB_UPDATE_HOO
7be0: 4b 2c 20 20 20 20 20 20 44 42 5f 56 45 52 53 49  K,      DB_VERSI
7bf0: 4f 4e 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e  ON.  };.  /* don
7c00: 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e  't leave trailin
7c10: 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65  g commas on DB_e
7c20: 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73  num, it confuses
7c30: 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d   the AIX xlc com
7c40: 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20  piler */..  if( 
7c50: 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
7c60: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7c70: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7c80: 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  "SUBCOMMAND ..."
7c90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
7ca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
7cb0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
7cc0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
7cd0: 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c  bjv[1], DB_strs,
7ce0: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63   "option", 0, &c
7cf0: 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65  hoice) ){.    re
7d00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7d10: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28    }..  switch( (
7d20: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f  enum DB_enum)cho
7d30: 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20  ice ){..  /*    
7d40: 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f  $db authorizer ?
7d50: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
7d60: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
7d70: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f  iven callback to
7d80: 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20   authorize each 
7d90: 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  SQL operation as
7da0: 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70   it is.  ** comp
7db0: 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e  iled.  5 argumen
7dc0: 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20  ts are appended 
7dd0: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
7de0: 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a  before it is.  *
7df0: 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a  * invoked:.  **.
7e00: 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61    **   (1) The a
7e10: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
7e20: 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52  e (ex: SQLITE_CR
7e30: 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49  EATE_TABLE, SQLI
7e40: 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a  TE_INSERT, ...).
7e50: 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74    **   (2) First
7e60: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
7e70: 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75  e (depends on au
7e80: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
7e90: 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63  ).  **   (3) Sec
7ea0: 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20  ond descriptive 
7eb0: 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20  name.  **   (4) 
7ec0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
7ed0: 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  base (ex: "main"
7ee0: 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20  , "temp").  **  
7ef0: 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69   (5) Name of tri
7f00: 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69  gger that is doi
7f10: 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20  ng the access.  
7f20: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
7f30: 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75  back should retu
7f40: 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  rn on of the fol
7f50: 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20  lowing strings: 
7f60: 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20  SQLITE_OK,.  ** 
7f70: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f  SQLITE_IGNORE, o
7f80: 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20  r SQLITE_DENY.  
7f90: 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
7fa0: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72   value is an err
7fb0: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  or..  **.  ** If
7fc0: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   this method is 
7fd0: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20  invoked with no 
7fe0: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63  arguments, the c
7ff0: 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61  urrent authoriza
8000: 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61  tion.  ** callba
8010: 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74  ck string is ret
8020: 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  urned..  */.  ca
8030: 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52  se DB_AUTHORIZER
8040: 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
8050: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
8060: 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70  TION.    Tcl_App
8070: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8080: 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  , "authorization
8090: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
80a0: 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
80b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
80c0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
80d0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
80e0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
80f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8100: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
8110: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
8120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
8140: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
8150: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
8160: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
8170: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8180: 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29  , pDb->zAuth, 0)
8190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
81a0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
81b0: 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e  *zAuth;.      in
81c0: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
81d0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
81e0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
81f0: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20  pDb->zAuth);.   
8200: 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68     }.      zAuth
8210: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
8220: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
8230: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
8240: 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30  ( zAuth && len>0
8250: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
8260: 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c  >zAuth = Tcl_All
8270: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
8280: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
8290: 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c  b->zAuth, zAuth,
82a0: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
82b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
82c0: 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->zAuth = 0;.  
82d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
82e0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
82f0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
8300: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
8310: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
8320: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
8330: 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63  db, auth_callbac
8340: 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  k, pDb);.      }
8350: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8360: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
8370: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
8380: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
8390: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
83a0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
83b0: 20 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c    $db busy ?CALL
83c0: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
83d0: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
83e0: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20   callback if an 
83f0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74  SQL statement at
8400: 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20  tempts to open. 
8410: 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74   ** a locked dat
8420: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
8430: 0a 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a  .  case DB_BUSY:
8440: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
8450: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
8460: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8470: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41  rp, 2, objv, "CA
8480: 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20  LLBACK");.      
8490: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
84a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
84b0: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
84c0: 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
84d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
84e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
84f0: 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20  rp, pDb->zBusy, 
8500: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
8510: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
8520: 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20  r *zBusy;.      
8530: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
8540: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
8550: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
8560: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
8570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75       }.      zBu
8580: 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  sy = Tcl_GetStri
8590: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
85a0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
85b0: 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e  if( zBusy && len
85c0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
85d0: 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41  b->zBusy = Tcl_A
85e0: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
85f0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
8600: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73  pDb->zBusy, zBus
8610: 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  y, len+1);.     
8620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8630: 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a  pDb->zBusy = 0;.
8640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8650: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
8660: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
8670: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
8680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
8690: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
86a0: 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65  db, DbBusyHandle
86b0: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
86c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
86d0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
86e0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
86f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8700: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8710: 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61  .  /*     $db ca
8720: 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20  che flush.  **  
8730: 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a     $db cache siz
8740: 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c  e n.  **.  ** Fl
8750: 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64  ush the prepared
8760: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65   statement cache
8770: 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78  , or set the max
8780: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
8790: 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65   ** cached state
87a0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  ments..  */.  ca
87b0: 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20  se DB_CACHE: {. 
87c0: 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b     char *subCmd;
87d0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20  .    int n;..   
87e0: 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a   if( objc<=2 ){.
87f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
8800: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
8810: 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f  , objv, "cache o
8820: 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20  ption ?arg?");. 
8830: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8840: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8850: 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65   subCmd = Tcl_Ge
8860: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20  tStringFromObj( 
8870: 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20  objv[2], 0 );.  
8880: 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27    if( *subCmd=='
8890: 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62  f' && strcmp(sub
88a0: 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20  Cmd,"flush")==0 
88b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
88c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
88d0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
88e0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
88f0: 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20  , "flush");.    
8900: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8910: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
8920: 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  e{.        flush
8930: 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
8940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8950: 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d  lse if( *subCmd=
8960: 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73  ='s' && strcmp(s
8970: 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30  ubCmd,"size")==0
8980: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
8990: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  jc!=4 ){.       
89a0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
89b0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
89c0: 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20  v, "size n");.  
89d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
89e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
89f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
8a00: 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f   TCL_ERROR==Tcl_
8a10: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
8a20: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
8a30: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
8a40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8a50: 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  ( interp, "canno
8a60: 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a  t convert \"", .
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
8a80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8a90: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20  Obj(objv[3],0), 
8aa0: 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c  "\" to integer",
8ab0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   0);.          r
8ac0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8ad0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8ae0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c            if( n<
8af0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8b00: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
8b10: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20   pDb );.        
8b20: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
8b30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
8b40: 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54  >MAX_PREPARED_ST
8b50: 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MTS ){.         
8b60: 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41     n = MAX_PREPA
8b70: 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20  RED_STMTS;.     
8b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b90: 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20   pDb->maxStmt = 
8ba0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
8bb0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8bc0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
8bd0: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
8be0: 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c  "bad option \"",
8bf0: 20 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f   .          Tcl_
8c00: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8c10: 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22  (objv[2],0), "\"
8c20: 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20  : must be flush 
8c30: 6f 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20  or size", 0);.  
8c40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8c50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8c60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
8c70: 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73       $db changes
8c80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
8c90: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8ca0: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
8cb0: 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
8cc0: 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79  d, or deleted by
8cd0: 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72  .  ** the most r
8ce0: 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50  ecent INSERT, UP
8cf0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
8d00: 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e  tatement, not in
8d10: 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e  cluding .  ** an
8d20: 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  y changes made b
8d30: 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
8d40: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ms..  */.  case 
8d50: 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  DB_CHANGES: {.  
8d60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
8d70: 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
8d80: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
8d90: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8da0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
8db0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
8dc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8dd0: 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
8de0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
8df0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
8e00: 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
8e10: 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ult, sqlite3_cha
8e20: 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
8e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
8e40: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73    /*    $db clos
8e50: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74  e.  **.  ** Shut
8e60: 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73  down the databas
8e70: 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  e.  */.  case DB
8e80: 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63  _CLOSE: {.    Tc
8e90: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28  l_DeleteCommand(
8ea0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
8eb0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8ec0: 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62  v[0], 0));.    b
8ed0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
8ee0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
8ef0: 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54  late NAME SCRIPT
8f00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
8f10: 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c  e a new SQL coll
8f20: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63  ation function c
8f30: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
8f40: 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  never.  ** that 
8f50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
8f60: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
8f70: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
8f80: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
8f90: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41  .  case DB_COLLA
8fa0: 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c  TE: {.    SqlCol
8fb0: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a  late *pCollate;.
8fc0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
8fd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69  .    char *zScri
8fe0: 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72  pt;.    int nScr
8ff0: 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ipt;.    if( obj
9000: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
9010: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
9020: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
9030: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
9040: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9050: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9060: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
9070: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9080: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
9090: 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65  zScript = Tcl_Ge
90a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
90b0: 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74  bjv[3], &nScript
90c0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20  );.    pCollate 
90d0: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54  = (SqlCollate*)T
90e0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
90f0: 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53  (*pCollate) + nS
9100: 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20  cript + 1 );.   
9110: 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30   if( pCollate==0
9120: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9130: 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ROR;.    pCollat
9140: 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  e->interp = inte
9150: 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  rp;.    pCollate
9160: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
9170: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f  Collate;.    pCo
9180: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d  llate->zScript =
9190: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74   (char*)&pCollat
91a0: 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70  e[1];.    pDb->p
91b0: 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61  Collate = pColla
91c0: 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  te;.    memcpy(p
91d0: 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74  Collate->zScript
91e0: 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69  , zScript, nScri
91f0: 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73  pt+1);.    if( s
9200: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
9210: 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  llation(pDb->db,
9220: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55   zName, SQLITE_U
9230: 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43  TF8, .        pC
9240: 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f  ollate, tclSqlCo
9250: 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
9260: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
9270: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
9280: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
9290: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
92a0: 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ILE);.      retu
92b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
92c0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
92d0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
92e0: 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f    $db collation_
92f0: 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20  needed SCRIPT.  
9300: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
9310: 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
9320: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
9330: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
9340: 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
9350: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
9360: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
9370: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
9380: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
9390: 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  case DB_COLLATIO
93a0: 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20  N_NEEDED: {.    
93b0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
93c0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
93d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
93e0: 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
93f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
9400: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9410: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f      if( pDb->pCo
9420: 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
9430: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
9440: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
9450: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
9460: 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  }.    pDb->pColl
9470: 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f  ateNeeded = Tcl_
9480: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
9490: 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49  v[2]);.    Tcl_I
94a0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
94b0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
94c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
94d0: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70  llation_needed(p
94e0: 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c  Db->db, pDb, tcl
94f0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
9500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9510: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
9520: 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
9530: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
9540: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
9550: 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
9560: 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
9570: 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
9580: 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
9590: 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
95a0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
95b0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
95c0: 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
95d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
95e0: 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
95f0: 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
9600: 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
9610: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
9620: 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
9630: 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
9640: 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
9650: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
9660: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9670: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
9680: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
9690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
96a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
96b0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
96c0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
96d0: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
96e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
96f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
9700: 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20  >zCommit, 0);.  
9710: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
9720: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
9730: 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  mmit;.      int 
9740: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
9750: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
9760: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
9770: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
9780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f       }.      zCo
9790: 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  mmit = Tcl_GetSt
97a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
97b0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
97c0: 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26    if( zCommit &&
97d0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
97e0: 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d    pDb->zCommit =
97f0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
9800: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
9810: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d  emcpy(pDb->zComm
9820: 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e  it, zCommit, len
9830: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
9840: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
9850: 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  Commit = 0;.    
9860: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
9870: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  b->zCommit ){.  
9880: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
9890: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
98a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
98b0: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
98c0: 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72   DbCommitHandler
98d0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
98e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
98f0: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
9900: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
9910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
9930: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c   /*    $db compl
9940: 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a  ete SQL.  **.  *
9950: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
9960: 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65   SQL is a comple
9970: 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  te SQL statement
9980: 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
9990: 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e  if.  ** addition
99a0: 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75  al lines of inpu
99b0: 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54  t are needed.  T
99c0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
99d0: 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74  o the.  ** built
99e0: 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65  -in "info comple
99f0: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54  te" command of T
9a00: 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  cl..  */.  case 
9a10: 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23  DB_COMPLETE: {.#
9a20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9a30: 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20  IT_COMPLETE.    
9a40: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
9a50: 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70  ;.    int isComp
9a60: 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62  lete;.    if( ob
9a70: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
9a80: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9a90: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
9aa0: 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72   "SQL");.      r
9ab0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9ac0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d  .    }.    isCom
9ad0: 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  plete = sqlite3_
9ae0: 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65  complete( Tcl_Ge
9af0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9b00: 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20  bjv[2], 0) );.  
9b10: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
9b20: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
9b30: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
9b40: 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73  tBooleanObj(pRes
9b50: 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29  ult, isComplete)
9b60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  ;.#endif.    bre
9b70: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
9b80: 20 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69   $db copy confli
9b90: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62  ct-algorithm tab
9ba0: 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50  le filename ?SEP
9bb0: 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44  ARATOR? ?NULLIND
9bc0: 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a  ICATOR?.  **.  *
9bd0: 2a 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f  * Copy data into
9be0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65   table from file
9bf0: 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79  name, optionally
9c00: 20 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52   using SEPARATOR
9c10: 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20  .  ** as column 
9c20: 73 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20  separators.  If 
9c30: 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  a column contain
9c40: 73 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c  s a null string,
9c50: 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c   or the.  ** val
9c60: 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41  ue of NULLINDICA
9c70: 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69  TOR, a NULL is i
9c80: 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68 65 20  nserted for the 
9c90: 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e  column..  ** con
9ca0: 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
9cb0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71  is one of the sq
9cc0: 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c  lite conflict al
9cd0: 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20  gorithms:.  **  
9ce0: 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72    rollback, abor
9cf0: 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c  t, fail, ignore,
9d00: 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e   replace.  ** On
9d10: 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
9d20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
9d30: 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20  ines processed, 
9d40: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
9d50: 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62  same.  ** as 'db
9d60: 20 63 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f   changes' due to
9d70: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
9d80: 74 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20  thm selected..  
9d90: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64  **.  ** This cod
9da0: 65 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61  e is basically a
9db0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
9dc0: 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a  /enhancement of.
9dd0: 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
9de0: 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72   shell.c ".impor
9df0: 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a  t" command..  **
9e00: 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  .  ** This comma
9e10: 6e 64 20 75 73 61 67 65 20 69 73 20 65 71 75 69  nd usage is equi
9e20: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71  valent to the sq
9e30: 6c 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61  lite2.x COPY sta
9e40: 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69  tement,.  ** whi
9e50: 63 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20  ch imports file 
9e60: 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c  data into a tabl
9e70: 65 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74  e using the Post
9e80: 67 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65  greSQL COPY file
9e90: 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20   format:.  **   
9ea0: 24 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69  $db copy $confli
9eb0: 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61  t_algo $table_na
9ec0: 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20  me $filename \t 
9ed0: 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  \\N.  */.  case 
9ee0: 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63  DB_COPY: {.    c
9ef0: 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20  har *zTable;    
9f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9f10: 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
9f20: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  his table */.   
9f30: 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20   char *zFile;   
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9f50: 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68  The file from wh
9f60: 69 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 64  ich to extract d
9f70: 61 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ata */.    char 
9f80: 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20  *zConflict;     
9f90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
9fa0: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
9fb0: 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73   to use */.    s
9fc0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
9fd0: 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  mt;        /* A 
9fe0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
9ff0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a010: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
a020: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a040: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
a050: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
a060: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
a070: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a080: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a090: 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c   bytes in an SQL
a0a0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69   string */.    i
a0b0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
a0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a0d0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
a0e0: 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20     int nSep;    
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a100: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
a110: 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20  s in zSep[] */. 
a120: 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20     int nNull;   
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a140: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
a150: 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a  s in zNull[] */.
a160: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20      char *zSql; 
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d  /* An SQL statem
a190: 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ent */.    char 
a1a0: 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  *zLine;         
a1b0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
a1c0: 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74  le line of input
a1d0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a   from the file *
a1e0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43  /.    char **azC
a1f0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
a200: 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f    /* zLine[] bro
a210: 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75  ken up into colu
a220: 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  mns */.    char 
a230: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
a240: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
a250: 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20   commit changes 
a260: 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b  */.    FILE *in;
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
a290: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  file */.    int 
a2a0: 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20  lineno = 0;     
a2b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
a2c0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  number of input 
a2d0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
a2e0: 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20   zLineNum[80];  
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
a300: 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66  number print buf
a310: 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  fer */.    Tcl_O
a320: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20  bj *pResult;    
a330: 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70         /* interp
a340: 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20   result */..    
a350: 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20  char *zSep;.    
a360: 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20  char *zNull;.   
a370: 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f   if( objc<5 || o
a380: 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54  bjc>7 ){.      T
a390: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
a3a0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
a3b0: 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46   .         "CONF
a3c0: 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54  LICT-ALGORITHM T
a3d0: 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53  ABLE FILENAME ?S
a3e0: 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49  EPARATOR? ?NULLI
a3f0: 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20  NDICATOR?");.   
a400: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a410: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
a420: 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20  f( objc>=6 ){.  
a430: 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47      zSep = Tcl_G
a440: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a450: 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20  objv[5], 0);.   
a460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
a470: 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d  ep = "\t";.    }
a480: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37  .    if( objc>=7
a490: 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20   ){.      zNull 
a4a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
a4b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20  romObj(objv[6], 
a4c0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
a4d0: 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b       zNull = "";
a4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66  .    }.    zConf
a4f0: 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  lict = Tcl_GetSt
a500: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
a510: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61  [2], 0);.    zTa
a520: 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ble = Tcl_GetStr
a530: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
a540: 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c  3], 0);.    zFil
a550: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
a560: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d  gFromObj(objv[4]
a570: 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
a580: 20 73 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20   strlen(zSep);. 
a590: 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65     nNull = strle
a5a0: 6e 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66  n(zNull);.    if
a5b0: 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20  ( nSep==0 ){.   
a5c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a5d0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
a5e0: 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61  r: non-null sepa
a5f0: 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66  rator required f
a600: 6f 72 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20  or copy",0);.   
a610: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a620: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
a630: 66 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  f(sqlite3StrICmp
a640: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c  (zConflict, "rol
a650: 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a  lback") != 0 &&.
a660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
a670: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
a680: 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20   "abort"   ) != 
a690: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
a6a0: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
a6b0: 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20  lict, "fail"    
a6c0: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
a6d0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a6e0: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f  zConflict, "igno
a6f0: 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20  re"  ) != 0 &&. 
a700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
a710: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
a720: 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30  "replace" ) != 0
a730: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
a740: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a750: 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c  rp, "Error: \"",
a760: 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20   zConflict, .   
a770: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
a780: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
a790: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
a7a0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
a7b0: 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
a7c0: 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
a7d0: 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a  r replace", 0);.
a7e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
a7f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
a800: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
a810: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
a820: 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
a830: 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
a840: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
a850: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a860: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
a870: 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  : no such table:
a880: 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a   ", zTable, 0);.
a890: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
a8a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
a8b0: 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e    nByte = strlen
a8c0: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
a8d0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
a8e0: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
a8f0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
a900: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a910: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
a920: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
a930: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a940: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
a950: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
a960: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
a970: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
a980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
a990: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
a9a0: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
a9b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
a9c0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
a9d0: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
a9e0: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
a9f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
aa00: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
aa10: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
aa20: 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
aa30: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
aa40: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
aa50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
aa60: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
aa70: 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b  t malloc()", 0);
aa80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
aa90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
aaa0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
aab0: 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53  ntf(nByte+50, zS
aac0: 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25  ql, "INSERT OR %
aad0: 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55  q INTO '%q' VALU
aae0: 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20  ES(?",.         
aaf0: 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c  zConflict, zTabl
ab00: 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
ab10: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  en(zSql);.    fo
ab20: 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
ab30: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
ab40: 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
ab50: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
ab60: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
ab70: 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
ab80: 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
ab90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
aba0: 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
abb0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
abc0: 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  t, 0);.    free(
abd0: 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
abe0: 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
abf0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ac00: 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
ac10: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
ac20: 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
ac30: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
ac40: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
ac50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ac60: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20  R;.    }.    in 
ac70: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
ac80: 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
ac90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
aca0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
acb0: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
acc0: 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
acd0: 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  ", zFile, NULL);
ace0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
acf0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
ad00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ad10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
ad20: 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63    azCol = malloc
ad30: 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30  ( sizeof(azCol[0
ad40: 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20  ])*(nCol+1) );. 
ad50: 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
ad60: 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  ) {.      Tcl_Ap
ad70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ad80: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74  p, "Error: can't
ad90: 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a   malloc()", 0);.
ada0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
adb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
adc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
add0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
ade0: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
adf0: 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
ae00: 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d  );.    zCommit =
ae10: 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77   "COMMIT";.    w
ae20: 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c  hile( (zLine = l
ae30: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20  ocal_getline(0, 
ae40: 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  in))!=0 ){.     
ae50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
ae60: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e  i = 0;.      lin
ae70: 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43  eno++;.      azC
ae80: 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20  ol[0] = zLine;. 
ae90: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d       for(i=0, z=
aea0: 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  zLine; *z; z++){
aeb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d  .        if( *z=
aec0: 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e  =zSep[0] && strn
aed0: 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65  cmp(z, zSep, nSe
aee0: 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)==0 ){.       
aef0: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
af00: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
af10: 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29      if( i<nCol )
af20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
af30: 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70  Col[i] = &z[nSep
af40: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ];.            z
af50: 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20   += nSep-1;.    
af60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
af70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
af80: 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b  if( i+1!=nCol ){
af90: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
afa0: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Err;.        int
afb0: 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 28 7a   nErr = strlen(z
afc0: 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20  File) + 200;.   
afd0: 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c       zErr = mall
afe0: 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20  oc(nErr);.      
aff0: 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
b000: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b010: 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a  snprintf(nErr, z
b020: 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Err,.           
b030: 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e    "Error: %s lin
b040: 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
b050: 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
b060: 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c  a but found %d",
b070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  .             zF
b080: 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f  ile, lineno, nCo
b090: 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
b0a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b0b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
b0c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
b0d0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
b0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43      }.        zC
b0f0: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
b100: 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
b110: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
b120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
b130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b140: 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c  /* check for nul
b150: 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62  l data, if so, b
b160: 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20  ind as null */. 
b170: 20 20 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c         if ((nNul
b180: 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a  l>0 && strcmp(az
b190: 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d  Col[i], zNull)==
b1a0: 30 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43  0) || strlen(azC
b1b0: 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20  ol[i])==0) {.   
b1c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
b1d0: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
b1e0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  i+1);.        }e
b1f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
b200: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
b210: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43  (pStmt, i+1, azC
b220: 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  ol[i], -1, SQLIT
b230: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
b240: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b250: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
b260: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63  pStmt);.      rc
b270: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
b280: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66  (pStmt);.      f
b290: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
b2a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b2b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
b2c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b2d0: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22  interp,"Error: "
b2e0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
b2f0: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
b300: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
b310: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
b320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b330: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
b340: 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66  ee(azCol);.    f
b350: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73  close(in);.    s
b360: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
b370: 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69  pStmt);.    (voi
b380: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
b390: 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c  Db->db, zCommit,
b3a0: 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20   0, 0, 0);..    
b3b0: 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d  if( zCommit[0] =
b3c0: 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f  = 'C' ){.      /
b3d0: 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72  * success, set r
b3e0: 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20  esult as number 
b3f0: 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
b400: 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ed */.      pRes
b410: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
b420: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
b430: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74        Tcl_SetInt
b440: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e  Obj(pResult, lin
b450: 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eno);.      rc =
b460: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
b470: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69  se{.      /* fai
b480: 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e  lure, append lin
b490: 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64  eno where failed
b4a0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
b4b0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
b4c0: 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69  f(zLineNum), zLi
b4d0: 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e  neNum,"%d",linen
b4e0: 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  o);.      Tcl_Ap
b4f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b500: 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c  p,", failed whil
b510: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e  e processing lin
b520: 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29  e: ",zLineNum,0)
b530: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
b540: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
b550: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
b560: 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
b570: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
b580: 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a  sion BOOLEAN.  *
b590: 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20  *.  ** Turn the 
b5a0: 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e  extension loadin
b5b0: 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20  g feature on or 
b5c0: 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20  off.  It if off 
b5d0: 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e  by.  ** default.
b5e0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
b5f0: 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
b600: 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66  NSION: {.#ifndef
b610: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
b620: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
b630: 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69  int onoff;.    i
b640: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
b650: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
b660: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
b670: 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29  objv, "BOOLEAN")
b680: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
b690: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
b6a0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
b6b0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
b6c0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
b6d0: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20  onoff) ){.      
b6e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b6f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b700: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
b710: 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64  extension(pDb->d
b720: 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62  b, onoff);.    b
b730: 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20  reak;.#else.    
b740: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b750: 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73  (interp, "extens
b760: 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74  ion loading is t
b770: 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d  urned off at com
b780: 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20  pile-time",.    
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
b7b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69  TCL_ERROR;.#endi
b7c0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  f.  }..  /*.  **
b7d0: 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64      $db errorcod
b7e0: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  e.  **.  ** Retu
b7f0: 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65  rn the numeric e
b800: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77  rror code that w
b810: 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  as returned by t
b820: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20  he most recent. 
b830: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
b840: 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f  te3_exec()..  */
b850: 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52  .  case DB_ERROR
b860: 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  CODE: {.    Tcl_
b870: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b880: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b890: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  bj(sqlite3_errco
b8a0: 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  de(pDb->db)));. 
b8b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
b8c0: 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24   .  /*.  **    $
b8d0: 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72  db eval $sql ?ar
b8e0: 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65  ray? ?{  ...code
b8f0: 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24  ... }?.  **    $
b900: 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71  db onecolumn $sq
b910: 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  l.  **.  ** The 
b920: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
b930: 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74   $sql is evaluat
b940: 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f  ed.  For each ro
b950: 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  w, the values ar
b960: 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e  e.  ** placed in
b970: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
b980: 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72   array named "ar
b990: 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65  ray" and ...code
b9a0: 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e  ... is executed.
b9b0: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
b9c0: 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20   and "code" are 
b9d0: 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f  omitted, then no
b9e0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65   callback is eve
b9f0: 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a  ry invoked..  **
ba00: 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61   If "array" is a
ba10: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
ba20: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20  then the values 
ba30: 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61  are placed in va
ba40: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61  riables.  ** tha
ba50: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
ba60: 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c  name as the fiel
ba70: 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ds extracted by 
ba80: 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  the query..  **.
ba90: 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75    ** The onecolu
baa0: 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65  mn method is the
bab0: 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a   equivalent of:.
bac0: 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20    **     lindex 
bad0: 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20  [$db eval $sql] 
bae0: 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  0.  */.  case DB
baf0: 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61  _ONECOLUMN:.  ca
bb00: 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20 63 61  se DB_EVAL:.  ca
bb10: 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20 7b 0a  se DB_EXISTS: {.
bb20: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
bb30: 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65  zSql;      /* Ne
bb40: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
bb50: 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20   to execute */. 
bb60: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
bb70: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57 68 61  Left;     /* Wha
bb80: 74 20 69 73 20 6c 65 66 74 20 61 66 74 65 72 20  t is left after 
bb90: 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20 7a 53  first stmt in zS
bba0: 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ql */.    sqlite
bbb0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
bbc0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c   /* Compiled SQL
bbd0: 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20   statment */.   
bbe0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
bbf0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
bc00: 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20 77 68  of array into wh
bc10: 69 63 68 20 72 65 73 75 6c 74 73 20 61 72 65 20  ich results are 
bc20: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54  written */.    T
bc30: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
bc40: 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20        /* Script 
bc50: 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20  to run for each 
bc60: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
bc70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61    Tcl_Obj **apPa
bc80: 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 61  rm;      /* Para
bc90: 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65 65 64  meters that need
bca0: 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   a Tcl_DecrRefCo
bcb0: 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  unt() */.    int
bcc0: 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20   nParm;         
bcd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bce0: 20 65 6e 74 72 69 65 73 20 75 73 65 64 20 69 6e   entries used in
bcf0: 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20   apParm[] */.   
bd00: 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b   Tcl_Obj *aParm[
bd10: 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74 69  10];    /* Stati
bd20: 63 20 73 70 61 63 65 20 66 6f 72 20 61 70 50 61  c space for apPa
bd30: 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d  rm[] in the comm
bd40: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 54  on case */.    T
bd50: 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20  cl_Obj *pRet;   
bd60: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
bd70: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f  o be returned */
bd80: 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64  .    SqlPrepared
bd90: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20  Stmt *pPreStmt; 
bda0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
bdb0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
bdc0: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ent */.    int r
bdd0: 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63 68 6f  c2;..    if( cho
bde0: 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29 7b 0a  ice==DB_EVAL ){.
bdf0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33        if( objc<3
be00: 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20   || objc>5 ){.  
be10: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
be20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
be30: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52  , objv, "SQL ?AR
be40: 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50  RAY-NAME? ?SCRIP
be50: 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  T?");.        re
be60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
be70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
be80: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
be90: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
bea0: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
beb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bec0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
bed0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
bee0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
bef0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22  , 2, objv, "SQL"
bf00: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
bf10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
bf20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
bf30: 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53  hoice==DB_EXISTS
bf40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74   ){.        pRet
bf50: 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61   = Tcl_NewBoolea
bf60: 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20 20 20  nObj(0);.       
bf70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
bf80: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d  t(pRet);.      }
bf90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 52  else{.        pR
bfa0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
bfb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
bfc0: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70  jc==3 ){.      p
bfd0: 41 72 72 61 79 20 3d 20 70 53 63 72 69 70 74 20  Array = pScript 
bfe0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
bff0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
c000: 20 20 20 20 70 41 72 72 61 79 20 3d 20 30 3b 0a      pArray = 0;.
c010: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
c020: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c  objv[3];.    }el
c030: 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79  se{.      pArray
c040: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
c050: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53 74 72    if( Tcl_GetStr
c060: 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d 3d 3d  ing(pArray)[0]==
c070: 30 20 29 20 70 41 72 72 61 79 20 3d 20 30 3b 0a  0 ) pArray = 0;.
c080: 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
c090: 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a  objv[4];.    }..
c0a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
c0b0: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ount(objv[2]);. 
c0c0: 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65     zSql = Tcl_Ge
c0d0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
c0e0: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
c0f0: 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f  while( rc==TCL_O
c100: 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a  K && zSql[0] ){.
c110: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c140: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
c150: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
c160: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c170: 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72  f bind parameter
c180: 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74 20 2a  s in the pStmt *
c190: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  /.      int nCol
c1a0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
c1b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c1c0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
c1d0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
c1e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
c1f0: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 2f 2a  olName = 0;   /*
c200: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
c210: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20   names */.      
c220: 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  int len;        
c230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
c240: 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66 20 7a  ring length of z
c250: 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20  Sql */.  .      
c260: 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
c270: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
c280: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
c290: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 6e  been compiled an
c2a0: 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68  d.      ** which
c2b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 65 78   matches the nex
c2c0: 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20 53 51  t sequence of SQ
c2d0: 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  L..      */.    
c2e0: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
c2f0: 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28     len = strlen(
c300: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72  zSql);.      for
c310: 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d  (pPreStmt = pDb-
c320: 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53  >stmtList; pPreS
c330: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
c340: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
c350: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
c360: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a  pPreStmt->nSql;.
c370: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
c380: 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =n .            
c390: 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74  && memcmp(pPreSt
c3a0: 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  mt->zSql, zSql, 
c3b0: 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
c3c0: 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30    && (zSql[n]==0
c3d0: 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27   || zSql[n-1]=='
c3e0: 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ;').        ){. 
c3f0: 20 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d           pStmt =
c400: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
c410: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65 66  ;.          zLef
c420: 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74  t = &zSql[pPreSt
c430: 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20  mt->nSql];..    
c440: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20        /* When a 
c450: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
c460: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c  nt is found, unl
c470: 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ink it from the.
c480: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63            ** cac
c490: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
c4a0: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
c4b0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
c4c0: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  inning.         
c4d0: 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65   ** of the cache
c4e0: 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74   list in order t
c4f0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20  o implement LRU 
c500: 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20  replacement..   
c510: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c520: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
c530: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
c540: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
c550: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
c560: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
c570: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
c580: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
c590: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
c5a0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
c5b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c5c0: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
c5d0: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
c5e0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
c5f0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
c600: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
c610: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
c620: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
c630: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
c640: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
c650: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c660: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
c670: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  --;.          br
c680: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
c690: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
c6a0: 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65  /* If no prepare
c6b0: 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  d statement was 
c6c0: 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20  found.  Compile 
c6d0: 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20 20  the SQL text.   
c6e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c6f0: 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pStmt==0 ){.    
c700: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
c710: 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61  K!=sqlite3_prepa
c720: 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a  re_v2(pDb->db, z
c730: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
c740: 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20 20   &zLeft) ){.    
c750: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
c760: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
c770: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
c780: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
c790: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b)));.          
c7a0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
c7b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c7c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c7d0: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
c7e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
c7f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
c800: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
c810: 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >db) ){.        
c820: 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65      /* A compile
c830: 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74  -time error in t
c840: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  he statement.   
c850: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
c860: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
c870: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
c880: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
c890: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
c8a0: 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >db)));.        
c8b0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
c8c0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
c8d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
c8e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c8f0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
c900: 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70  ment was a no-op
c910: 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74  .  Continue to t
c920: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
c930: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
c940: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69   in the SQL stri
c950: 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng..            
c960: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  */.            z
c970: 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20  Sql = zLeft;.   
c980: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
c990: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
c9a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c9b0: 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d   assert( pPreStm
c9c0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  t==0 );.      }.
c9d0: 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 76  .      /* Bind v
c9e0: 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74  alues to paramet
c9f0: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
ca00: 69 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20 20  ith $ or :.     
ca10: 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61 72   */  .      nVar
ca20: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
ca30: 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
ca40: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50  pStmt);.      nP
ca50: 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  arm = 0;.      i
ca60: 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61  f( nVar>sizeof(a
ca70: 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61  Parm)/sizeof(aPa
ca80: 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  rm[0]) ){.      
ca90: 20 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f    apParm = (Tcl_
caa0: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
cab0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50 61  nVar*sizeof(apPa
cac0: 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d  rm[0]));.      }
cad0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70  else{.        ap
cae0: 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20  Parm = aParm;.  
caf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
cb00: 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b  i=1; i<=nVar; i+
cb10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
cb20: 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73  t char *zVar = s
cb30: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
cb40: 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74  meter_name(pStmt
cb50: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
cb60: 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56  ( zVar!=0 && (zV
cb70: 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56  ar[0]=='$' || zV
cb80: 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56  ar[0]==':' || zV
cb90: 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20  ar[0]=='@') ){. 
cba0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a           Tcl_Obj
cbb0: 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74   *pVar = Tcl_Get
cbc0: 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26  Var2Ex(interp, &
cbd0: 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a  zVar[1], 0, 0);.
cbe0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 56            if( pV
cbf0: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ar ){.          
cc00: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
cc10: 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20       u8 *data;. 
cc20: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
cc30: 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74  *zType = pVar->t
cc40: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
cc50: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
cc60: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ";.            c
cc70: 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d  har c = zType[0]
cc80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
cc90: 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c  ( zVar[0]=='@' |
cca0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
ccb0: 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63   (c=='b' && strc
ccc0: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
ccd0: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
cce0: 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20  ->bytes==0) ){. 
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd00: 4c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65  Load a BLOB type
cd10: 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69   if the Tcl vari
cd20: 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72  able is a bytear
cd30: 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ray and.        
cd40: 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
cd50: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
cd60: 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68 65 20  entation or the 
cd70: 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  host.           
cd80: 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
cd90: 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
cda0: 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20   "@". */.       
cdb0: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63         data = Tc
cdc0: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
cdd0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
cde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
cdf0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
ce00: 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c  (pStmt, i, data,
ce10: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
ce20: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
ce30: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
ce40: 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20  nt(pVar);.      
ce50: 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b 6e          apParm[n
ce60: 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a  Parm++] = pVar;.
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
ce80: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
ce90: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
cea0: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
cec0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
ced0: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b  terp, pVar, &n);
cee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
cef0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
cf00: 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20  pStmt, i, n);.  
cf10: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
cf20: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
cf30: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
cf40: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
cf50: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
cf60: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
cf70: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
cf80: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
cf90: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20  ar, &r);.       
cfa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
cfb0: 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  ind_double(pStmt
cfc0: 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  , i, r);.       
cfd0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
cfe0: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
cff0: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
d000: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
d010: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
d020: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
d030: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
d040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
d050: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
d060: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
d070: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
d080: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
d090: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &v);.           
d0a0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
d0b0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20  int64(pStmt, i, 
d0c0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
d0d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d0e0: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
d0f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
d100: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
d110: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
d120: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d130: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
d140: 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29 64  mt, i, (char *)d
d150: 61 74 61 2c 20 6e 2b 31 2c 20 53 51 4c 49 54 45  ata, n+1, SQLITE
d160: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
d170: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
d180: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
d1a0: 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[nParm++] = 
d1b0: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20  pVar;.          
d1c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
d1d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
d1e0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
d1f0: 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a  ll( pStmt, i );.
d200: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d210: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
d220: 20 20 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20       /* Execute 
d230: 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f  the SQL.      */
d240: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63  .      while( rc
d250: 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d  ==TCL_OK && pStm
d260: 74 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  t && SQLITE_ROW=
d270: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
d280: 74 6d 74 29 20 29 7b 0a 0a 09 2f 2a 20 43 6f 6d  tmt) ){.../* Com
d290: 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  pute column name
d2a0: 73 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  s. This must be 
d2b0: 64 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 66  done after the f
d2c0: 69 72 73 74 20 73 75 63 63 65 73 73 66 75 6c 0a  irst successful.
d2d0: 09 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
d2e0: 74 65 33 5f 73 74 65 70 28 29 2c 20 69 6e 20 63  te3_step(), in c
d2f0: 61 73 65 20 74 68 65 20 71 75 65 72 79 20 69 73  ase the query is
d300: 20 72 65 63 6f 6d 70 69 6c 65 64 20 61 6e 64 20   recompiled and 
d310: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  the.        ** n
d320: 75 6d 62 65 72 20 6f 72 20 6e 61 6d 65 73 20 6f  umber or names o
d330: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63  f the returned c
d340: 6f 6c 75 6d 6e 73 20 63 68 61 6e 67 65 73 2e 20  olumns changes. 
d350: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d360: 20 20 20 20 61 73 73 65 72 74 28 21 70 41 72 72      assert(!pArr
d370: 61 79 7c 7c 70 53 63 72 69 70 74 29 3b 0a 20 20  ay||pScript);.  
d380: 20 20 20 20 20 20 69 66 20 28 6e 43 6f 6c 20 3c        if (nCol <
d390: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
d3a0: 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20 3d 20  Tcl_Obj ***ap = 
d3b0: 28 70 53 63 72 69 70 74 3f 26 61 70 43 6f 6c 4e  (pScript?&apColN
d3c0: 61 6d 65 3a 30 29 3b 0a 20 20 20 20 20 20 20 20  ame:0);.        
d3d0: 20 20 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75 74 65    nCol = compute
d3e0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e 74 65  ColumnNames(inte
d3f0: 72 70 2c 20 70 53 74 6d 74 2c 20 61 70 2c 20 70  rp, pStmt, ap, p
d400: 41 72 72 61 79 29 3b 0a 20 20 20 20 20 20 20 20  Array);.        
d410: 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  }..        for(i
d420: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
d430: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
d440: 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  Obj *pVal;.     
d450: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
d460: 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63  /* Set pVal to c
d470: 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20  ontain the i'th 
d480: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72  column of this r
d490: 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ow. */.         
d4a0: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
d4b0: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
d4c0: 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  mt, i) ){.      
d4d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
d4e0: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
d4f0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
d500: 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
d510: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
d520: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
d530: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
d540: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
d550: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
d560: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
d570: 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20 29 20     if( !zBlob ) 
d580: 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  bytes = 0;.     
d590: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
d5a0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
d5b0: 4f 62 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20  Obj((u8*)zBlob, 
d5c0: 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20  bytes);.        
d5d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d5e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d5f0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
d600: 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TE_INTEGER: {.  
d610: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d620: 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c  te_int64 v = sql
d630: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
d640: 34 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  4(pStmt, i);.   
d650: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
d660: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
d670: 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   v<=2147483647 )
d680: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d690: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
d6a0: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
d6b0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69  pVal = Tcl_NewWi
d6e0: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
d6f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d700: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
d710: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
d720: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
d730: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
d740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
d750: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
d760: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
d770: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
d780: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
d790: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
d7a0: 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (r);.           
d7b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d7c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d7d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d7e0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
d7f0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54        pVal = dbT
d800: 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e  extToObj(pDb->zN
d810: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
d820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d830: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d840: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
d860: 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a  al = dbTextToObj
d870: 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  ((char *)sqlite3
d880: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
d890: 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20  mt, i));.       
d8a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d8b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d8c0: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
d8d0: 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74       if( pScript
d8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d8f0: 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b  if( pArray==0 ){
d900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
d910: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
d920: 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  terp, apColName[
d930: 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b  i], 0, pVal, 0);
d940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
d950: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
d960: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
d970: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
d980: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70   apColName[i], p
d990: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Val, 0);.       
d9a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d9b0: 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63   }else if( choic
d9c0: 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20  e==DB_ONECOLUMN 
d9d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
d9e0: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 29  ssert( pRet==0 )
d9f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
da00: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
da10: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20             pRet 
da20: 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  = pVal;.        
da30: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
da40: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
da50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
da60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
da70: 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20  _BREAK;.        
da80: 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20      i = nCol;.  
da90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
daa0: 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49  ( choice==DB_EXI
dab0: 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20  STS ){.         
dac0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
dad0: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
dae0: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63         pRet = Tc
daf0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
db00: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
db10: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
db20: 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  (pRet);.        
db30: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45      rc = TCL_BRE
db40: 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AK;.            
db50: 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  i = nCol;.      
db60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db70: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
db80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
db90: 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56  interp, pRet, pV
dba0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  al);.          }
dbb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
dbc0: 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70        if( pScrip
dbd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
dbe0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
dbf0: 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  x(interp, pScrip
dc00: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
dc10: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e   if( rc==TCL_CON
dc20: 54 49 4e 55 45 20 29 7b 0a 20 20 20 20 20 20 20  TINUE ){.       
dc30: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
dc40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dc50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dc60: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
dc70: 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
dc80: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
dc90: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
dca0: 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6c 75 6d  * Free the colum
dcb0: 6e 20 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a  n name objects *
dcc0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72  /.      if( pScr
dcd0: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ipt ){.        /
dce0: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 72  * If the query r
dcf0: 65 74 75 72 6e 65 64 20 6e 6f 20 72 6f 77 73 2c  eturned no rows,
dd00: 20 62 75 74 20 61 6e 20 61 72 72 61 79 20 76 61   but an array va
dd10: 72 69 61 62 6c 65 20 77 61 73 20 0a 20 20 20 20  riable was .    
dd20: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
dd30: 2c 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 43 6f  , call computeCo
dd40: 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 6e 6f 77 20  lumnNames() now 
dd50: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
dd60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 72 61  .        ** arra
dd70: 79 6e 61 6d 65 28 2a 29 20 76 61 72 69 61 62 6c  yname(*) variabl
dd80: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
dd90: 20 20 20 20 20 20 69 66 20 28 70 41 72 72 61 79        if (pArray
dda0: 20 26 26 20 6e 43 6f 6c 20 3c 20 30 29 20 7b 0a   && nCol < 0) {.
ddb0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
ddc0: 6a 20 2a 2a 2a 61 70 20 3d 20 28 70 53 63 72 69  j ***ap = (pScri
ddd0: 70 74 3f 26 61 70 43 6f 6c 4e 61 6d 65 3a 30 29  pt?&apColName:0)
dde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c  ;.          nCol
ddf0: 20 3d 20 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e   = computeColumn
de00: 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20 70 53  Names(interp, pS
de10: 74 6d 74 2c 20 61 70 2c 20 70 41 72 72 61 79 29  tmt, ap, pArray)
de20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
de30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
de40: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
de50: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
de60: 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b  Count(apColName[
de70: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
de80: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
de90: 28 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65  (char*)apColName
dea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
deb0: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f    /* Free the bo
dec0: 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62  und string and b
ded0: 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a  lob parameters *
dee0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
def0: 20 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nParm; i++){.
df00: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
df10: 52 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b  RefCount(apParm[
df20: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
df30: 20 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61     if( apParm!=a
df40: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
df50: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
df60: 61 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  apParm);.      }
df70: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
df80: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
df90: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63   If the result c
dfa0: 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43  ode is SQLITE_SC
dfb0: 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20  HEMA, then.     
dfc0: 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74   ** flush the st
dfd0: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e  atement cache an
dfe0: 64 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d  d try the statem
dff0: 65 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20  ent again..     
e000: 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20   */.      rc2 = 
e010: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
e020: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
e030: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29  SQLITE_OK!=rc2 )
e040: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
e050: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
e060: 20 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20   occurs, report 
e070: 74 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74  the error and st
e080: 6f 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20  op reading.     
e090: 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20     ** the SQL.  
e0a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e0b0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
e0c0: 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74  t(interp, dbText
e0d0: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ToObj(sqlite3_er
e0e0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b  rmsg(pDb->db)));
e0f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e100: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
e110: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
e120: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
e130: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29    if( pPreStmt )
e140: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
e150: 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20  )pPreStmt);.    
e160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e170: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e   }else if( pDb->
e180: 6d 61 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20  maxStmt<=0 ){.  
e190: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
e1a0: 63 61 63 68 65 20 69 73 20 74 75 72 6e 65 64 20  cache is turned 
e1b0: 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64  off, deallocated
e1c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
e1d0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
e1e0: 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65  reStmt ) Tcl_Fre
e1f0: 65 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d  e((char*)pPreStm
e200: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
e210: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
e220: 6d 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mt);.      }else
e230: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  {.        /* Eve
e240: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 20 61  rything worked a
e250: 6e 64 20 74 68 65 20 63 61 63 68 65 20 69 73 20  nd the cache is 
e260: 6f 70 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20  operational..   
e270: 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61       ** Create a
e280: 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64   new SqlPrepared
e290: 53 74 6d 74 20 73 74 72 75 63 74 75 72 65 20 69  Stmt structure i
e2a0: 66 20 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20  f we need one.. 
e2b0: 20 20 20 20 20 20 20 2a 2a 20 28 49 66 20 77 65         ** (If we
e2c0: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 6f 6e   already have on
e2d0: 65 20 77 65 20 63 61 6e 20 6a 75 73 74 20 72 65  e we can just re
e2e0: 75 73 65 20 69 74 2e 29 0a 20 20 20 20 20 20 20  use it.).       
e2f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
e300: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  pPreStmt==0 ){. 
e310: 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a           len = z
e320: 4c 65 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20  Left - zSql;.   
e330: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20         pPreStmt 
e340: 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  = (SqlPreparedSt
e350: 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  mt*)Tcl_Alloc( s
e360: 69 7a 65 6f 66 28 2a 70 50 72 65 53 74 6d 74 29  izeof(*pPreStmt)
e370: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
e380: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 20  ( pPreStmt==0 ) 
e390: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e3a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
e3b0: 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53  Stmt->pStmt = pS
e3c0: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  tmt;.          p
e3d0: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20  PreStmt->nSql = 
e3e0: 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 70  len;.          p
e3f0: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
e400: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
e410: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
e420: 73 65 72 74 28 20 73 74 72 6c 65 6e 28 70 50 72  sert( strlen(pPr
e430: 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 6c 65  eStmt->zSql)==le
e440: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  n );.          a
e450: 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70  ssert( 0==memcmp
e460: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
e470: 20 7a 53 71 6c 2c 20 6c 65 6e 29 20 29 3b 0a 20   zSql, len) );. 
e480: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
e490: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
e4a0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
e4b0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
e4c0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
e4d0: 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  st.        */.  
e4e0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
e4f0: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
e500: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70  tList;.        p
e510: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d  PreStmt->pPrev =
e520: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
e530: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
e540: 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  .         pDb->s
e550: 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  tmtList->pPrev =
e560: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
e570: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
e580: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
e590: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  eStmt;.        i
e5a0: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
e5b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e5c0: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
e5d0: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
e5e0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
e5f0: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
e600: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e610: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e620: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
e630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e640: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20   pDb->nStmt++;. 
e650: 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66    .        /* If
e660: 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e   we have too man
e670: 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63  y statement in c
e680: 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65  ache, remove the
e690: 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74 68   surplus from th
e6a0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 64  e.        ** end
e6b0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
e6c0: 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  st..        */. 
e6d0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 44         while( pD
e6e0: 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61  b->nStmt>pDb->ma
e6f0: 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  xStmt ){.       
e700: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
e710: 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ize(pDb->stmtLas
e720: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
e730: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
e740: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61  st = pDb->stmtLa
e750: 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  st->pPrev;.     
e760: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
e770: 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61  har*)pDb->stmtLa
e780: 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20  st->pNext);.    
e790: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
e7a0: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
e7b0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
e7c0: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
e7d0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e7e0: 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20 74   /* Proceed to t
e7f0: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
e800: 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20  t */.      zSql 
e810: 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20  = zLeft;.    }. 
e820: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
e830: 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20  unt(objv[2]);.. 
e840: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
e850: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
e860: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
e870: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
e880: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
e890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
e8a0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
e8b0: 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  et);.    }else i
e8c0: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
e8d0: 0a 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74  .      Tcl_Reset
e8e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
e8f0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
e900: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
e910: 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e      $db function
e920: 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a   NAME SCRIPT.  *
e930: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
e940: 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  new SQL function
e950: 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57   called NAME.  W
e960: 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e  henever that fun
e970: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61  ction is.  ** ca
e980: 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52  lled, invoke SCR
e990: 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20  IPT to evaluate 
e9a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  the function..  
e9b0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e  */.  case DB_FUN
e9c0: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c  CTION: {.    Sql
e9d0: 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20  Func *pFunc;.   
e9e0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
e9f0: 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  t;.    char *zNa
ea00: 6d 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  me;.    if( objc
ea10: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
ea20: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
ea30: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
ea40: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
ea50: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ea60: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ea70: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
ea80: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
ea90: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70  jv[2], 0);.    p
eaa0: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
eab0: 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69  ;.    pFunc = fi
eac0: 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a  ndSqlFunc(pDb, z
ead0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
eae0: 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  Func==0 ) return
eaf0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
eb00: 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69  if( pFunc->pScri
eb10: 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  pt ){.      Tcl_
eb20: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75  DecrRefCount(pFu
eb30: 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  nc->pScript);.  
eb40: 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70    }.    pFunc->p
eb50: 53 63 72 69 70 74 20 3d 20 70 53 63 72 69 70 74  Script = pScript
eb60: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
eb70: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
eb80: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45  .    pFunc->useE
eb90: 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f  valObjv = safeTo
eba0: 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65  UseEvalObjv(inte
ebb0: 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20  rp, pScript);.  
ebc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
ebd0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
ebe0: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  Db->db, zName, -
ebf0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  1, SQLITE_UTF8,.
ec00: 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74          pFunc, t
ec10: 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  clSqlFunc, 0, 0)
ec20: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ec30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ec40: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
ec50: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
ec60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
ec70: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
ec80: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
ec90: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
eca0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
ecb0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
ecc0: 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d   $db incrblob ?-
ecd0: 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
ece0: 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
ecf0: 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  D.  */.  case DB
ed00: 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66  _INCRBLOB: {.#if
ed10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ed20: 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c  INCRBLOB.    Tcl
ed30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ed40: 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20  terp, "incrblob 
ed50: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
ed60: 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29   this build", 0)
ed70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
ed80: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
ed90: 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
eda0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
edb0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69  char *zDb = "mai
edc0: 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  n";.    const ch
edd0: 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
ede0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
edf0: 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f  umn;.    sqlite_
ee00: 69 6e 74 36 34 20 69 52 6f 77 3b 0a 0a 20 20 20  int64 iRow;..   
ee10: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
ee20: 65 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69  e -readonly opti
ee30: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62  on */.    if( ob
ee40: 6a 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54  jc>3 && strcmp(T
ee50: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ee60: 76 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c  v[2]), "-readonl
ee70: 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
ee80: 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
ee90: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
eea0: 62 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e  bjc!=(5+isReadon
eeb0: 6c 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b  ly) && objc!=(6+
eec0: 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20  isReadonly) ){. 
eed0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
eee0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
eef0: 20 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e   objv, "?-readon
ef00: 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43  ly? ?DB? TABLE C
ef10: 4f 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20  OLUMN ROWID");. 
ef20: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ef30: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
ef40: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69    if( objc==(6+i
ef50: 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
ef60: 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65      zDb = Tcl_Ge
ef70: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
ef80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62  ;.    }.    zTab
ef90: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
efa0: 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29  ng(objv[objc-3])
efb0: 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20  ;.    zColumn = 
efc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
efd0: 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20  jv[objc-2]);.   
efe0: 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64   rc = Tcl_GetWid
eff0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
f000: 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d  rp, objv[objc-1]
f010: 2c 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69  , &iRow);..    i
f020: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
f030: 0a 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61  .      rc = crea
f040: 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  teIncrblobChanne
f050: 6c 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  l(.          int
f060: 65 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a  erp, pDb, zDb, z
f070: 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  Table, zColumn, 
f080: 69 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79  iRow, isReadonly
f090: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
f0a0: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
f0b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
f0c0: 20 20 20 20 20 24 64 62 20 69 6e 74 65 72 72 75       $db interru
f0d0: 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74  pt.  **.  ** Int
f0e0: 65 72 72 75 70 74 20 74 68 65 20 65 78 65 63 75  errupt the execu
f0f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65  tion of the inne
f100: 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72  r-most SQL inter
f110: 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20  preter.  This.  
f120: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 53 51  ** causes the SQ
f130: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  L statement to r
f140: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f  eturn an error o
f150: 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  f SQLITE_INTERRU
f160: 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  PT..  */.  case 
f170: 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a  DB_INTERRUPT: {.
f180: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65      sqlite3_inte
f190: 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a  rrupt(pDb->db);.
f1a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f1b0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
f1c0: 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52  b nullvalue ?STR
f1d0: 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ING?.  **.  ** C
f1e0: 68 61 6e 67 65 20 74 65 78 74 20 75 73 65 64 20  hange text used 
f1f0: 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65  when a NULL come
f200: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
f210: 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54  database. If ?ST
f220: 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f  RING?.  ** is no
f230: 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
f240: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69  the current stri
f250: 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c  ng used for NULL
f260: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
f270: 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73 20  ** If STRING is 
f280: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54  present, then ST
f290: 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64  RING is returned
f2a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61  ..  **.  */.  ca
f2b0: 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a  se DB_NULLVALUE:
f2c0: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
f2d0: 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
f2e0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
f2f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f300: 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41  2, objv, "NULLVA
f310: 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  LUE");.      ret
f320: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f330: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
f340: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e  c==3 ){.      in
f350: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61  t len;.      cha
f360: 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47  r *zNull = Tcl_G
f370: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f380: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
f390: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f3a0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
f3b0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e  Tcl_Free(pDb->zN
f3c0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
f3d0: 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26      if( zNull &&
f3e0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
f3f0: 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54    pDb->zNull = T
f400: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
f410: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
f420: 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  ncpy(pDb->zNull,
f430: 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20   zNull, len);.  
f440: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
f450: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
f460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f470: 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
f480: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
f490: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
f4a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
f4b0: 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a  TextToObj(pDb->z
f4c0: 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65 61  Null));.    brea
f4d0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
f4e0: 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69  *     $db last_i
f4f0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a  nsert_rowid .  *
f500: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e  *.  ** Return an
f510: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
f520: 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20  s the ROWID for 
f530: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
f540: 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63  insert..  */.  c
f550: 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45  ase DB_LAST_INSE
f560: 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20  RT_ROWID: {.    
f570: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
f580: 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e  ;.    Tcl_WideIn
f590: 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28  t rowid;.    if(
f5a0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
f5b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f5c0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
f5d0: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
f5e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f5f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64  .    }.    rowid
f600: 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f   = sqlite3_last_
f610: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62  insert_rowid(pDb
f620: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75  ->db);.    pResu
f630: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
f640: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
f650: 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e     Tcl_SetWideIn
f660: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f  tObj(pResult, ro
f670: 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  wid);.    break;
f680: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
f690: 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  The DB_ONECOLUMN
f6a0: 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65   method is imple
f6b0: 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20  mented together 
f6c0: 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20  with DB_EVAL..  
f6d0: 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  */..  /*    $db 
f6e0: 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c  progress ?N CALL
f6f0: 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a  BACK?.  ** .  **
f700: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
f710: 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79  n callback every
f720: 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   N virtual machi
f730: 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65  ne opcodes while
f740: 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20   executing.  ** 
f750: 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
f760: 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53  case DB_PROGRESS
f770: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
f780: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
f790: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
f7a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
f7b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f7c0: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
f7d0: 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ss, 0);.      }.
f7e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
f7f0: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
f800: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
f810: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
f820: 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
f830: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
f840: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f850: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
f860: 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &N) ){.        
f870: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f880: 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
f890: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
f8a0: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
f8b0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
f8c0: 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d  ogress);.      }
f8d0: 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73  .      zProgress
f8e0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f8f0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
f900: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
f910: 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c  ( zProgress && l
f920: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
f930: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
f940: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
f950: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
f960: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67  emcpy(pDb->zProg
f970: 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c  ress, zProgress,
f980: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
f990: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
f9a0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30  b->zProgress = 0
f9b0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
f9c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
f9d0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
f9e0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f9f0: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
fa00: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
fa10: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
fa20: 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
fa30: 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
fa40: 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73  db, N, DbProgres
fa50: 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  sHandler, pDb);.
fa60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fa70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
fa80: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
fa90: 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  b->db, 0, 0, 0);
faa0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
fab0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fac0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
fad0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
fae0: 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29  v, "N CALLBACK")
faf0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
fb00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fb10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
fb20: 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66    /*    $db prof
fb30: 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ile ?CALLBACK?. 
fb40: 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72   **.  ** Make ar
fb50: 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e  rangements to in
fb60: 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43  voke the CALLBAC
fb70: 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  K routine after 
fb80: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
fb90: 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73  nt.  ** that has
fba0: 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20   run.  The text 
fbb0: 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74  of the SQL and t
fbc0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61  he amount of ela
fbd0: 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a  pse time are.  *
fbe0: 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  * appended to CA
fbf0: 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68  LLBACK before th
fc00: 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e  e script is run.
fc10: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
fc20: 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69  PROFILE: {.    i
fc30: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
fc40: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
fc50: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
fc60: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
fc70: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
fc80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fc90: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
fca0: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
fcb0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
fcc0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
fcd0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fce0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20   pDb->zProfile, 
fcf0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
fd00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
fd10: 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20  r *zProfile;.   
fd20: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
fd30: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
fd40: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ile ){.        T
fd50: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
fd60: 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  ofile);.      }.
fd70: 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d        zProfile =
fd80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
fd90: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
fda0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
fdb0: 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e  zProfile && len>
fdc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
fdd0: 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c  ->zProfile = Tcl
fde0: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
fdf0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
fe00: 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  y(pDb->zProfile,
fe10: 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31   zProfile, len+1
fe20: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fe30: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
fe40: 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  ofile = 0;.     
fe50: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
fe60: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
fe70: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
fe80: 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
fe90: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
fea0: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
feb0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44  lite3_profile(pD
fec0: 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65  b->db, DbProfile
fed0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
fee0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fef0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
ff00: 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ile(pDb->db, 0, 
ff10: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
ff20: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
ff30: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
ff40: 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79  **     $db rekey
ff50: 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   KEY.  **.  ** C
ff60: 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70  hange the encryp
ff70: 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  tion key on the 
ff80: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64  currently open d
ff90: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
ffa0: 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b  case DB_REKEY: {
ffb0: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  .    int nKey;. 
ffc0: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20     void *pKey;. 
ffd0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
ffe0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
fff0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10000 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29   2, objv, "KEY")
10010 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10020 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10030 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47      pKey = Tcl_G
10040 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
10050 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65  bj(objv[2], &nKe
10060 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  y);.#ifdef SQLIT
10070 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
10080 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b  rc = sqlite3_rek
10090 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79  ey(pDb->db, pKey
100a0 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  , nKey);.    if(
100b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
100c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
100d0 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
100e0 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  Str(rc), 0);.   
100f0 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
10100 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  R;.    }.#endif.
10110 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10120 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
10130 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53  b timeout MILLES
10140 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a  ECONDS.  **.  **
10150 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e   Delay for the n
10160 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
10170 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20  conds specified 
10180 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c  when a file is l
10190 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ocked..  */.  ca
101a0 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b  se DB_TIMEOUT: {
101b0 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20  .    int ms;.   
101c0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
101d0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
101e0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
101f0 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
10200 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72  CONDS");.      r
10210 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10220 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
10230 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
10240 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
10250 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
10260 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
10270 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
10280 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29  out(pDb->db, ms)
10290 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
102a0 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
102b0 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e    $db total_chan
102c0 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
102d0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
102e0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
102f0 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
10300 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
10310 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
10320 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
10330 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20   was created..  
10340 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54  */.  case DB_TOT
10350 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  AL_CHANGES: {.  
10360 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
10370 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
10380 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
10390 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
103a0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
103b0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
103c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
103d0 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
103e0 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
103f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
10400 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
10410 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74  ult, sqlite3_tot
10420 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  al_changes(pDb->
10430 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
10440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
10450 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43  b trace ?CALLBAC
10460 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
10470 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
10480 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
10490 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f  LBACK routine fo
104a0 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
104b0 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69  ment.  ** that i
104c0 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
104d0 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
104e0 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
104f0 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a  CALLBACK before.
10500 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75    ** it is execu
10510 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
10520 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20   DB_TRACE: {.   
10530 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
10540 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10550 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10560 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
10570 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
10580 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10590 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
105a0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
105b0 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
105c0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
105d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
105e0 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29   pDb->zTrace, 0)
105f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10600 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
10610 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69  *zTrace;.      i
10620 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
10630 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
10640 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
10650 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a  e(pDb->zTrace);.
10660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
10670 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  race = Tcl_GetSt
10680 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
10690 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
106a0 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20    if( zTrace && 
106b0 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
106c0 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54   pDb->zTrace = T
106d0 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
106e0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
106f0 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c  cpy(pDb->zTrace,
10700 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b   zTrace, len+1);
10710 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10720 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
10730 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  e = 0;.      }.#
10740 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10750 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69  IT_TRACE.      i
10760 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
10770 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
10780 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
10790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
107a0 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44  trace(pDb->db, D
107b0 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70  bTraceHandler, p
107c0 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
107d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
107e0 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
107f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
10800 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
10810 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
10820 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  *    $db transac
10830 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
10840 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
10850 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20  usive] SCRIPT.  
10860 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20  **.  ** Start a 
10870 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
10880 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61  (if we are not a
10890 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69  lready in the mi
108a0 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72  dst of a.  ** tr
108b0 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65  ansaction) and e
108c0 78 65 63 75 74 65 20 74 68 65 20 54 43 4c 20 73  xecute the TCL s
108d0 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 20 41  cript SCRIPT.  A
108e0 66 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a  fter SCRIPT.  **
108f0 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68   completes, eith
10900 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  er commit the tr
10910 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c  ansaction or rol
10920 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53 43 52  l it back if SCR
10930 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20  IPT.  ** throws 
10940 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f  an exception.  O
10950 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e  r if no new tran
10960 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  sation was start
10970 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  ed, do nothing..
10980 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78    ** pass the ex
10990 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68  ception on up th
109a0 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
109b0 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
109c0 77 61 73 20 69 6e 73 70 69 72 65 64 20 62 79 20  was inspired by 
109d0 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61  Dave Thomas's ta
109e0 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68  lk on Ruby at th
109f0 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65  e.  ** 2005 O'Re
10a00 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65  illy Open Source
10a10 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43   Convention (OSC
10a20 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ON)..  */.  case
10a30 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a   DB_TRANSACTION:
10a40 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 54 72 61   {.    int inTra
10a50 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ns;.    Tcl_Obj 
10a60 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f  *pScript;.    co
10a70 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e  nst char *zBegin
10a80 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20 20 20 20   = "BEGIN";.    
10a90 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
10aa0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
10ab0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10ac0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
10ad0 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54  , "[TYPE] SCRIPT
10ae0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10af0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10b00 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
10b10 33 20 29 7b 0a 20 20 20 20 20 20 70 53 63 72 69  3 ){.      pScri
10b20 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20  pt = objv[2];.  
10b30 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
10b40 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
10b50 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d  ar *TTYPE_strs[]
10b60 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65   = {.        "de
10b70 66 65 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c  ferred",   "excl
10b80 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69  usive",  "immedi
10b90 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b  ate", 0.      };
10ba0 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50  .      enum TTYP
10bb0 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20  E_enum {.       
10bc0 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c   TTYPE_DEFERRED,
10bd0 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45   TTYPE_EXCLUSIVE
10be0 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54  , TTYPE_IMMEDIAT
10bf0 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  E.      };.     
10c00 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20   int ttype;.    
10c10 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
10c20 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
10c30 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45  , objv[2], TTYPE
10c40 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74  _strs, "transact
10c50 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20  ion type",.     
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74 79           0, &tty
10c80 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pe) ){.        r
10c90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10cb0 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59  witch( (enum TTY
10cc0 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b  PE_enum)ttype ){
10cd0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54  .        case TT
10ce0 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20  YPE_DEFERRED:   
10cf0 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20   /* no-op */;   
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
10d10 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
10d20 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56  e TTYPE_EXCLUSIV
10d30 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42  E:   zBegin = "B
10d40 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b  EGIN EXCLUSIVE";
10d50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10d60 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45   case TTYPE_IMME
10d70 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20  DIATE:   zBegin 
10d80 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  = "BEGIN IMMEDIA
10d90 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  TE";  break;.   
10da0 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69     }.      pScri
10db0 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
10dc0 20 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73 20    }.    inTrans 
10dd0 3d 20 21 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  = !sqlite3_get_a
10de0 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64  utocommit(pDb->d
10df0 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54  b);.    if( !inT
10e00 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 28 76  rans ){.      (v
10e10 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
10e20 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e  (pDb->db, zBegin
10e30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
10e40 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45  }.    rc = Tcl_E
10e50 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
10e60 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
10e70 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73 20 29    if( !inTrans )
10e80 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
10e90 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 20 20 20 20  ar *zEnd;.      
10ea0 69 66 28 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f  if( rc==TCL_ERRO
10eb0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e  R ){.        zEn
10ec0 64 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a  d = "ROLLBACK";.
10ed0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
10ee0 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 43         zEnd = "C
10ef0 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 20 20 7d 0a  OMMIT";.      }.
10f00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10f10 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
10f20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20 29  zEnd, 0, 0, 0) )
10f30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10f40 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
10f50 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
10f60 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
10f70 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
10f80 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
10f90 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
10fa0 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
10fb0 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
10fc0 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
10fd0 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41  /.  case DB_UPDA
10fe0 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65  TE_HOOK: .  case
10ff0 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
11000 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74  K: {..    /* set
11010 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74   ppHook to point
11020 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20   at pUpdateHook 
11030 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  or pRollbackHook
11040 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a  , depending on .
11050 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b      ** whether [
11060 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d  $db update_hook]
11070 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63   or [$db rollbac
11080 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f  k_hook] was invo
11090 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
110a0 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b  Tcl_Obj **ppHook
110b0 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63  ; .    if( choic
110c0 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f  e==DB_UPDATE_HOO
110d0 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f  K ){.      ppHoo
110e0 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74  k = &pDb->pUpdat
110f0 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  eHook;.    }else
11100 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d  {.      ppHook =
11110 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   &pDb->pRollback
11120 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hook;.    }..   
11130 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
11140 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
11150 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
11160 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
11170 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b  jv, "?SCRIPT?");
11180 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  .       return T
11190 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
111a0 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20      if( *ppHook 
111b0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
111c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
111d0 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  , *ppHook);.    
111e0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
111f0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
11200 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
11210 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 48  k);.        *ppH
11220 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ook = 0;.      }
11230 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
11240 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
11250 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f  assert( !(*ppHoo
11260 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  k) );.      if( 
11270 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74  Tcl_GetCharLengt
11280 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a  h(objv[2])>0 ){.
11290 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20          *ppHook 
112a0 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20  = objv[2];.     
112b0 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
112c0 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
112d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
112e0 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f   sqlite3_update_
112f0 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70  hook(pDb->db, (p
11300 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f  Db->pUpdateHook?
11310 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a  DbUpdateHandler:
11320 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20 73 71  0), pDb);.    sq
11330 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
11340 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44 62  ook(pDb->db,(pDb
11350 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f  ->pRollbackHook?
11360 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65  DbRollbackHandle
11370 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20  r:0),pDb);..    
11380 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
11390 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a      $db version.
113a0 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
113b0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72   the version str
113c0 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74  ing for this dat
113d0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
113e0 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b  se DB_VERSION: {
113f0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
11400 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
11410 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65   *)sqlite3_libve
11420 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41  rsion(), TCL_STA
11430 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  TIC);.    break;
11440 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e  .  }...  } /* En
11450 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20  d of the SWITCH 
11460 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72  statement */.  r
11470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11480 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e  **   sqlite3 DBN
11490 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  AME FILENAME ?-v
114a0 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65  fs VFSNAME? ?-ke
114b0 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c  y KEY? ?-readonl
114c0 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20  y BOOLEAN?.**   
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114e0 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65          ?-create
114f0 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20   BOOLEAN?.**.** 
11500 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  This is the main
11510 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57   Tcl command.  W
11520 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22  hen the "sqlite"
11530 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a   Tcl command is.
11540 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73  ** invoked, this
11550 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f   routine runs to
11560 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f   process that co
11570 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mmand..**.** The
11580 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
11590 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61   DBNAME, is an a
115a0 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f  rbitrary name fo
115b0 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62  r a new.** datab
115c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
115d0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72   This command cr
115e0 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d  eates a new comm
115f0 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e  and named.** DBN
11600 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64  AME that is used
11610 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74   to control that
11620 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
11630 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
11640 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65  nnection is dele
11650 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e  ted when the DBN
11660 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  AME command is d
11670 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
11680 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11690 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
116a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
116b0 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  le..**.*/.static
116c0 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64   int DbMain(void
116d0 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70   *cd, Tcl_Interp
116e0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
116f0 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  jc,Tcl_Obj *cons
11700 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74  t*objv){.  Sqlit
11710 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a  eDb *p;.  void *
11720 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pKey = 0;.  int 
11730 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  nKey = 0;.  cons
11740 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
11750 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
11760 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
11770 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
11780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
11790 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  = 0;.  int flags
117a0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
117b0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
117c0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
117d0 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61   Tcl_DString tra
117e0 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b  nslatedFilename;
117f0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
11800 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
11810 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11820 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
11830 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
11840 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  rg,"-version")==
11850 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
11860 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11870 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rp,sqlite3_versi
11880 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74  on,0);.      ret
11890 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
118a0 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
118b0 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65  (zArg,"-has-code
118c0 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  c")==0 ){.#ifdef
118d0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
118e0 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  C.      Tcl_Appe
118f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11900 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20  "1",0);.#else.  
11910 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11920 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c  sult(interp,"0",
11930 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
11940 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
11960 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69  i=3; i+1<objc; i
11970 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  +=2){.    zArg =
11980 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11990 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  bjv[i]);.    if(
119a0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b   strcmp(zArg,"-k
119b0 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
119c0 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
119d0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
119e0 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79  objv[i+1], &nKey
119f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
11a00 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
11a10 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  vfs")==0 ){.    
11a20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 56 66    i++;.      zVf
11a30 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
11a40 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20  g(objv[i]);.    
11a50 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11a60 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c  (zArg, "-readonl
11a70 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
11a80 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
11a90 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
11aa0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
11ab0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
11ac0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11ad0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
11ae0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
11af0 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
11b00 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
11b10 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
11b20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
11b30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11b40 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
11b50 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
11b60 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
11b70 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
11b80 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
11b90 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11ba0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
11bb0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11bc0 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29  zArg, "-create")
11bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
11be0 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
11bf0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
11c00 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
11c10 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
11c20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11c30 20 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66       if( b && (f
11c40 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
11c50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20  EN_READONLY)==0 
11c60 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
11c70 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
11c80 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65  CREATE;.      }e
11c90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
11ca0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
11cb0 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
11cc0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
11cd0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11ce0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
11cf0 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c  known option: ",
11d00 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29   zArg, (char*)0)
11d10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11d20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11d30 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33    }.  if( objc<3
11d40 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20   || (objc&1)!=1 
11d50 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
11d60 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11d70 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20  1, objv, .      
11d80 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
11d90 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
11da0 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
11db0 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f  AN? ?-create BOO
11dc0 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66 20 53 51  LEAN?".#ifdef SQ
11dd0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
11de0 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44       " ?-key COD
11df0 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20  ECKEY?".#endif. 
11e00 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
11e10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11e20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
11e30 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29   p = (SqliteDb*)
11e40 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
11e50 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
11e60 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
11e70 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
11e80 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22   "malloc failed"
11e90 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
11ea0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11eb0 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ROR;.  }.  memse
11ec0 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
11ed0 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54  p));.  zFile = T
11ee0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
11ef0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
11f00 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54  .  zFile = Tcl_T
11f10 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
11f20 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20  (interp, zFile, 
11f30 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
11f40 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
11f50 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26  open_v2(zFile, &
11f60 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56  p->db, flags, zV
11f70 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  fs);.  Tcl_DStri
11f80 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74  ngFree(&translat
11f90 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  edFilename);.  i
11fa0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
11fb0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
11fc0 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72  >db) ){.    zErr
11fd0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
11fe0 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
11ff0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
12000 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
12010 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20  close(p->db);.  
12020 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d    p->db = 0;.  }
12030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
12040 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
12050 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
12060 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
12070 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a  Key, nKey);.  }.
12080 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
12090 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  db==0 ){.    Tcl
120a0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
120b0 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
120c0 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54  VOLATILE);.    T
120d0 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
120e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
120f0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
12100 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12110 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78  OR;.  }.  p->max
12120 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41  Stmt = NUM_PREPA
12130 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e  RED_STMTS;.  p->
12140 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
12150 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65  .  zArg = Tcl_Ge
12160 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
12170 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63  bjv[1], 0);.  Tc
12180 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
12190 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
121a0 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72   DbObjCmd, (char
121b0 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
121c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
121d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
121e0 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
121f0 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
12200 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
12210 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
12220 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
12230 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
12240 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
12250 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
12260 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
12270 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
12280 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
12290 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
122a0 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
122b0 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
122c0 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
122d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
122e0 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
122f0 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
12300 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
12310 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
12320 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
12330 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
12340 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
12350 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
12360 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
12370 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
12380 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
12390 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
123a0 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
123b0 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
123c0 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
123d0 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
123e0 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
123f0 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
12400 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
12410 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
12420 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
12430 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
12440 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
12450 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
12460 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
12470 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
12480 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
12490 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
124a0 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
124b0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
124c0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45  nformation..*/.E
124d0 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
124e0 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
124f0 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63  p *interp){.  Tc
12500 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
12510 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20  rp, "8.4", 0);. 
12520 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
12530 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
12540 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62  qlite3", (Tcl_Ob
12550 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
12560 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50  , 0, 0);.  Tcl_P
12570 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
12580 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43  , "sqlite3", PAC
12590 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
125a0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
125b0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
125c0 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a  qlite", (Tcl_Obj
125d0 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
125e0 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
125f0 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
12600 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43 4b 41   "sqlite", PACKA
12610 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72  GE_VERSION);.  r
12620 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
12630 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
12640 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
12650 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12660 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
12670 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
12680 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
12690 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
126a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
126b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
126c0 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
126d0 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
126e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
126f0 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
12700 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK; }..#ifndef S
12710 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
12720 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  NLY.EXTERN int S
12730 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
12740 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12750 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
12760 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
12770 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
12780 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ite_Init(Tcl_Int
12790 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
127a0 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
127b0 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54  t(interp); }.EXT
127c0 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53  ERN int Sqlite_S
127d0 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
127e0 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
127f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
12800 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
12810 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
12820 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
12830 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
12840 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
12850 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128a0 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  *****.** The cod
128b0 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  e that follows i
128c0 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
128d0 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69  standalone TCL i
128e0 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2a 20 74  nterpreters.** t
128f0 68 61 74 20 61 72 65 20 73 74 61 74 69 63 61 6c  hat are statical
12900 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74 68 20 53  ly linked with S
12910 51 4c 69 74 65 2e 20 20 0a 2a 2f 0a 0a 2f 2a 0a  QLite.  .*/../*.
12920 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
12930 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68  TCLSH is one, th
12940 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74  en put in code t
12950 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22  his for the.** "
12960 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68  main" routine th
12970 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69  at will initiali
12980 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20  ze Tcl and take 
12990 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74  input from.** st
129a0 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72  andard input, or
129b0 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61   if a file is na
129c0 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  med on the comma
129d0 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54  nd line.** the T
129e0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  CL interpreter r
129f0 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74  eads and evaluat
12a00 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f  es that file..*/
12a10 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74  .#if TCLSH==1.st
12a20 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
12a30 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c  oop[] =.  "set l
12a40 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69  ine {}\n".  "whi
12a50 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d  le {![eof stdin]
12a60 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b  } {\n".    "if {
12a70 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  $line!=\"\"} {\n
12a80 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
12a90 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c  onewline \"> \"\
12aa0 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  n".    "} else {
12ab0 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20  \n".      "puts 
12ac0 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c  -nonewline \"% \
12ad0 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  "\n".    "}\n". 
12ae0 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74     "flush stdout
12af0 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20  \n".    "append 
12b00 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e  line [gets stdin
12b10 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69  ]\n".    "if {[i
12b20 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69  nfo complete $li
12b30 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  ne]} {\n".      
12b40 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c  "if {[catch {upl
12b50 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72  evel #0 $line} r
12b60 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20  esult]} {\n".   
12b70 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72       "puts stder
12b80 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75  r \"Error: $resu
12b90 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d  lt\"\n".      "}
12ba0 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
12bb0 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
12bc0 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75       "puts $resu
12bd0 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e  lt\n".      "}\n
12be0 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e  ".      "set lin
12bf0 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65  e {}\n".    "} e
12c00 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
12c10 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c  append line \\n\
12c20 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22  n".    "}\n".  "
12c30 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f  }\n".;.#endif../
12c40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
12c50 6f 20 54 43 4c 53 48 20 69 73 20 74 77 6f 2c 20  o TCLSH is two, 
12c60 74 68 65 6e 20 67 65 74 20 74 68 65 20 6d 61 69  then get the mai
12c70 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20  n loop code out 
12c80 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61  of.** the separa
12c90 74 65 20 66 69 6c 65 20 22 73 70 61 63 65 61 6e  te file "spacean
12ca0 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69  al_tcl.h"..*/.#i
12cb0 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69  f TCLSH==2.stati
12cc0 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
12cd0 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22  [] = .#include "
12ce0 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22  spaceanal_tcl.h"
12cf0 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .;.#endif..#defi
12d00 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
12d10 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
12d20 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
12d30 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
12d40 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
12d50 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
12d60 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12d70 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  rp;.  Tcl_FindEx
12d80 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
12d90 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63  );.  interp = Tc
12da0 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
12db0 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  ;.  Sqlite3_Init
12dc0 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66  (interp);.#ifdef
12dd0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
12de0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
12df0 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Md5_Init(Tcl_Int
12e00 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
12e10 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66  n int Sqliteconf
12e20 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ig_Init(Tcl_Inte
12e30 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
12e40 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
12e50 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12e60 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
12e70 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_I
12e80 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
12e90 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
12ea0 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
12eb0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
12ec0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
12ed0 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
12ee0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
12ef0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
12f00 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
12f10 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
12f20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
12f30 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f  etest6_Init(Tcl_
12f40 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
12f50 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
12f60 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est7_Init(Tcl_In
12f70 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
12f80 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
12f90 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t8_Init(Tcl_Inte
12fa0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
12fb0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 39   int Sqlitetest9
12fc0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12fd0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
12fe0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
12ff0 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
13000 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13010 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
13020 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c  autoext_Init(Tcl
13030 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
13040 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
13050 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54  test_func_Init(T
13060 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
13070 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
13080 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
13090 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
130a0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
130b0 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
130c0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
130d0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
130e0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63 68  nt Sqlitetestsch
130f0 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ema_Init(Tcl_Int
13100 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
13110 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
13120 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  sse_Init(Tcl_Int
13130 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
13140 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
13150 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f  tclvar_Init(Tcl_
13160 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
13170 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
13180 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54  estThread_Init(T
13190 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
131a0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
131b0 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e  tetestOnefile_In
131c0 69 74 28 29 3b 0a 0a 20 20 20 20 4d 64 35 5f 49  it();..    Md5_I
131d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
131e0 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e   Sqliteconfig_In
131f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13200 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
13210 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13220 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69  litetest2_Init(i
13230 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13240 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74  tetest3_Init(int
13250 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
13260 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72  test4_Init(inter
13270 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
13280 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st5_Init(interp)
13290 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
132a0 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  6_Init(interp);.
132b0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f      Sqlitetest7_
132c0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
132d0 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e    Sqlitetest8_In
132e0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
132f0 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
13300 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13310 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
13320 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13330 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65  Sqlitetest_autoe
13340 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  xt_Init(interp);
13350 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
13360 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  func_Init(interp
13370 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
13380 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74  t_hexio_Init(int
13390 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
133a0 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74  test_malloc_Init
133b0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
133c0 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49  litetestschema_I
133d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
133e0 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61   Sqlitetesttclva
133f0 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  r_Init(interp);.
13400 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 54 68      SqlitetestTh
13410 72 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72 70  read_Init(interp
13420 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
13430 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69 6e  tOnefile_Init(in
13440 74 65 72 70 29 3b 0a 0a 23 69 66 64 65 66 20 53  terp);..#ifdef S
13450 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71  QLITE_SSE.    Sq
13460 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74  litetestsse_Init
13470 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
13480 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
13490 28 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c  ( argc>=2 || TCL
134a0 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  SH==2 ){.    int
134b0 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 41 72   i;.    char zAr
134c0 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69  gc[32];.    sqli
134d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
134e0 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41 72 67  eof(zArgc), zArg
134f0 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d 28 33  c, "%d", argc-(3
13500 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20 20 54 63  -TCLSH));.    Tc
13510 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
13520 22 61 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54  "argc", zArgc, T
13530 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
13540 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
13550 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61  interp,"argv0",a
13560 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41  rgv[1],TCL_GLOBA
13570 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
13580 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
13590 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47  argv", "", TCL_G
135a0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
135b0 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20   for(i=3-TCLSH; 
135c0 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
135d0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
135e0 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61  nterp, "argv", a
135f0 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  rgv[i],.        
13600 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c    TCL_GLOBAL_ONL
13610 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45  Y | TCL_LIST_ELE
13620 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e  MENT | TCL_APPEN
13630 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a  D_VALUE);.    }.
13640 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31      if( TCLSH==1
13650 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65   && Tcl_EvalFile
13660 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
13670 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  )!=TCL_OK ){.   
13680 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13690 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61  Info = Tcl_GetVa
136a0 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  r(interp, "error
136b0 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  Info", TCL_GLOBA
136c0 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69  L_ONLY);.      i
136d0 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49  f( zInfo==0 ) zI
136e0 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65  nfo = interp->re
136f0 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69  sult;.      fpri
13700 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
13710 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49  %s\n", *argv, zI
13720 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nfo);.      retu
13730 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
13740 20 20 69 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c    if( argc<=1 ||
13750 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20   TCLSH==2 ){.   
13760 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
13770 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f  interp, zMainloo
13780 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
13790 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
137a0 54 43 4c 53 48 20 2a 2f 0a                       TCLSH */.