/ Hex Artifact Content
Login

Artifact f3414b2d6bc37e6760b49c9abd3504ff69f4441b:


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 31 38 36 20 32 30 30 37  e.c,v 1.186 2007
0220: 2f 30 35 2f 30 34 20 31 39 3a 30 33 3a 30 33 20  /05/04 19:03:03 
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 22  t.h".# include "
0310: 68 61 73 68 2e 68 22 0a 23 20 69 6e 63 6c 75 64  hash.h".# includ
0320: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 20 69  e <stdlib.h>.# i
0330: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0340: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 61 73 73  >.# include <ass
0350: 65 72 74 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ert.h>.# include
0360: 20 3c 63 74 79 70 65 2e 68 3e 0a 23 65 6e 64 69   <ctype.h>.#endi
0370: 66 0a 0a 2f 2a 0a 20 2a 20 57 69 6e 64 6f 77 73  f../*. * Windows
0380: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
0390: 68 69 63 68 20 73 79 6d 62 6f 6c 73 20 74 6f 20  hich symbols to 
03a0: 65 78 70 6f 72 74 2e 20 20 55 6e 69 78 20 64 6f  export.  Unix do
03b0: 65 73 20 6e 6f 74 2e 0a 20 2a 20 42 55 49 4c 44  es not.. * BUILD
03c0: 5f 73 71 6c 69 74 65 20 73 68 6f 75 6c 64 20 62  _sqlite should b
03d0: 65 20 75 6e 64 65 66 69 6e 65 64 20 66 6f 72 20  e undefined for 
03e0: 55 6e 69 78 2e 0a 20 2a 2f 0a 23 69 66 64 65 66  Unix.. */.#ifdef
03f0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 0a 23 75   BUILD_sqlite.#u
0400: 6e 64 65 66 20 54 43 4c 5f 53 54 4f 52 41 47 45  ndef TCL_STORAGE
0410: 5f 43 4c 41 53 53 0a 23 64 65 66 69 6e 65 20 54  _CLASS.#define T
0420: 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53  CL_STORAGE_CLASS
0430: 20 44 4c 4c 45 58 50 4f 52 54 0a 23 65 6e 64 69   DLLEXPORT.#endi
0440: 66 20 2f 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74  f /* BUILD_sqlit
0450: 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4e 55  e */..#define NU
0460: 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  M_PREPARED_STMTS
0470: 20 31 30 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f   10.#define MAX_
0480: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31  PREPARED_STMTS 1
0490: 30 30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c  00../*.** If TCL
04a0: 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e 64 20   uses UTF-8 and 
04b0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66 69 67  SQLite is config
04c0: 75 72 65 64 20 74 6f 20 75 73 65 20 69 73 6f 38  ured to use iso8
04d0: 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20  859, then we.** 
04e0: 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74 72 61  have to do a tra
04f0: 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f  nslation when go
0500: 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20  ing between the 
0510: 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20 0a 2a  two.  Set the .*
0520: 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f  * UTF_TRANSLATIO
0530: 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f 20 74  N_NEEDED macro t
0540: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
0550: 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a  we need to do.**
0560: 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f   this translatio
0570: 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  n.  .*/.#if defi
0580: 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29  ned(TCL_UTF_MAX)
0590: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
05a0: 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65 66 69  ITE_UTF8).# defi
05b0: 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ne UTF_TRANSLATI
05c0: 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e 64  ON_NEEDED 1.#end
05d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51  if../*.** New SQ
05e0: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  L functions can 
05f0: 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43  be created as TC
0600: 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68  L scripts.  Each
0610: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a   such function.*
0620: 2a 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62  * is described b
0630: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  y an instance of
0640: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0650: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
0660: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 46  edef struct SqlF
0670: 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72  unc SqlFunc;.str
0680: 75 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20  uct SqlFunc {.  
0690: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
06a0: 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  rp;   /* The TCL
06b0: 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78   interpret to ex
06c0: 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69  ecute the functi
06d0: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  on */.  Tcl_Obj 
06e0: 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20 2f 2a  *pScript;     /*
06f0: 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70   The Tcl_Obj rep
0700: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
0710: 68 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69  he script */.  i
0720: 6e 74 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20  nt useEvalObjv; 
0730: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0740: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
0750: 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a  e Tcl_EvalObjv *
0760: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
0780: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
0790: 6f 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20  on */.  SqlFunc 
07a0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a  *pNext;       /*
07b0: 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f   Next function o
07c0: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68  n the list of th
07d0: 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  em all */.};../*
07e0: 0a 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f  .** New collatio
07f0: 6e 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63  n sequences func
0800: 74 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61  tion can be crea
0810: 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70  ted as TCL scrip
0820: 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a  ts.  Each such.*
0830: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65  * function is de
0840: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0850: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0860: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0870: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0880: 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20  ruct SqlCollate 
0890: 53 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75  SqlCollate;.stru
08a0: 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a  ct SqlCollate {.
08b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
08c0: 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54  terp;   /* The T
08d0: 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20  CL interpret to 
08e0: 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63  execute the func
08f0: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
0900: 7a 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20  zScript;        
0910: 2f 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f  /* The script to
0920: 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c   be run */.  Sql
0930: 43 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20  Collate *pNext; 
0940: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
0950: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
0960: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
0970: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  ;../*.** Prepare
0980: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  d statements are
0990: 20 63 61 63 68 65 64 20 66 6f 72 20 66 61 73 74   cached for fast
09a0: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45  er execution.  E
09b0: 61 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  ach prepared.** 
09c0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73  statement is des
09d0: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
09e0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
09f0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0a00: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0a10: 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  uct SqlPreparedS
0a20: 74 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  tmt SqlPreparedS
0a30: 74 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50  tmt;.struct SqlP
0a40: 72 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20  reparedStmt {.  
0a50: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
0a60: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
0a70: 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20   in linked list 
0a80: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
0a90: 53 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a  Stmt *pPrev;  /*
0aa0: 20 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65   Previous on the
0ab0: 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
0ac0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
0ad0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
0ae0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
0af0: 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20  .  int nSql;    
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
0b10: 68 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a  hars in zSql[] *
0b20: 2f 0a 20 20 63 68 61 72 20 7a 53 71 6c 5b 31 5d  /.  char zSql[1]
0b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0b40: 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  Text of the SQL 
0b50: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a  statement */.};.
0b60: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0b70: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
0b80: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 3b  IncrblobChannel;
0b90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ../*.** There is
0ba0: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
0bb0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0bc0: 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20  for each SQLite 
0bd0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74  database.** that
0be0: 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
0bf0: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54   by the SQLite T
0c00: 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  CL interface..*/
0c10: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0c20: 53 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44  SqliteDb SqliteD
0c30: 62 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65  b;.struct Sqlite
0c40: 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db {.  sqlite3 *
0c50: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
0c60: 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22 20    /* The "real" 
0c70: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
0c80: 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52 53  re. MUST BE FIRS
0c90: 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  T */.  Tcl_Inter
0ca0: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20 20  p *interp;      
0cb0: 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72    /* The interpr
0cc0: 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  eter used for th
0cd0: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
0ce0: 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20 20   char *zBusy;   
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0d00: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
0d10: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0d20: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20  ar *zCommit;    
0d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d40: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c  commit hook call
0d50: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
0d60: 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 20    char *zTrace; 
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0d80: 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62 61  The trace callba
0d90: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0da0: 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20  char *zProfile; 
0db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0dc0: 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61  e profile callba
0dd0: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0de0: 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b  char *zProgress;
0df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0e00: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
0e10: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
0e20: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20 20   char *zAuth;   
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0e40: 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  he authorization
0e50: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0e60: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75  e */.  char *zNu
0e70: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
0e80: 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 73 75 62    /* Text to sub
0e90: 73 74 69 74 75 74 65 20 66 6f 72 20 61 6e 20 53  stitute for an S
0ea0: 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f  QL NULL value */
0eb0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e  .  SqlFunc *pFun
0ec0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
0ed0: 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 66 75 6e   List of SQL fun
0ee0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f  ctions */.  Tcl_
0ef0: 4f 62 6a 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b  Obj *pUpdateHook
0f00: 3b 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;      /* Update
0f10: 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66   hook script (if
0f20: 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f   any) */.  Tcl_O
0f30: 62 6a 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  bj *pRollbackHoo
0f40: 6b 3b 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63  k;    /* Rollbac
0f50: 6b 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69  k hook script (i
0f60: 66 20 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43  f any) */.  SqlC
0f70: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
0f80: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
0f90: 66 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  f SQL collation 
0fa0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
0fb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
0fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
0fd0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74  urn code of most
0fe0: 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
0ff0: 65 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f  exec() */.  Tcl_
1000: 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65  Obj *pCollateNee
1010: 64 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74  ded;   /* Collat
1020: 69 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70  ion needed scrip
1030: 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  t */.  SqlPrepar
1040: 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74  edStmt *stmtList
1050: 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65  ; /* List of pre
1060: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
1070: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
1080: 53 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20  Stmt *stmtLast; 
1090: 2f 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e  /* Last statemen
10a0: 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  t in the list */
10b0: 0a 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20  .  int maxStmt; 
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d0: 20 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75   The next maximu
10e0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74  m number of stmt
10f0: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  List */.  int nS
1100: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1110: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1120: 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  f statements in 
1130: 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 49 6e  stmtList */.  In
1140: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1150: 49 6e 63 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b  Incrblob;/* Link
1160: 65 64 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  ed list of open 
1170: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1180: 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  s */.};..struct 
1190: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
11a0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
11b0: 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a   *pBlob;      /*
11c0: 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20 68 61   sqlite3 blob ha
11d0: 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65  ndle */.  Sqlite
11e0: 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
11f0: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
1200: 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  d database conne
1210: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
1220: 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Seek;           
1230: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1240: 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  seek offset */. 
1250: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
1260: 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68  nnel;      /* Ch
1270: 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69 65 72  annel identifier
1280: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1290: 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20  annel *pNext;   
12a0: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
12b0: 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62  f all open incrb
12c0: 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  lob channels */.
12d0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
12e0: 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c  l *pPrev;   /* L
12f0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
1300: 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20  l open incrblob 
1310: 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a  channels */.};..
1320: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1330: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a  MIT_INCRBLOB./*.
1340: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 69 6e 63  ** Close all inc
1350: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 6f  rblob channels o
1360: 70 65 6e 65 64 20 75 73 69 6e 67 20 64 61 74 61  pened using data
1370: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1380: 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pDb..** This is 
1390: 63 61 6c 6c 65 64 20 77 68 65 6e 20 73 68 75 74  called when shut
13a0: 74 69 6e 67 20 64 6f 77 6e 20 74 68 65 20 64 61  ting down the da
13b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
13d0: 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43  d closeIncrblobC
13e0: 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74 65 44 62  hannels(SqliteDb
13f0: 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63 72 62 6c   *pDb){.  Incrbl
1400: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20  obChannel *p;.  
1410: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1420: 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70  *pNext;..  for(p
1430: 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b  =pDb->pIncrblob;
1440: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
1450: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
1460: 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  xt;..    /* Note
1470: 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72 65 67 69  : Calling unregi
1480: 73 74 65 72 20 68 65 72 65 20 63 61 6c 6c 20 54  ster here call T
1490: 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74 68 65 20  cl_Close on the 
14a0: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
14b0: 2c 20 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  , .    ** which 
14c0: 64 65 6c 65 74 65 73 20 74 68 65 20 49 6e 63 72  deletes the Incr
14d0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75  blobChannel stru
14e0: 63 74 75 72 65 20 61 74 20 2a 70 2e 20 53 6f 20  cture at *p. So 
14f0: 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 61  do not.    ** ca
1500: 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29 20 68 65  ll Tcl_Free() he
1510: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54  re..    */.    T
1520: 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61  cl_UnregisterCha
1530: 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  nnel(pDb->interp
1540: 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20  , p->channel);. 
1550: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
1560: 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  e an incremental
1570: 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a   blob channel..*
1580: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1590: 72 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69 65 6e  rblobClose(Clien
15a0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
15b0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
15c0: 69 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63 72 62  interp){.  Incrb
15d0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
15e0: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
15f0: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
1600: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
1610: 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
1620: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71 6c 69  ->pBlob);.  sqli
1630: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 44 62  te3 *db = p->pDb
1640: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ->db;..  /* Remo
1650: 76 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 66  ve the channel f
1660: 72 6f 6d 20 74 68 65 20 53 71 6c 69 74 65 44 62  rom the SqliteDb
1670: 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e  .pIncrblob list.
1680: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65   */.  if( p->pNe
1690: 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
16a0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
16b0: 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Prev;.  }.  if( 
16c0: 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
16d0: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
16e0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
16f0: 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 70 49    if( p->pDb->pI
1700: 6e 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20  ncrblob==p ){.  
1710: 20 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62    p->pDb->pIncrb
1720: 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  lob = p->pNext;.
1730: 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74    }..  /* Free t
1740: 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  he IncrblobChann
1750: 65 6c 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  el structure */.
1760: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
1770: 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63   *)p);..  if( rc
1780: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1790: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
17a0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
17b0: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
17c0: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
17d0: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  E);.    return T
17e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
17f0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1800: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
1810: 61 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72 65 6d  a from an increm
1820: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
1830: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1840: 74 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 28  t incrblobInput(
1850: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  .  ClientData in
1860: 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 63  stanceData, .  c
1870: 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74  har *buf, .  int
1880: 20 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e 74 20   bufSize,.  int 
1890: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
18a0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
18b0: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
18c0: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
18d0: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e  nceData;.  int n
18e0: 52 65 61 64 20 3d 20 62 75 66 53 69 7a 65 3b 20  Read = bufSize; 
18f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1900: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
1910: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  ad */.  int nBlo
1920: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1930: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
1940: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a  ze of the blob *
1950: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72   /* sqlite error
1980: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f   code */..  nBlo
1990: 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  b = sqlite3_blob
19a0: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
19b0: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65  ;.  if( (p->iSee
19c0: 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62 20 29  k+nRead)>nBlob )
19d0: 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d 20 6e 42  {.    nRead = nB
19e0: 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20 20  lob-p->iSeek;.  
19f0: 7d 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 3d 30  }.  if( nRead<=0
1a00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1a10: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
1a20: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
1a30: 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20  p->pBlob, (void 
1a40: 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c 20 70 2d  *)buf, nRead, p-
1a50: 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72  >iSeek);.  if( r
1a60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a70: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
1a80: 72 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  r = rc;.    retu
1a90: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d  rn -1;.  }..  p-
1aa0: 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61 64 3b  >iSeek += nRead;
1ab0: 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 61 64 3b  .  return nRead;
1ac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
1ad0: 64 61 74 61 20 74 6f 20 61 6e 20 69 6e 63 72 65  data to an incre
1ae0: 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e  mental blob chan
1af0: 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nel..*/.static i
1b00: 6e 74 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75  nt incrblobOutpu
1b10: 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1b20: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
1b30: 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66   CONST char *buf
1b40: 2c 20 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65  , .  int toWrite
1b50: 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f  ,.  int *errorCo
1b60: 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62  dePtr.){.  Incrb
1b70: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
1b80: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
1b90: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
1ba0: 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
1bb0: 74 6f 57 72 69 74 65 3b 20 20 20 20 20 20 20 20  toWrite;        
1bc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1bd0: 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  es to write */. 
1be0: 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20   int nBlob;     
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
1c10: 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74  he blob */.  int
1c20: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1c40: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
1c50: 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c  /..  nBlob = sql
1c60: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
1c70: 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  p->pBlob);.  if(
1c80: 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74   (p->iSeek+nWrit
1c90: 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20  e)>nBlob ){.    
1ca0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1cb0: 45 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75  EINVAL;.    retu
1cc0: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28  rn -1;.  }.  if(
1cd0: 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20   nWrite<=0 ){.  
1ce0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1cf0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1d00: 62 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42  blob_write(p->pB
1d10: 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66  lob, (void *)buf
1d20: 2c 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65  , nWrite, p->iSe
1d30: 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ek);.  if( rc!=S
1d40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d50: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1d60: 45 49 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  EIO;.    return 
1d70: 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53  -1;.  }..  p->iS
1d80: 65 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  eek += nWrite;. 
1d90: 20 72 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a   return nWrite;.
1da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e  }../*.** Seek an
1db0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
1dc0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
1dd0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
1de0: 62 53 65 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44  bSeek(.  ClientD
1df0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
1e00: 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74  , .  long offset
1e10: 2c 0a 20 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65  ,.  int seekMode
1e20: 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f  ,.  int *errorCo
1e30: 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62  dePtr.){.  Incrb
1e40: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
1e50: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
1e60: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
1e70: 0a 0a 20 20 73 77 69 74 63 68 28 20 73 65 65 6b  ..  switch( seek
1e80: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Mode ){.    case
1e90: 20 53 45 45 4b 5f 53 45 54 3a 0a 20 20 20 20 20   SEEK_SET:.     
1ea0: 20 70 2d 3e 69 53 65 65 6b 20 3d 20 6f 66 66 73   p->iSeek = offs
1eb0: 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
1ec0: 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 43  .    case SEEK_C
1ed0: 55 52 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65  UR:.      p->iSe
1ee0: 65 6b 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20  ek += offset;.  
1ef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1f00: 61 73 65 20 53 45 45 4b 5f 45 4e 44 3a 0a 20 20  ase SEEK_END:.  
1f10: 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 73      p->iSeek = s
1f20: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
1f30: 73 28 70 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f 66  s(p->pBlob) + of
1f40: 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  fset;.      brea
1f50: 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
1f60: 20 61 73 73 65 72 74 28 21 22 42 61 64 20 73 65   assert(!"Bad se
1f70: 65 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a 20  ekMode");.  }.. 
1f80: 20 72 65 74 75 72 6e 20 70 2d 3e 69 53 65 65 6b   return p->iSeek
1f90: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  ;.}...static voi
1fa0: 64 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 28  d incrblobWatch(
1fb0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
1fc0: 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64  nceData, int mod
1fd0: 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20  e){ .  /* NO-OP 
1fe0: 2a 2f 20 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  */ .}.static int
1ff0: 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 28   incrblobHandle(
2000: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
2010: 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 64 69 72  nceData, int dir
2020: 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 50  , ClientData *hP
2030: 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43  tr){.  return TC
2040: 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74  L_ERROR;.}..stat
2050: 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79  ic Tcl_ChannelTy
2060: 70 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  pe IncrblobChann
2070: 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 22 69 6e  elType = {.  "in
2080: 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  crblob",        
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 2f 2a 20 74 79 70 65 4e 61 6d 65 20 20 20 20 20  /* typeName     
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 54 43 4c          */.  TCL
20d0: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e  _CHANNEL_VERSION
20e0: 5f 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  _2,             
20f0: 2f 2a 20 76 65 72 73 69 6f 6e 20 20 20 20 20 20  /* version      
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2120: 72 62 6c 6f 62 43 6c 6f 73 65 2c 20 20 20 20 20  rblobClose,     
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 2f 2a 20 63 6c 6f 73 65 50 72 6f 63 20 20 20 20  /* closeProc    
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2170: 72 62 6c 6f 62 49 6e 70 75 74 2c 20 20 20 20 20  rblobInput,     
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 2f 2a 20 69 6e 70 75 74 50 72 6f 63 20 20 20 20  /* inputProc    
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
21c0: 72 62 6c 6f 62 4f 75 74 70 75 74 2c 20 20 20 20  rblobOutput,    
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 2f 2a 20 6f 75 74 70 75 74 50 72 6f 63 20 20 20  /* outputProc   
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2210: 72 62 6c 6f 62 53 65 65 6b 2c 20 20 20 20 20 20  rblobSeek,      
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 2f 2a 20 73 65 65 6b 50 72 6f 63 20 20 20 20 20  /* seekProc     
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 2f 2a 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63  /* setOptionProc
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 2f 2a 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63  /* getOptionProc
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2300: 72 62 6c 6f 62 57 61 74 63 68 2c 20 20 20 20 20  rblobWatch,     
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 2f 2a 20 77 61 74 63 68 50 72 6f 63 20 28 74 68  /* watchProc (th
2330: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 29 20 20  is is a no-op)  
2340: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2350: 72 62 6c 6f 62 48 61 6e 64 6c 65 2c 20 20 20 20  rblobHandle,    
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 2f 2a 20 67 65 74 48 61 6e 64 6c 65 50 72 6f 63  /* getHandleProc
2380: 20 28 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73   (always returns
2390: 20 65 72 72 6f 72 29 20 2a 2f 0a 20 20 30 2c 20   error) */.  0, 
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 2f 2a 20 63 6c 6f 73 65 32 50 72 6f 63 20 20 20  /* close2Proc   
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63  /* blockModeProc
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 2f 2a 20 66 6c 75 73 68 50 72 6f 63 20 20 20 20  /* flushProc    
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 2f 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63 20 20  /* handlerProc  
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 2f 2a 20 77 69 64 65 53 65 65 6b 50 72 6f 63 20  /* wideSeekProc 
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 2f 2a 20 74 68 72 65 61 64 41 63 74 69 6f 6e 50  /* threadActionP
2560: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2570: 20 20 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f          */.};../
2580: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2590: 77 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  w incrblob chann
25a0: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
25b0: 74 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62  t createIncrblob
25c0: 43 68 61 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f 49  Channel(.  Tcl_I
25d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
25e0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c    SqliteDb *pDb,
25f0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
2600: 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zDb,.  const cha
2610: 72 20 2a 7a 54 61 62 6c 65 2c 20 0a 20 20 63 6f  r *zTable, .  co
2620: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
2630: 6e 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  n, .  sqlite_int
2640: 36 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69  64 iRow,.  int i
2650: 73 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49  sReadonly.){.  I
2660: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2670: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
2680: 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71   = pDb->db;.  sq
2690: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
26a0: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
26b0: 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52  nt flags = TCL_R
26c0: 45 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64 6f  EADABLE|(isReado
26d0: 6e 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52  nly ? 0 : TCL_WR
26e0: 49 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54  ITABLE);..  /* T
26f0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2700: 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65  used to name the
2710: 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72   channels: "incr
2720: 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74  blob_[incr count
2730: 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69  ]" */.  static i
2740: 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  nt count = 0;.  
2750: 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34  char zChannel[64
2760: 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ];..  rc = sqlit
2770: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c  e3_blob_open(db,
2780: 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43   zDb, zTable, zC
2790: 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73  olumn, iRow, !is
27a0: 52 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62  Readonly, &pBlob
27b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
27c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
27d0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
27e0: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
27f0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
2800: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
2810: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  E);.    return T
2820: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2830: 20 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68   p = (IncrblobCh
2840: 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f  annel *)Tcl_Allo
2850: 63 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f  c(sizeof(Incrblo
2860: 62 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d  bChannel));.  p-
2870: 3e 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d  >iSeek = 0;.  p-
2880: 3e 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a  >pBlob = pBlob;.
2890: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
28a0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e  ntf(sizeof(zChan
28b0: 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20  nel), zChannel, 
28c0: 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b  "incrblob_%d", +
28d0: 2b 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68  +count);.  p->ch
28e0: 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61  annel = Tcl_Crea
28f0: 74 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62  teChannel(&Incrb
2900: 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20  lobChannelType, 
2910: 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61  zChannel, p, fla
2920: 67 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73  gs);.  Tcl_Regis
2930: 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  terChannel(inter
2940: 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a  p, p->channel);.
2950: 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
2960: 65 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20  ew channel into 
2970: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
2980: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
2990: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62    p->pNext = pDb
29a0: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70  ->pIncrblob;.  p
29b0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69  ->pPrev = 0;.  i
29c0: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
29d0: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
29e0: 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44  ev = p;.  }.  pD
29f0: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70  b->pIncrblob = p
2a00: 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62  ;.  p->pDb = pDb
2a10: 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  ;..  Tcl_SetResu
2a20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
2a30: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
2a40: 6c 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c  lName(p->channel
2a50: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
2a60: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2a70: 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65  K;.}.#else  /* e
2a80: 6c 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20 22  lse clause for "
2a90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2aa0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f  MIT_INCRBLOB" */
2ab0: 0a 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73 65  .  #define close
2ac0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
2ad0: 28 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (pDb).#endif../*
2ae0: 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20  .** Look at the 
2af0: 73 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e  script prefix in
2b00: 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20   pCmd.  We will 
2b10: 62 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69  be executing thi
2b20: 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65  s script.** afte
2b30: 72 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e  r first appendin
2b40: 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72  g one or more ar
2b50: 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72  guments.  This r
2b60: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a  outine analyzes.
2b70: 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f  ** the script to
2b80: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61   see if it is sa
2b90: 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76  fe to use Tcl_Ev
2ba0: 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20  alObjv() on the 
2bb0: 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72  script.** rather
2bc0: 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67   than the more g
2bd0: 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45  eneral Tcl_EvalE
2be0: 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62  x().  Tcl_EvalOb
2bf0: 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20  jv() is much.** 
2c00: 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63  faster..**.** Sc
2c10: 72 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73  ripts that are s
2c20: 61 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20  afe to use with 
2c30: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63  Tcl_EvalObjv() c
2c40: 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
2c50: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c  command name fol
2c60: 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72  lowed by zero or
2c70: 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20   more arguments 
2c80: 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72  with no [...] or
2c90: 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f   $.** or {...} o
2ca0: 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61  r ; to be seen a
2cb0: 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63  nywhere.  Most c
2cc0: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20  allback scripts 
2cd0: 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75  consist.** of ju
2ce0: 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  st a single proc
2cf0: 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74  edure name and t
2d00: 68 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65  hey meet this re
2d10: 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  quirement..*/.st
2d20: 61 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55  atic int safeToU
2d30: 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49  seEvalObjv(Tcl_I
2d40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54  nterp *interp, T
2d50: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20  cl_Obj *pCmd){. 
2d60: 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79   /* We could try
2d70: 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
2d80: 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28   with Tcl_Parse(
2d90: 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  ).  But we will 
2da0: 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73  instead.  ** jus
2db0: 74 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f  t do a search fo
2dc0: 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72  r forbidden char
2dd0: 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20  acters.  If any 
2de0: 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e  of the forbidden
2df0: 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73  .  ** characters
2e00: 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c   appear in pCmd,
2e10: 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20   we will report 
2e20: 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e  the string as un
2e30: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e  safe..  */.  con
2e40: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  st char *z;.  in
2e50: 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47  t n;.  z = Tcl_G
2e60: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2e70: 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69  pCmd, &n);.  whi
2e80: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
2e90: 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b     int c = *(z++
2ea0: 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24  );.    if( c=='$
2eb0: 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63  ' || c=='[' || c
2ec0: 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30  ==';' ) return 0
2ed0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
2ee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
2ef0: 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63  an SqlFunc struc
2f00: 74 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69  ture with the gi
2f10: 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72  ven name.  Or cr
2f20: 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e  eate a new.** on
2f30: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
2f40: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66   one cannot be f
2f50: 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20  ound.  Return a 
2f60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
2f70: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
2f80: 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a  static SqlFunc *
2f90: 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69  findSqlFunc(Sqli
2fa0: 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74  teDb *pDb, const
2fb0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
2fc0: 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e   SqlFunc *p, *pN
2fd0: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  ew;.  int i;.  p
2fe0: 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29  New = (SqlFunc*)
2ff0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
3000: 66 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65  f(*pNew) + strle
3010: 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a  n(zName) + 1 );.
3020: 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20    pNew->zName = 
3030: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
3040: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d  .  for(i=0; zNam
3050: 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77  e[i]; i++){ pNew
3060: 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c  ->zName[i] = tol
3070: 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20  ower(zName[i]); 
3080: 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b  }.  pNew->zName[
3090: 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  i] = 0;.  for(p=
30a0: 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70  pDb->pFunc; p; p
30b0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20  =p->pNext){ .   
30c0: 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a   if( strcmp(p->z
30d0: 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d  Name, pNew->zNam
30e0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  e)==0 ){.      T
30f0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
3100: 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75  New);.      retu
3110: 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn p;.    }.  }.
3120: 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d    pNew->interp =
3130: 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20   pDb->interp;.  
3140: 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20  pNew->pScript = 
3150: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  0;.  pNew->pNext
3160: 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20   = pDb->pFunc;. 
3170: 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e   pDb->pFunc = pN
3180: 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ew;.  return pNe
3190: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61  w;.}../*.** Fina
31a0: 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20  lize and free a 
31b0: 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64  list of prepared
31c0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73   statements.*/.s
31d0: 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68  tatic void flush
31e0: 53 74 6d 74 43 61 63 68 65 28 20 53 71 6c 69 74  StmtCache( Sqlit
31f0: 65 44 62 20 2a 70 44 62 20 29 7b 0a 20 20 53 71  eDb *pDb ){.  Sq
3200: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
3210: 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c  PreStmt;..  whil
3220: 65 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  e(  pDb->stmtLis
3230: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
3240: 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e  _finalize( pDb->
3250: 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20  stmtList->pStmt 
3260: 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20  );.    pPreStmt 
3270: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
3280: 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69  .    pDb->stmtLi
3290: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  st = pDb->stmtLi
32a0: 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54  st->pNext;.    T
32b0: 63 6c 5f 46 72 65 65 28 20 28 63 68 61 72 2a 29  cl_Free( (char*)
32c0: 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a  pPreStmt );.  }.
32d0: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30    pDb->nStmt = 0
32e0: 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ;.  pDb->stmtLas
32f0: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
3300: 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70  TCL calls this p
3310: 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e  rocedure when an
3320: 20 73 71 6c 69 74 65 33 20 64 61 74 61 62 61 73   sqlite3 databas
3330: 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20  e command is.** 
3340: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
3350: 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65  ic void DbDelete
3360: 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20  Cmd(void *db){. 
3370: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
3380: 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a   (SqliteDb*)db;.
3390: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
33a0: 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49 6e  (pDb);.  closeIn
33b0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70  crblobChannels(p
33c0: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  Db);.  sqlite3_c
33d0: 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20  lose(pDb->db);. 
33e0: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75   while( pDb->pFu
33f0: 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e  nc ){.    SqlFun
3400: 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e  c *pFunc = pDb->
3410: 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e  pFunc;.    pDb->
3420: 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70  pFunc = pFunc->p
3430: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Next;.    Tcl_De
3440: 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63  crRefCount(pFunc
3450: 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  ->pScript);.    
3460: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
3470: 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68  pFunc);.  }.  wh
3480: 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  ile( pDb->pColla
3490: 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c  te ){.    SqlCol
34a0: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d  late *pCollate =
34b0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
34c0: 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
34d0: 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e  e = pCollate->pN
34e0: 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  ext;.    Tcl_Fre
34f0: 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74  e((char*)pCollat
3500: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  e);.  }.  if( pD
3510: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
3520: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
3530: 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  usy);.  }.  if( 
3540: 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
3550: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3560: 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20  >zTrace);.  }.  
3570: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
3580: 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  e ){.    Tcl_Fre
3590: 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29  e(pDb->zProfile)
35a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
35b0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63  >zAuth ){.    Tc
35c0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
35d0: 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  h);.  }.  if( pD
35e0: 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  b->zNull ){.    
35f0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e  Tcl_Free(pDb->zN
3600: 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ull);.  }.  if( 
3610: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
3620: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
3630: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
3640: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a  pdateHook);.  }.
3650: 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c    if( pDb->pRoll
3660: 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  backHook ){.    
3670: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3680: 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
3690: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
36a0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
36b0: 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ded ){.    Tcl_D
36c0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
36d0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
36e0: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65  ;.  }.  Tcl_Free
36f0: 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a  ((char*)pDb);.}.
3700: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3710: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3720: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
3730: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68 69  le is locked whi
3740: 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
3750: 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a  execute SQL..*/.
3760: 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75 73  static int DbBus
3770: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  yHandler(void *c
3780: 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a  d, int nTries){.
3790: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
37a0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
37b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
37c0: 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73  r zVal[30];..  s
37d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
37e0: 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56  sizeof(zVal), zV
37f0: 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65 73  al, "%d", nTries
3800: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56 61  );.  rc = Tcl_Va
3810: 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72  rEval(pDb->inter
3820: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22  p, pDb->zBusy, "
3830: 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a   ", zVal, (char*
3840: 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  )0);.  if( rc!=T
3850: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
3860: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3870: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
3880: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
3890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
38a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
38b0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
38c0: 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72 65  d as the 'progre
38d0: 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72  ss callback' for
38e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
38f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 50  /.static int DbP
3900: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28 76  rogressHandler(v
3910: 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69  oid *cd){.  Sqli
3920: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3930: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
3940: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
3950: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
3960: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ;.  rc = Tcl_Eva
3970: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
3980: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
3990: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
39a0: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
39b0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
39c0: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
39d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
39e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
39f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3a00: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54  IT_TRACE./*.** T
3a10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3a20: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c  alled by the SQL
3a30: 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65  ite trace handle
3a40: 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77  r whenever a new
3a50: 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c  .** block of SQL
3a60: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
3a70: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
3a80: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20   pDb->zTrace is 
3a90: 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  executed..*/.sta
3aa0: 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63 65  tic void DbTrace
3ab0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
3ac0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
3ad0: 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  ql){.  SqliteDb 
3ae0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3af0: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72  *)cd;.  Tcl_DStr
3b00: 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f  ing str;..  Tcl_
3b10: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
3b20: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3b30: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
3b40: 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20  ->zTrace, -1);. 
3b50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
3b60: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
3b70: 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61  zSql);.  Tcl_Eva
3b80: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
3b90: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
3ba0: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
3bb0: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
3bc0: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
3bd0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
3be0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
3bf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
3c00: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RACE./*.** This 
3c10: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3c20: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
3c30: 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72 20  profile handler 
3c40: 61 66 74 65 72 20 61 20 73 74 61 74 65 6d 65 6e  after a statemen
3c50: 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65 78 65  t.** SQL has exe
3c60: 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20  cuted.  The TCL 
3c70: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
3c80: 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61 6c 75  Profile is evalu
3c90: 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
3ca0: 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65 48 61  void DbProfileHa
3cb0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
3cc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
3cd0: 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20  , sqlite_uint64 
3ce0: 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  tm){.  SqliteDb 
3cf0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3d00: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72  *)cd;.  Tcl_DStr
3d10: 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61 72 20  ing str;.  char 
3d20: 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c  zTm[100];..  sql
3d30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
3d40: 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d  zeof(zTm)-1, zTm
3d50: 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20  , "%lld", tm);. 
3d60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
3d70: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53  (&str);.  Tcl_DS
3d80: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
3d90: 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  , pDb->zProfile,
3da0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
3db0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
3dc0: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
3dd0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
3de0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
3df0: 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28  Tm);.  Tcl_Eval(
3e00: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
3e10: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
3e20: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
3e30: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
3e40: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
3e50: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d  (pDb->interp);.}
3e60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
3e70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3e80: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
3e90: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
3ea0: 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54  itted.  The.** T
3eb0: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
3ec0: 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65  ->zCommit is exe
3ed0: 63 75 74 65 64 2e 20 20 49 66 20 69 74 20 72 65  cuted.  If it re
3ee0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  turns non-zero o
3ef0: 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77  r.** if it throw
3f00: 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20  s an exception, 
3f10: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
3f20: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  is rolled back i
3f30: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69  nstead.** of bei
3f40: 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  ng committed..*/
3f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f  .static int DbCo
3f60: 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64  mmitHandler(void
3f70: 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44   *cd){.  SqliteD
3f80: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
3f90: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
3fa0: 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  ;..  rc = Tcl_Ev
3fb0: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
3fc0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
3fd0: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
3fe0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
3ff0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
4000: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
4010: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
4020: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
4030: 61 74 69 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c  atic void DbRoll
4040: 62 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64  backHandler(void
4050: 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20   *clientData){. 
4060: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4070: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65   (SqliteDb*)clie
4080: 6e 74 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74  ntData;.  assert
4090: 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
40a0: 6f 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f  ook);.  if( TCL_
40b0: 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  OK!=Tcl_EvalObjE
40c0: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
40d0: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
40e0: 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 54 63 6c  k, 0) ){.    Tcl
40f0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
4100: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  (pDb->interp);. 
4110: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
4120: 64 20 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65  d DbUpdateHandle
4130: 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20  r(.  void *p, . 
4140: 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74   int op,.  const
4150: 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63   char *zDb, .  c
4160: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c  onst char *zTbl,
4170: 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
4180: 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69   rowid.){.  Sqli
4190: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
41a0: 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c  iteDb *)p;.  Tcl
41b0: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 61  _Obj *pCmd;..  a
41c0: 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55 70 64  ssert( pDb->pUpd
41d0: 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73  ateHook );.  ass
41e0: 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  ert( op==SQLITE_
41f0: 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51  INSERT || op==SQ
4200: 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f  LITE_UPDATE || o
4210: 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
4220: 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63   );..  pCmd = Tc
4230: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
4240: 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29  Db->pUpdateHook)
4250: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
4260: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63  ount(pCmd);.  Tc
4270: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4280: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4290: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
42a0: 28 0a 20 20 20 20 28 20 28 6f 70 3d 3d 53 51 4c  (.    ( (op==SQL
42b0: 49 54 45 5f 49 4e 53 45 52 54 29 3f 22 49 4e 53  ITE_INSERT)?"INS
42c0: 45 52 54 22 3a 28 6f 70 3d 3d 53 51 4c 49 54 45  ERT":(op==SQLITE
42d0: 5f 55 50 44 41 54 45 29 3f 22 55 50 44 41 54 45  _UPDATE)?"UPDATE
42e0: 22 3a 22 44 45 4c 45 54 45 22 29 2c 20 2d 31 29  ":"DELETE"), -1)
42f0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
4300: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
4310: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
4320: 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29  ringObj(zDb, -1)
4330: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
4340: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
4350: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
4360: 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31  ringObj(zTbl, -1
4370: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
4380: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
4390: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57  , pCmd, Tcl_NewW
43a0: 69 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29  ideIntObj(rowid)
43b0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
43c0: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
43d0: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
43e0: 49 52 45 43 54 29 3b 0a 7d 0a 0a 73 74 61 74 69  IRECT);.}..stati
43f0: 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74  c void tclCollat
4400: 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20  eNeeded(.  void 
4410: 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33  *pCtx,.  sqlite3
4420: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c   *db,.  int enc,
4430: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4440: 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65  Name.){.  Sqlite
4450: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4460: 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  eDb *)pCtx;.  Tc
4470: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d  l_Obj *pScript =
4480: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
4490: 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  j(pDb->pCollateN
44a0: 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e  eeded);.  Tcl_In
44b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
44c0: 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pt);.  Tcl_ListO
44d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
44e0: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
44f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61  NewStringObj(zNa
4500: 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  me, -1));.  Tcl_
4510: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4520: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
4530: 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
4540: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
4550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4560: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4570: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
4580: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
4590: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
45a0: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20  ed.** using TCL 
45b0: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
45c0: 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c  c int tclSqlColl
45d0: 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  ate(.  void *pCt
45e0: 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63  x,.  int nA,.  c
45f0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
4600: 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74   int nB,.  const
4610: 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53   void *zB.){.  S
4620: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28  qlCollate *p = (
4630: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74  SqlCollate *)pCt
4640: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  x;.  Tcl_Obj *pC
4650: 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63  md;..  pCmd = Tc
4660: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
4670: 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a  ->zScript, -1);.
4680: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
4690: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f  nt(pCmd);.  Tcl_
46a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
46b0: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
46c0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
46d0: 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b  ingObj(zA, nA));
46e0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
46f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
4700: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c  nterp, pCmd, Tcl
4710: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42  _NewStringObj(zB
4720: 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , nB));.  Tcl_Ev
4730: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
4740: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
4750: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c  L_DIRECT);.  Tcl
4760: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
4770: 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 61  md);.  return (a
4780: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
4790: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
47a0: 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  p)));.}../*.** T
47b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
47c0: 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74  alled to evaluat
47d0: 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f  e an SQL functio
47e0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
47f0: 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70   using TCL scrip
4800: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4810: 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c  d tclSqlFunc(sql
4820: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
4830: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
4840: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a   sqlite3_value**
4850: 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63  argv){.  SqlFunc
4860: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   *p = sqlite3_us
4870: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
4880: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
4890: 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  d;.  int i;.  in
48a0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67  t rc;..  if( arg
48b0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  c==0 ){.    /* I
48c0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
48d0: 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
48e0: 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54  function, call T
48f0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20  cl_EvalObjEx on 
4900: 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70  the.    ** scrip
4910: 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74 6c  t object directl
4920: 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  y.  This allows 
4930: 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72  the TCL compiler
4940: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20 20   to generate.   
4950: 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f 72   ** bytecode for
4960: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20   the command on 
4970: 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61  the first invoca
4980: 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d 61  tion and thus ma
4990: 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71  ke.    ** subseq
49a0: 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
49b0: 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a 2f   much faster. */
49c0: 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70  .    pCmd = p->p
49d0: 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f  Script;.    Tcl_
49e0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
49f0: 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c  d);.    rc = Tcl
4a00: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
4a10: 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a  terp, pCmd, 0);.
4a20: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
4a30: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65  ount(pCmd);.  }e
4a40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
4a50: 68 65 72 65 20 61 72 65 20 61 72 67 75 6d 65 6e  here are argumen
4a60: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
4a70: 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c  on, make a shall
4a80: 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20  ow copy of the. 
4a90: 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a     ** script obj
4aa0: 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68 65  ect, lappend the
4ab0: 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e   arguments, then
4ac0: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f   evaluate the co
4ad0: 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  py..    **.    *
4ae0: 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20 63  * By "shallow" c
4af0: 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20 6f  opy, we mean a o
4b00: 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69  nly the outer li
4b10: 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75  st Tcl_Obj is du
4b20: 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a  plicated..    **
4b30: 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a   The new Tcl_Obj
4b40: 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
4b50: 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  rs to the origin
4b60: 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  al list elements
4b70: 2e 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77  . .    ** That w
4b80: 61 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61  ay, when Tcl_Eva
4b90: 6c 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61  lObjv() is run a
4ba0: 6e 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20  nd shimmers the 
4bb0: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20  first element.  
4bc0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74    ** of the list
4bd0: 20 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79   to tclCmdNameTy
4be0: 70 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61  pe, that alterna
4bf0: 74 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  te representatio
4c00: 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  n will.    ** be
4c10: 20 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72   preserved and r
4c20: 65 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  eused on the nex
4c30: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20  t invocation..  
4c40: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a    */.    Tcl_Obj
4c50: 20 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74   **aArg;.    int
4c60: 20 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54   nArg;.    if( T
4c70: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
4c80: 6d 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c  ments(p->interp,
4c90: 20 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41   p->pScript, &nA
4ca0: 72 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20  rg, &aArg) ){.  
4cb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4cc0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
4cd0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
4ce0: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
4cf0: 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72 65  , -1); .      re
4d00: 74 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20 20  turn;.    }     
4d10: 0a 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f  .    pCmd = Tcl_
4d20: 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67 2c  NewListObj(nArg,
4d30: 20 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c 5f   aArg);.    Tcl_
4d40: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
4d50: 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  d);.    for(i=0;
4d60: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
4d70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
4d80: 75 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b 69  ue *pIn = argv[i
4d90: 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  ];.      Tcl_Obj
4da0: 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20   *pVal;.        
4db0: 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 65      .      /* Se
4dc0: 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69  t pVal to contai
4dd0: 6e 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d  n the i'th colum
4de0: 6e 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a  n of this row. *
4df0: 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  /.      switch( 
4e00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
4e10: 70 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20 20  pe(pIn) ){.     
4e20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
4e30: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  LOB: {.         
4e40: 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c   int bytes = sql
4e50: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
4e60: 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  (pIn);.         
4e70: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42   pVal = Tcl_NewB
4e80: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69  yteArrayObj(sqli
4e90: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
4ea0: 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  In), bytes);.   
4eb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
4ee0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  GER: {.         
4ef0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20   sqlite_int64 v 
4f00: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4f10: 69 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20 20  int64(pIn);.    
4f20: 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31        if( v>=-21
4f30: 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32  47483647 && v<=2
4f40: 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20  147483647 ){.   
4f50: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
4f60: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29  Tcl_NewIntObj(v)
4f70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
4f80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
4f90: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Val = Tcl_NewWid
4fa0: 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  eIntObj(v);.    
4fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4fc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4fd0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
4fe0: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
4ff0: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
5000: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   r = sqlite3_val
5010: 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a  ue_double(pIn);.
5020: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
5030: 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62   Tcl_NewDoubleOb
5040: 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(r);.          
5050: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5060: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
5070: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
5080: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
5090: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
50a0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
50b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
50c0: 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  }.        defaul
50d0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t: {.          i
50e0: 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74  nt bytes = sqlit
50f0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
5100: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  In);.          p
5110: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
5120: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73  ingObj((char *)s
5130: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5140: 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a  t(pIn), bytes);.
5150: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5160: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5170: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63   }.      rc = Tc
5180: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5190: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
51a0: 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20  , pCmd, pVal);. 
51b0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
51c0: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
51d0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
51e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
51f0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5200: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
5210: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
5220: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20  rp), -1); .     
5230: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
5240: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5250: 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76   !p->useEvalObjv
5260: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c   ){.      /* Tcl
5270: 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c  _EvalObjEx() wil
5280: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
5290: 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  call Tcl_EvalObj
52a0: 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20 20  v() if pCmd.    
52b0: 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 77    ** is a list w
52c0: 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67 20  ithout a string 
52d0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
52e0: 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73   To prevent this
52f0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68   from.      ** h
5300: 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73  appening, make s
5310: 75 72 65 20 70 43 6d 64 20 68 61 73 20 61 20 76  ure pCmd has a v
5320: 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70 72  alid string repr
5330: 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  esentation */.  
5340: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
5350: 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20  g(pCmd);.    }. 
5360: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
5370: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
5380: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
5390: 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63 6c  DIRECT);.    Tcl
53a0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
53b0: 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  md);.  }..  if( 
53c0: 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52 45  rc && rc!=TCL_RE
53d0: 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  TURN ){.    sqli
53e0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
53f0: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
5400: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
5410: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
5420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
5430: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
5440: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d  _GetObjResult(p-
5450: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e  >interp);.    in
5460: 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61 74  t n;.    u8 *dat
5470: 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  a;.    char *zTy
5480: 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65 50  pe = pVar->typeP
5490: 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50  tr ? pVar->typeP
54a0: 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20  tr->name : "";. 
54b0: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70     char c = zTyp
54c0: 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d  e[0];.    if( c=
54d0: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
54e0: 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22  Type,"bytearray"
54f0: 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79  )==0 && pVar->by
5500: 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tes==0 ){.      
5510: 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61  /* Only return a
5520: 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68   BLOB type if th
5530: 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69  e Tcl variable i
5540: 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e  s a bytearray an
5550: 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  d.      ** has n
5560: 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  o string represe
5570: 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ntation. */.    
5580: 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74    data = Tcl_Get
5590: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
55a0: 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20  (pVar, &n);.    
55b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
55c0: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64  _blob(context, d
55d0: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54  ata, n, SQLITE_T
55e0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
55f0: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62 27  else if( (c=='b'
5600: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
5610: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29 20  ,"boolean")==0) 
5620: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d  ||.          (c=
5630: 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='i' && strcmp(z
5640: 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20  Type,"int")==0) 
5650: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  ){.      Tcl_Get
5660: 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56  IntFromObj(0, pV
5670: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
5680: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
5690: 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20  t(context, n);. 
56a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
56b0: 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'd' && strcmp(zT
56c0: 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30  ype,"double")==0
56d0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   ){.      double
56e0: 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   r;.      Tcl_Ge
56f0: 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 30  tDoubleFromObj(0
5700: 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20  , pVar, &r);.   
5710: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5720: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
5730: 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , r);.    }else 
5740: 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74  if( c=='w' && st
5750: 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65  rcmp(zType,"wide
5760: 49 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Int")==0 ){.    
5770: 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b    Tcl_WideInt v;
5780: 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69  .      Tcl_GetWi
5790: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  deIntFromObj(0, 
57a0: 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  pVar, &v);.     
57b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
57c0: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 76  int64(context, v
57d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
57e0: 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69      data = (unsi
57f0: 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f  gned char *)Tcl_
5800: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
5810: 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20  (pVar, &n);.    
5820: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5830: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
5840: 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20  char *)data, n, 
5850: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5860: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
5870: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5880: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
5890: 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  N./*.** This is 
58a0: 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  the authenticati
58b0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74  on function.  It
58c0: 20 61 70 70 65 6e 64 73 20 74 68 65 20 61 75 74   appends the aut
58d0: 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74  hentication.** t
58e0: 79 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68 65  ype code and the
58f0: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 74   two arguments t
5900: 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e  o zCmd[] then in
5910: 76 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c 74  vokes the result
5920: 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  .** on the inter
5930: 70 72 65 74 65 72 2e 20 20 54 68 65 20 72 65 70  preter.  The rep
5940: 6c 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20 74  ly is examined t
5950: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
5960: 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63 61  he.** authentica
5970: 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73 75  tion fails or su
5980: 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  cceeds..*/.stati
5990: 63 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62  c int auth_callb
59a0: 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72  ack(.  void *pAr
59b0: 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20  g,.  int code,. 
59c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
59d0: 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g1,.  const char
59e0: 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74   *zArg2,.  const
59f0: 20 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20   char *zArg3,.  
5a00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
5a10: 34 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  4.){.  char *zCo
5a20: 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  de;.  Tcl_DStrin
5a30: 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b  g str;.  int rc;
5a40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5a50: 52 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44  Reply;.  SqliteD
5a60: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
5a70: 44 62 2a 29 70 41 72 67 3b 0a 0a 20 20 73 77 69  Db*)pArg;..  swi
5a80: 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20 20  tch( code ){.   
5a90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 50   case SQLITE_COP
5aa0: 59 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a  Y              :
5ab0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5ac0: 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OPY"; break;.   
5ad0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
5ae0: 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20 3a  ATE_INDEX      :
5af0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5b00: 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62 72  REATE_INDEX"; br
5b10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5b20: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
5b30: 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  E      : zCode="
5b40: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
5b50: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
5b60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
5b70: 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a  ATE_TEMP_INDEX :
5b80: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5b90: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
5ba0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5bb0: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
5bc0: 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43  _TEMP_TABLE : zC
5bd0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5be0: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20  TE_TEMP_TABLE"; 
5bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5c00: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5c10: 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f 64  MP_TRIGGER: zCod
5c20: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
5c30: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
5c40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5c50: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5c60: 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64 65  MP_VIEW  : zCode
5c70: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5c80: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
5c90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5ca0: 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45  TE_CREATE_TRIGGE
5cb0: 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  R    : zCode="SQ
5cc0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
5cd0: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
5ce0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
5cf0: 41 54 45 5f 56 49 45 57 20 20 20 20 20 20 20 3a  ATE_VIEW       :
5d00: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5d10: 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72 65  REATE_VIEW"; bre
5d20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5d30: 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20  ITE_DELETE      
5d40: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5d50: 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20 62  QLITE_DELETE"; b
5d60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5d70: 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
5d80: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
5d90: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44  "SQLITE_DROP_IND
5da0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
5db0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5dc0: 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a 20  _TABLE        : 
5dd0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5de0: 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  OP_TABLE"; break
5df0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5e00: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
5e10: 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  X   : zCode="SQL
5e20: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
5e30: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
5e40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
5e50: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a  P_TEMP_TABLE   :
5e60: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
5e70: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b  ROP_TEMP_TABLE";
5e80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5e90: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
5ea0: 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f 64  P_TRIGGER : zCod
5eb0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
5ec0: 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72  EMP_TRIGGER"; br
5ed0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5ee0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
5ef0: 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  IEW    : zCode="
5f00: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
5f10: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
5f20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
5f30: 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20 20  ROP_TRIGGER     
5f40: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5f50: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b 20  _DROP_TRIGGER"; 
5f60: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5f70: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
5f80: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
5f90: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  ="SQLITE_DROP_VI
5fa0: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
5fb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53 45  case SQLITE_INSE
5fc0: 52 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  RT            : 
5fd0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e  zCode="SQLITE_IN
5fe0: 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  SERT"; break;.  
5ff0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
6000: 41 47 4d 41 20 20 20 20 20 20 20 20 20 20 20 20  AGMA            
6010: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6020: 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a  PRAGMA"; break;.
6030: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6040: 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
6050: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6060: 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a  E_READ"; break;.
6070: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6080: 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20  SELECT          
6090: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
60a0: 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61 6b  E_SELECT"; break
60b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
60c0: 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20 20  E_TRANSACTION   
60d0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
60e0: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22  ITE_TRANSACTION"
60f0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6100: 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  e SQLITE_UPDATE 
6110: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6120: 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41 54  de="SQLITE_UPDAT
6130: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
6140: 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41 43  ase SQLITE_ATTAC
6150: 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  H            : z
6160: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54 54  Code="SQLITE_ATT
6170: 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACH"; break;.   
6180: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 54   case SQLITE_DET
6190: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
61a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
61b0: 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  ETACH"; break;. 
61c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
61d0: 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20 20  LTER_TABLE      
61e0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
61f0: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20 62  _ALTER_TABLE"; b
6200: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6210: 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20 20  QLITE_REINDEX   
6220: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6230: 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 22  "SQLITE_REINDEX"
6240: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6250: 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45  e SQLITE_ANALYZE
6260: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6270: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41 4c 59  de="SQLITE_ANALY
6280: 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ZE"; break;.    
6290: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
62a0: 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20 3a 20  TE_VTABLE     : 
62b0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
62c0: 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20 62 72  EATE_VTABLE"; br
62d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
62e0: 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
62f0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6300: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
6310: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
6320: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4e 43  case SQLITE_FUNC
6330: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20 3a 20  TION          : 
6340: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 46 55  zCode="SQLITE_FU
6350: 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a  NCTION"; break;.
6360: 20 20 20 20 64 65 66 61 75 6c 74 20 20 20 20 20      default     
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 20 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22    : zCode="????"
6390: 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ; break;.  }.  T
63a0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
63b0: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
63c0: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
63d0: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b  pDb->zAuth, -1);
63e0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
63f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
6400: 2c 20 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f  , zCode);.  Tcl_
6410: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
6420: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31  ment(&str, zArg1
6430: 20 3f 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a   ? zArg1 : "");.
6440: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
6450: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
6460: 20 7a 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a   zArg2 ? zArg2 :
6470: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
6480: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
6490: 28 26 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a  (&str, zArg3 ? z
64a0: 41 72 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg3 : "");.  Tc
64b0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
64c0: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
64d0: 67 34 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29  g4 ? zArg4 : "")
64e0: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f  ;.  rc = Tcl_Glo
64f0: 62 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  balEval(pDb->int
6500: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
6510: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
6520: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
6530: 26 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20  &str);.  zReply 
6540: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  = Tcl_GetStringR
6550: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
6560: 70 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  p);.  if( strcmp
6570: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
6580: 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  OK")==0 ){.    r
6590: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
65a0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
65b0: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
65c0: 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20  _DENY")==0 ){.  
65d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 45    rc = SQLITE_DE
65e0: 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NY;.  }else if( 
65f0: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
6600: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d  QLITE_IGNORE")==
6610: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
6620: 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d  LITE_IGNORE;.  }
6630: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 39  else{.    rc = 9
6640: 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  99;.  }.  return
6650: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
6660: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6670: 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  HORIZATION */../
6680: 2a 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20 61 20  *.** zText is a 
6690: 70 6f 69 6e 74 65 72 20 74 6f 20 74 65 78 74 20  pointer to text 
66a0: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 61 6e 20  obtained via an 
66b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
66c0: 65 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69  ext().** or simi
66d0: 6c 61 72 20 69 6e 74 65 72 66 61 63 65 2e 20 54  lar interface. T
66e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
66f0: 72 6e 73 20 61 20 54 63 6c 20 73 74 72 69 6e 67  rns a Tcl string
6700: 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66   object, .** ref
6710: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 73 65 74  erence count set
6720: 20 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e   to 0, containin
6730: 67 20 74 68 65 20 74 65 78 74 2e 20 49 66 20 61  g the text. If a
6740: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20   translation.** 
6750: 62 65 74 77 65 65 6e 20 69 73 6f 38 38 35 39 20  between iso8859 
6760: 61 6e 64 20 55 54 46 2d 38 20 69 73 20 72 65 71  and UTF-8 is req
6770: 75 69 72 65 64 2c 20 69 74 20 69 73 20 70 72 65  uired, it is pre
6780: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
6790: 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78  c Tcl_Obj *dbTex
67a0: 74 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73  tToObj(char cons
67b0: 74 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c  t *zText){.  Tcl
67c0: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64  _Obj *pVal;.#ifd
67d0: 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ef UTF_TRANSLATI
67e0: 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f  ON_NEEDED.  Tcl_
67f0: 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20  DString dCol;.  
6800: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
6810: 26 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78  &dCol);.  Tcl_Ex
6820: 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69  ternalToUtfDStri
6830: 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20  ng(NULL, zText, 
6840: 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56  -1, &dCol);.  pV
6850: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
6860: 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e  ngObj(Tcl_DStrin
6870: 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d  gValue(&dCol), -
6880: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
6890: 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65  gFree(&dCol);.#e
68a0: 6c 73 65 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c  lse.  pVal = Tcl
68b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
68c0: 65 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  ext, -1);.#endif
68d0: 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a  .  return pVal;.
68e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
68f0: 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69  utine reads a li
6900: 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20  ne of text from 
6910: 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a  FILE in, stores.
6920: 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d  ** the text in m
6930: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
6940: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
6950: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
6960: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78  er.** to the tex
6970: 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  t.  NULL is retu
6980: 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66  rned at end of f
6990: 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f  ile, or if mallo
69a0: 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a  c().** fails..**
69b0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
69c0: 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64 6c  e is like "readl
69d0: 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d  ine" but no comm
69e0: 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67  and-line editing
69f0: 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a  .** is done..**.
6a00: 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73  ** copied from s
6a10: 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d  hell.c from '.im
6a20: 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f  port' command.*/
6a30: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f  .static char *lo
6a40: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72  cal_getline(char
6a50: 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20   *zPrompt, FILE 
6a60: 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  *in){.  char *zL
6a70: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  ine;.  int nLine
6a80: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
6a90: 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d   eol;..  nLine =
6aa0: 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20   100;.  zLine = 
6ab0: 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b  malloc( nLine );
6ac0: 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20  .  if( zLine==0 
6ad0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
6ae0: 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a  = 0;.  eol = 0;.
6af0: 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b    while( !eol ){
6b00: 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e  .    if( n+100>n
6b10: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c  Line ){.      nL
6b20: 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20  ine = nLine*2 + 
6b30: 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  100;.      zLine
6b40: 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65   = realloc(zLine
6b50: 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , nLine);.      
6b60: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
6b70: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
6b80: 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c     if( fgets(&zL
6b90: 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20  ine[n], nLine - 
6ba0: 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n, in)==0 ){.   
6bb0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
6bc0: 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e         free(zLin
6bd0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
6be0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
6bf0: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
6c00: 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b  ;.      eol = 1;
6c10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6c20: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
6c30: 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20  Line[n] ){ n++; 
6c40: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
6c50: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
6c60: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
6c70: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
6c80: 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20   0;.      eol = 
6c90: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  1;.    }.  }.  z
6ca0: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20  Line = realloc( 
6cb0: 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20  zLine, n+1 );.  
6cc0: 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a  return zLine;.}.
6cd0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69  ./*.** The "sqli
6ce0: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f  te" command belo
6cf0: 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  w creates a new 
6d00: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  Tcl command for 
6d10: 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  each.** connecti
6d20: 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61  on it opens to a
6d30: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
6d40: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
6d50: 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77   is invoked.** w
6d60: 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74  henever one of t
6d70: 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  hose connection-
6d80: 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64  specific command
6d90: 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a  s is executed.**
6da0: 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78   in Tcl.  For ex
6db0: 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75  ample, if you ru
6dc0: 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20  n Tcl code like 
6dd0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
6de0: 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22    sqlite3 db1  "
6df0: 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20  my_database".** 
6e00: 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a        db1 close.
6e10: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
6e20: 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20  command opens a 
6e30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
6e40: 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20  e "my_database" 
6e50: 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20  database.** and 
6e60: 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65  calls that conne
6e70: 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68  ction "db1".  Th
6e80: 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64  e second command
6e90: 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20   causes this.** 
6ea0: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65  subroutine to be
6eb0: 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61   invoked..*/.sta
6ec0: 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64  tic int DbObjCmd
6ed0: 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
6ee0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
6ef0: 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20  nt objc,Tcl_Obj 
6f00: 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20  *const*objv){.  
6f10: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
6f20: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
6f30: 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69   int choice;.  i
6f40: 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  nt rc = TCL_OK;.
6f50: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
6f60: 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d  har *DB_strs[] =
6f70: 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a   {.    "authoriz
6f80: 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75  er",         "bu
6f90: 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sy",            
6fa0: 20 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22    "cache",.    "
6fb0: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20  changes",       
6fc0: 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20       "close",   
6fd0: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61            "colla
6fe0: 74 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  te",.    "collat
6ff0: 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22  ion_needed",   "
7000: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20  commit_hook",   
7010: 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a      "complete",.
7020: 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20      "copy",     
7030: 20 20 20 20 20 20 20 20 20 20 22 65 6e 61 62 6c            "enabl
7040: 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
7050: 22 2c 22 65 72 72 6f 72 63 6f 64 65 22 2c 0a 20  ","errorcode",. 
7060: 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20     "eval",      
7070: 20 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73           "exists
7080: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 66  ",            "f
7090: 75 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 69  unction",.    "i
70a0: 6e 63 72 62 6c 6f 62 22 2c 0a 20 20 20 20 22 69  ncrblob",.    "i
70b0: 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20 20 20  nterrupt",      
70c0: 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74      "last_insert
70d0: 5f 72 6f 77 69 64 22 2c 20 22 6e 75 6c 6c 76 61  _rowid", "nullva
70e0: 6c 75 65 22 2c 0a 20 20 20 20 22 6f 6e 65 63 6f  lue",.    "oneco
70f0: 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 20  lumn",          
7100: 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20  "profile",      
7110: 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c       "progress",
7120: 0a 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20  .    "rekey",   
7130: 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c             "roll
7140: 62 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  back_hook",     
7150: 22 74 69 6d 65 6f 75 74 22 2c 0a 20 20 20 20 22  "timeout",.    "
7160: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20  total_changes", 
7170: 20 20 20 20 20 22 74 72 61 63 65 22 2c 20 20 20       "trace",   
7180: 20 20 20 20 20 20 20 20 20 20 22 74 72 61 6e 73            "trans
7190: 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 75 70  action",.    "up
71a0: 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  date_hook",     
71b0: 20 20 20 22 76 65 72 73 69 6f 6e 22 2c 20 20 20     "version",   
71c0: 20 20 20 20 20 20 20 20 30 0a 20 20 7d 3b 0a 20          0.  };. 
71d0: 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a   enum DB_enum {.
71e0: 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45      DB_AUTHORIZE
71f0: 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42 55 53  R,        DB_BUS
7200: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  Y,             D
7210: 42 5f 43 41 43 48 45 2c 0a 20 20 20 20 44 42 5f  B_CACHE,.    DB_
7220: 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20  CHANGES,        
7230: 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20     DB_CLOSE,    
7240: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41          DB_COLLA
7250: 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41  TE,.    DB_COLLA
7260: 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42  TION_NEEDED,  DB
7270: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20  _COMMIT_HOOK,   
7280: 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a     DB_COMPLETE,.
7290: 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20      DB_COPY,    
72a0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41            DB_ENA
72b0: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
72c0: 4f 4e 2c 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c  ON,DB_ERRORCODE,
72d0: 0a 20 20 20 20 44 42 5f 45 56 41 4c 2c 20 20 20  .    DB_EVAL,   
72e0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 58             DB_EX
72f0: 49 53 54 53 2c 20 20 20 20 20 20 20 20 20 20 20  ISTS,           
7300: 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 0a 20 20 20  DB_FUNCTION,.   
7310: 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 0a 20 20   DB_INCRBLOB,.  
7320: 20 20 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 20    DB_INTERRUPT, 
7330: 20 20 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f          DB_LAST_
7340: 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 44 42 5f  INSERT_ROWID,DB_
7350: 4e 55 4c 4c 56 41 4c 55 45 2c 0a 20 20 20 20 44  NULLVALUE,.    D
7360: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20  B_ONECOLUMN,    
7370: 20 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c       DB_PROFILE,
7380: 20 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f            DB_PRO
7390: 47 52 45 53 53 2c 0a 20 20 20 20 44 42 5f 52 45  GRESS,.    DB_RE
73a0: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  KEY,            
73b0: 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
73c0: 4b 2c 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54  K,    DB_TIMEOUT
73d0: 2c 0a 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43  ,.    DB_TOTAL_C
73e0: 48 41 4e 47 45 53 2c 20 20 20 20 20 44 42 5f 54  HANGES,     DB_T
73f0: 52 41 43 45 2c 20 20 20 20 20 20 20 20 20 20 20  RACE,           
7400: 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c   DB_TRANSACTION,
7410: 0a 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48  .    DB_UPDATE_H
7420: 4f 4f 4b 2c 20 20 20 20 20 20 20 44 42 5f 56 45  OOK,       DB_VE
7430: 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
7440: 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74  .  };.  /* don't
7450: 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20   leave trailing 
7460: 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75  commas on DB_enu
7470: 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74  m, it confuses t
7480: 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69  he AIX xlc compi
7490: 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ler */..  if( ob
74a0: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
74b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
74c0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
74d0: 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b  UBCOMMAND ...");
74e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
74f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
7500: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
7510: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
7520: 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22  v[1], DB_strs, "
7530: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f  option", 0, &cho
7540: 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ice) ){.    retu
7550: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7560: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e  }..  switch( (en
7570: 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63  um DB_enum)choic
7580: 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64  e ){..  /*    $d
7590: 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41  b authorizer ?CA
75a0: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
75b0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
75c0: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  en callback to a
75d0: 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51  uthorize each SQ
75e0: 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69  L operation as i
75f0: 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c  t is.  ** compil
7600: 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73  ed.  5 arguments
7610: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
7620: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65   the callback be
7630: 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  fore it is.  ** 
7640: 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20  invoked:.  **.  
7650: 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74  **   (1) The aut
7660: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20  horization type 
7670: 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41  (ex: SQLITE_CREA
7680: 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45  TE_TABLE, SQLITE
7690: 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20  _INSERT, ...).  
76a0: 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64  **   (2) First d
76b0: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20  escriptive name 
76c0: 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68  (depends on auth
76d0: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a  orization type).
76e0: 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e    **   (3) Secon
76f0: 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  d descriptive na
7700: 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61  me.  **   (4) Na
7710: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
7720: 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20  se (ex: "main", 
7730: 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28  "temp").  **   (
7740: 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  5) Name of trigg
7750: 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67  er that is doing
7760: 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a   the access.  **
7770: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  .  ** The callba
7780: 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ck should return
7790: 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f   on of the follo
77a0: 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51  wing strings: SQ
77b0: 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51  LITE_OK,.  ** SQ
77c0: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20  LITE_IGNORE, or 
77d0: 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e  SQLITE_DENY.  An
77e0: 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
77f0: 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72  alue is an error
7800: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
7810: 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e  his method is in
7820: 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72  voked with no ar
7830: 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72  guments, the cur
7840: 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69  rent authorizati
7850: 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  on.  ** callback
7860: 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
7870: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
7880: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20   DB_AUTHORIZER: 
7890: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
78a0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
78b0: 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ON.    Tcl_Appen
78c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
78d0: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e  "authorization n
78e0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
78f0: 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b  this build", 0);
7900: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7910: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
7920: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
7930: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
7940: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
7950: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
7960: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
7970: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7980: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
7990: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
79a0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
79b0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
79c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
79d0: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a  pDb->zAuth, 0);.
79e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
79f0: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
7a00: 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20  Auth;.      int 
7a10: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
7a20: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
7a30: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
7a40: 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20  b->zAuth);.     
7a50: 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d   }.      zAuth =
7a60: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
7a70: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
7a80: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
7a90: 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29  zAuth && len>0 )
7aa0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
7ab0: 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Auth = Tcl_Alloc
7ac0: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
7ad0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
7ae0: 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c  >zAuth, zAuth, l
7af0: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
7b00: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
7b10: 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >zAuth = 0;.    
7b20: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
7b30: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
7b40: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
7b50: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
7b60: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
7b70: 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62  thorizer(pDb->db
7b80: 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c  , auth_callback,
7b90: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
7ba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
7bb0: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
7bc0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
7bd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7be0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
7bf0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
7c00: 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41  $db busy ?CALLBA
7c10: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
7c20: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
7c30: 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51  allback if an SQ
7c40: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65  L statement atte
7c50: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  mpts to open.  *
7c60: 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62  * a locked datab
7c70: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
7c80: 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b   case DB_BUSY: {
7c90: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
7ca0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
7cb0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
7cc0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c  , 2, objv, "CALL
7cd0: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
7ce0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7cf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
7d00: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
7d10: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
7d20: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
7d30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7d40: 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29  , pDb->zBusy, 0)
7d50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7d60: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
7d70: 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e  *zBusy;.      in
7d80: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
7d90: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
7da0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
7db0: 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20  pDb->zBusy);.   
7dc0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79     }.      zBusy
7dd0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7de0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
7df0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
7e00: 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30  ( zBusy && len>0
7e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
7e20: 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c  >zBusy = Tcl_All
7e30: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
7e40: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
7e50: 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c  b->zBusy, zBusy,
7e60: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
7e70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
7e80: 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20  b->zBusy = 0;.  
7e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7ea0: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
7eb0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
7ec0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
7ed0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
7ee0: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
7ef0: 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c  , DbBusyHandler,
7f00: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
7f10: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
7f20: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
7f30: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
7f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7f50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
7f60: 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63 68   /*     $db cach
7f70: 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20  e flush.  **    
7f80: 20 24 64 62 20 63 61 63 68 65 20 73 69 7a 65 20   $db cache size 
7f90: 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73  n.  **.  ** Flus
7fa0: 68 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  h the prepared s
7fb0: 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20  tatement cache, 
7fc0: 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  or set the maxim
7fd0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  um number of.  *
7fe0: 2a 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65  * cached stateme
7ff0: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  nts..  */.  case
8000: 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20   DB_CACHE: {.   
8010: 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20   char *subCmd;. 
8020: 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69     int n;..    i
8030: 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20  f( objc<=2 ){.  
8040: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
8050: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
8060: 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74  objv, "cache opt
8070: 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20  ion ?arg?");.   
8080: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8090: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
80a0: 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53  ubCmd = Tcl_GetS
80b0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62  tringFromObj( ob
80c0: 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20  jv[2], 0 );.    
80d0: 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27  if( *subCmd=='f'
80e0: 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d   && strcmp(subCm
80f0: 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b  d,"flush")==0 ){
8100: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
8110: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
8120: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8130: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
8140: 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20  "flush");.      
8150: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8160: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
8170: 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74  .        flushSt
8180: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
8190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
81a0: 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27  e if( *subCmd=='
81b0: 73 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62  s' && strcmp(sub
81c0: 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29  Cmd,"size")==0 )
81d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
81e0: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=4 ){.        T
81f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
8200: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
8210: 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20   "size n");.    
8220: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8230: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
8240: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54  e{.        if( T
8250: 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65  CL_ERROR==Tcl_Ge
8260: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
8270: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29  rp, objv[3], &n)
8280: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
8290: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
82a0: 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20  interp, "cannot 
82b0: 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20 20  convert \"", .  
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
82d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
82e0: 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c  j(objv[3],0), "\
82f0: 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20 30  " to integer", 0
8300: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
8310: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8320: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8330: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20          if( n<0 
8340: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
8350: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
8360: 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Db );.          
8370: 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    n = 0;.       
8380: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d     }else if( n>M
8390: 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
83a0: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  S ){.           
83b0: 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52 45   n = MAX_PREPARE
83c0: 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20 20  D_STMTS;.       
83d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
83e0: 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b  Db->maxStmt = n;
83f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8400: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8410: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8420: 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 62  sult( interp, "b
8430: 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a  ad option \"", .
8440: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
8450: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
8460: 62 6a 76 5b 30 5d 2c 30 29 2c 20 22 5c 22 3a 20  bjv[0],0), "\": 
8470: 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72  must be flush or
8480: 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20   size", 0);.    
8490: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
84a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
84b0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
84c0: 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a 20     $db changes. 
84d0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
84e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
84f0: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
8500: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
8510: 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20   or deleted by. 
8520: 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65 63   ** the most rec
8530: 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41  ent INSERT, UPDA
8540: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
8550: 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c  tement, not incl
8560: 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20  uding .  ** any 
8570: 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
8580: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
8590: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
85a0: 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
85b0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
85c0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
85d0: 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
85e0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
85f0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
8600: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8610: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8620: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
8630: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
8640: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
8650: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
8660: 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  t, sqlite3_chang
8670: 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
8680: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
8690: 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a  /*    $db close.
86a0: 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f    **.  ** Shutdo
86b0: 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  wn the database.
86c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
86d0: 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  LOSE: {.    Tcl_
86e0: 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  DeleteCommand(in
86f0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
8700: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8710: 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65  0], 0));.    bre
8720: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
8730: 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61  **     $db colla
8740: 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20  te NAME SCRIPT. 
8750: 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
8760: 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74  a new SQL collat
8770: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ion function cal
8780: 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65  led NAME.  Whene
8790: 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75  ver.  ** that fu
87a0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
87b0: 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20  , invoke SCRIPT 
87c0: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
87d0: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
87e0: 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45   case DB_COLLATE
87f0: 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61  : {.    SqlColla
8800: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  te *pCollate;.  
8810: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
8820: 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74     char *zScript
8830: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70  ;.    int nScrip
8840: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
8850: 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =4 ){.      Tcl_
8860: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8870: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
8880: 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20  AME SCRIPT");.  
8890: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
88a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
88b0: 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
88c0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
88d0: 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53  v[2], 0);.    zS
88e0: 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53  cript = Tcl_GetS
88f0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8900: 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b  v[3], &nScript);
8910: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20  .    pCollate = 
8920: 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c  (SqlCollate*)Tcl
8930: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
8940: 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72  pCollate) + nScr
8950: 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  ipt + 1 );.    i
8960: 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29  f( pCollate==0 )
8970: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8980: 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  R;.    pCollate-
8990: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
89a0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
89b0: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f  pNext = pDb->pCo
89c0: 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c  llate;.    pColl
89d0: 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28  ate->zScript = (
89e0: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b  char*)&pCollate[
89f0: 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f  1];.    pDb->pCo
8a00: 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65  llate = pCollate
8a10: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f  ;.    memcpy(pCo
8a20: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20  llate->zScript, 
8a30: 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74  zScript, nScript
8a40: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  +1);.    if( sql
8a50: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
8a60: 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a  ation(pDb->db, z
8a70: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  Name, SQLITE_UTF
8a80: 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  8, .        pCol
8a90: 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c  late, tclSqlColl
8aa0: 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ate) ){.      Tc
8ab0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
8ac0: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
8ad0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
8ae0: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
8af0: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
8b00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8b10: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
8b20: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
8b30: 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  $db collation_ne
8b40: 65 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a  eded SCRIPT.  **
8b50: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
8b60: 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  ew SQL collation
8b70: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
8b80: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
8b90: 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74  .  ** that funct
8ba0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
8bb0: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
8bc0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
8bd0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
8be0: 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f  se DB_COLLATION_
8bf0: 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66  NEEDED: {.    if
8c00: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
8c10: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
8c20: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
8c30: 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a  bjv, "SCRIPT");.
8c40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8c50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8c60: 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c    if( pDb->pColl
8c70: 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20  ateNeeded ){.   
8c80: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
8c90: 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
8ca0: 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a  eNeeded);.    }.
8cb0: 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
8cc0: 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75  eNeeded = Tcl_Du
8cd0: 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b  plicateObj(objv[
8ce0: 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  2]);.    Tcl_Inc
8cf0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
8d00: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
8d10: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c      sqlite3_coll
8d20: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62  ation_needed(pDb
8d30: 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f  ->db, pDb, tclCo
8d40: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
8d50: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
8d60: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74  /*    $db commit
8d70: 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f  _hook ?CALLBACK?
8d80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
8d90: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
8da0: 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65  back just before
8db0: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72   committing ever
8dc0: 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f  y SQL transactio
8dd0: 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  n..  ** If the c
8de0: 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61  allback throws a
8df0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72  n exception or r
8e00: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
8e10: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74   then the.  ** t
8e20: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62  ransaction is ab
8e30: 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42  orted.  If CALLB
8e40: 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ACK is an empty 
8e50: 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c  string, the call
8e60: 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73  back.  ** is dis
8e70: 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  abled..  */.  ca
8e80: 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f  se DB_COMMIT_HOO
8e90: 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  K: {.    if( obj
8ea0: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
8eb0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8ec0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
8ed0: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
8ee0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8ef0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
8f00: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
8f10: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
8f20: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
8f30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8f40: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
8f50: 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  Commit, 0);.    
8f60: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
8f70: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d       char *zComm
8f80: 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  it;.      int le
8f90: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
8fa0: 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
8fb0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
8fc0: 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  b->zCommit);.   
8fd0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d     }.      zComm
8fe0: 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  it = Tcl_GetStri
8ff0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
9000: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
9010: 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c  if( zCommit && l
9020: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
9030: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54  pDb->zCommit = T
9040: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
9050: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
9060: 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  cpy(pDb->zCommit
9070: 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31  , zCommit, len+1
9080: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9090: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
90a0: 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
90b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
90c0: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
90d0: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
90e0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
90f0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74    sqlite3_commit
9100: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44  _hook(pDb->db, D
9110: 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20  bCommitHandler, 
9120: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
9130: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9140: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
9150: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
9160: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9170: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
9180: 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74  *    $db complet
9190: 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e SQL.  **.  ** 
91a0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53  Return TRUE if S
91b0: 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  QL is a complete
91c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
91d0: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
91e0: 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  .  ** additional
91f0: 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20   lines of input 
9200: 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69  are needed.  Thi
9210: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
9220: 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69  the.  ** built-i
9230: 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65  n "info complete
9240: 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c  " command of Tcl
9250: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
9260: 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66  _COMPLETE: {.#if
9270: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9280: 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63  _COMPLETE.    Tc
9290: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
92a0: 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65      int isComple
92b0: 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  te;.    if( objc
92c0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
92d0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
92e0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
92f0: 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74  SQL");.      ret
9300: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9310: 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c     }.    isCompl
9320: 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ete = sqlite3_co
9330: 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53  mplete( Tcl_GetS
9340: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
9350: 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20  v[2], 0) );.    
9360: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
9370: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
9380: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42  p);.    Tcl_SetB
9390: 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c  ooleanObj(pResul
93a0: 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a  t, isComplete);.
93b0: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
93c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
93d0: 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74  db copy conflict
93e0: 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65  -algorithm table
93f0: 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52   filename ?SEPAR
9400: 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43  ATOR? ?NULLINDIC
9410: 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ATOR?.  **.  ** 
9420: 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74  Copy data into t
9430: 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61  able from filena
9440: 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75  me, optionally u
9450: 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20  sing SEPARATOR. 
9460: 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65   ** as column se
9470: 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20  parators.  If a 
9480: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
9490: 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f  a null string, o
94a0: 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65  r the.  ** value
94b0: 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f   of NULLINDICATO
94c0: 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73  R, a NULL is ins
94d0: 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f  erted for the co
94e0: 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c  lumn..  ** confl
94f0: 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73  ict-algorithm is
9500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69   one of the sqli
9510: 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  te conflict algo
9520: 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20  rithms:.  **    
9530: 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c  rollback, abort,
9540: 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72   fail, ignore, r
9550: 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73  eplace.  ** On s
9560: 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74  uccess, return t
9570: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  he number of lin
9580: 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f  es processed, no
9590: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61  t necessarily sa
95a0: 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63  me.  ** as 'db c
95b0: 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63  hanges' due to c
95c0: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
95d0: 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a  m selected..  **
95e0: 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  .  ** This code 
95f0: 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20  is basically an 
9600: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65  implementation/e
9610: 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20  nhancement of.  
9620: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73  ** the sqlite3 s
9630: 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22  hell.c ".import"
9640: 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20   command..  **. 
9650: 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64   ** This command
9660: 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61   usage is equiva
9670: 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69  lent to the sqli
9680: 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65  te2.x COPY state
9690: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68  ment,.  ** which
96a0: 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61   imports file da
96b0: 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ta into a table 
96c0: 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72  using the Postgr
96d0: 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66  eSQL COPY file f
96e0: 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64  ormat:.  **   $d
96f0: 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f  b copy $conflit_
9700: 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65  algo $table_name
9710: 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c   $filename \t \\
9720: 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  N.  */.  case DB
9730: 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61  _COPY: {.    cha
9740: 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20  r *zTable;      
9750: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
9760: 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  rt data into thi
9770: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  s table */.    c
9780: 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20  har *zFile;     
9790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
97a0: 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63  e file from whic
97b0: 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74  h to extract dat
97c0: 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  a */.    char *z
97d0: 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20  Conflict;       
97e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
97f0: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74  lict algorithm t
9800: 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c  o use */.    sql
9810: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
9820: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74  ;        /* A st
9830: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
9840: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
9860: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20  sult code */.   
9870: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9890: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
98a0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
98b0: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  /.    int nByte;
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
98e0: 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73  ytes in an SQL s
98f0: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  tring */.    int
9900: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
9910: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
9920: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20   counters */.   
9930: 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20   int nSep;      
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9950: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
9960: 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20  in zSep[] */.   
9970: 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20   int nNull;     
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9990: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
99a0: 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20  in zNull[] */.  
99b0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99d0: 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
99e0: 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  t */.    char *z
99f0: 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Line;           
9a00: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
9a10: 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66   line of input f
9a20: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  rom the file */.
9a30: 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
9a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a50: 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65  /* zLine[] broke
9a60: 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e  n up into column
9a70: 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  s */.    char *z
9a80: 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20  Commit;         
9a90: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63       /* How to c
9aa0: 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f  ommit changes */
9ab0: 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  .    FILE *in;  
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69   /* The input fi
9ae0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69  le */.    int li
9af0: 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  neno = 0;       
9b00: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
9b10: 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69  mber of input fi
9b20: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a  le */.    char z
9b30: 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20  LineNum[80];    
9b40: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
9b50: 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65  mber print buffe
9b60: 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  r */.    Tcl_Obj
9b70: 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20   *pResult;      
9b80: 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72       /* interp r
9b90: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68  esult */..    ch
9ba0: 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68  ar *zSep;.    ch
9bb0: 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69  ar *zNull;.    i
9bc0: 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a  f( objc<5 || obj
9bd0: 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>7 ){.      Tcl
9be0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
9bf0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a  terp, 2, objv, .
9c00: 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49           "CONFLI
9c10: 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42  CT-ALGORITHM TAB
9c20: 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50  LE FILENAME ?SEP
9c30: 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44  ARATOR? ?NULLIND
9c40: 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20  ICATOR?");.     
9c50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9c60: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
9c70: 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20   objc>=6 ){.    
9c80: 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74    zSep = Tcl_Get
9c90: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
9ca0: 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[5], 0);.    }
9cb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70  else{.      zSep
9cc0: 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20   = "\t";.    }. 
9cd0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29     if( objc>=7 )
9ce0: 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20  {.      zNull = 
9cf0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
9d00: 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29  mObj(objv[6], 0)
9d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9d20: 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20     zNull = "";. 
9d30: 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69     }.    zConfli
9d40: 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ct = Tcl_GetStri
9d50: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
9d60: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c  ], 0);.    zTabl
9d70: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
9d80: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
9d90: 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  , 0);.    zFile 
9da0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
9db0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20  romObj(objv[4], 
9dc0: 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73  0);.    nSep = s
9dd0: 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20 20  trlen(zSep);.   
9de0: 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 28   nNull = strlen(
9df0: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  zNull);.    if( 
9e00: 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
9e10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9e20: 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
9e30: 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61   non-null separa
9e40: 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
9e50: 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20 20 20   copy",0);.     
9e60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9e70: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
9e80: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9e90: 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62  Conflict, "rollb
9ea0: 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20 20  ack") != 0 &&.  
9eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
9ec0: 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  Cmp(zConflict, "
9ed0: 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20  abort"   ) != 0 
9ee0: 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  &&.       sqlite
9ef0: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
9f00: 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20  ct, "fail"    ) 
9f10: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
9f20: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
9f30: 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65  onflict, "ignore
9f40: 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20  "  ) != 0 &&.   
9f50: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
9f60: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72  mp(zConflict, "r
9f70: 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20 29  eplace" ) != 0 )
9f80: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
9f90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9fa0: 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a  , "Error: \"", z
9fb0: 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20 20  Conflict, .     
9fc0: 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66         "\", conf
9fd0: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d  lict-algorithm m
9fe0: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72  ust be one of: r
9ff0: 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20 20  ollback, ".     
a000: 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20 66         "abort, f
a010: 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20  ail, ignore, or 
a020: 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20  replace", 0);.  
a030: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a040: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a050: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
a060: 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
a070: 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61   FROM '%q'", zTa
a080: 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
a090: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ql==0 ){.      T
a0a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a0b0: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
a0c0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
a0d0: 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , zTable, 0);.  
a0e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a0f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a100: 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nByte = strlen(z
a110: 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Sql);.    rc = s
a120: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
a130: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
a140: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
a150: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a160: 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
a170: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
a180: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a190: 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  p, "Error: ", sq
a1a0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
a1b0: 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
a1c0: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d   nCol = 0;.    }
a1d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c  else{.      nCol
a1e0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
a1f0: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
a200: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a210: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
a220: 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  );.    if( nCol=
a230: 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74  =0 ) {.      ret
a240: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a250: 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
a260: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20  malloc( nByte + 
a270: 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20  50 + nCol*2 );. 
a280: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
a290: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
a2a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a2b0: 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20  , "Error: can't 
a2c0: 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20  malloc()", 0);. 
a2d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
a2e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
a2f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a300: 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
a310: 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
a320: 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
a330: 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
a340: 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
a350: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
a360: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (zSql);.    for(
a370: 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=1; i<nCol; i++
a380: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ){.      zSql[j+
a390: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
a3a0: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b  zSql[j++] = '?';
a3b0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b  .    }.    zSql[
a3c0: 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  j++] = ')';.    
a3d0: 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zSql[j] = 0;.   
a3e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
a3f0: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
a400: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
a410: 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53   0);.    free(zS
a420: 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
a430: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
a440: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a450: 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  , "Error: ", sql
a460: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
a470: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
a480: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
a490: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
a4a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a4b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20  .    }.    in = 
a4c0: 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62  fopen(zFile, "rb
a4d0: 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d  ");.    if( in==
a4e0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
a4f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a500: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rp, "Error: cann
a510: 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c  ot open file: ",
a520: 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20   zFile, NULL);. 
a530: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
a540: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
a550: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a560: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a570: 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20  azCol = malloc( 
a580: 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29  sizeof(azCol[0])
a590: 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20  *(nCol+1) );.   
a5a0: 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
a5b0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
a5c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a5d0: 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d   "Error: can't m
a5e0: 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20  alloc()", 0);.  
a5f0: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
a600: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
a610: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
a620: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
a630: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42  exec(pDb->db, "B
a640: 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  EGIN", 0, 0, 0);
a650: 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22  .    zCommit = "
a660: 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69  COMMIT";.    whi
a670: 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63  le( (zLine = loc
a680: 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e  al_getline(0, in
a690: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ))!=0 ){.      c
a6a0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20  har *z;.      i 
a6b0: 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e  = 0;.      linen
a6c0: 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c  o++;.      azCol
a6d0: 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20  [0] = zLine;.   
a6e0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c     for(i=0, z=zL
a6f0: 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ine; *z; z++){. 
a700: 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a         if( *z==z
a710: 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d  Sep[0] && strncm
a720: 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29  p(z, zSep, nSep)
a730: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a740: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   *z = 0;.       
a750: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
a760: 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a    if( i<nCol ){.
a770: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f              azCo
a780: 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b  l[i] = &z[nSep];
a790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
a7a0: 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20  = nSep-1;.      
a7b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
a7c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a7d0: 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20  ( i+1!=nCol ){. 
a7e0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
a7f0: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  r;.        int n
a800: 45 72 72 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69  Err = strlen(zFi
a810: 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20  le) + 200;.     
a820: 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63     zErr = malloc
a830: 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (nErr);.        
a840: 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
a850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
a860: 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72  printf(nErr, zEr
a870: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
a880: 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20  "Error: %s line 
a890: 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
a8a0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
a8b0: 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20  but found %d",. 
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
a8d0: 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c  e, lineno, nCol,
a8e0: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
a8f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a900: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20  t(interp, zErr, 
a910: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72  0);.          fr
a920: 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ee(zErr);.      
a930: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d    }.        zCom
a940: 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
a950: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
a960: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
a970: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
a980: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
a990: 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20   check for null 
a9a0: 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e  data, if so, bin
a9b0: 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  d as null */.   
a9c0: 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e       if ((nNull>
a9d0: 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f  0 && strcmp(azCo
a9e0: 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29  l[i], zNull)==0)
a9f0: 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c   || strlen(azCol
aa00: 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20  [i])==0) {.     
aa10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
aa20: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b  d_null(pStmt, i+
aa30: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
aa40: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
aa50: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
aa60: 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c  Stmt, i+1, azCol
aa70: 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
aa80: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
aa90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
aaa0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
aab0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
aac0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
aad0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65  Stmt);.      fre
aae0: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
aaf0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ab00: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
ab10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ab20: 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20  terp,"Error: ", 
ab30: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
ab40: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
ab50: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
ab60: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
ab70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ab80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
ab90: 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c  (azCol);.    fcl
aba0: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c  ose(in);.    sql
abb0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
abc0: 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  tmt);.    (void)
abd0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
abe0: 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30  ->db, zCommit, 0
abf0: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66  , 0, 0);..    if
ac00: 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20  ( zCommit[0] == 
ac10: 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  'C' ){.      /* 
ac20: 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73  success, set res
ac30: 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66  ult as number of
ac40: 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64   lines processed
ac50: 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c   */.      pResul
ac60: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
ac70: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
ac80: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
ac90: 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e  j(pResult, linen
aca0: 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  o);.      rc = T
acb0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
acc0: 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75  {.      /* failu
acd0: 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e  re, append linen
ace0: 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a  o where failed *
acf0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
ad00: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
ad10: 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65  zLineNum), zLine
ad20: 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29  Num,"%d",lineno)
ad30: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  ;.      Tcl_Appe
ad40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ad50: 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ", failed while 
ad60: 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a  processing line:
ad70: 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a   ",zLineNum,0);.
ad80: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
ad90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ada0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
adb0: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e 61  .  **    $db ena
adc0: 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
add0: 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a  on BOOLEAN.  **.
ade0: 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65 78    ** Turn the ex
adf0: 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
ae00: 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66  feature on or of
ae10: 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62 79  f.  It if off by
ae20: 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20  .  ** default.. 
ae30: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 4e   */.  case DB_EN
ae40: 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
ae50: 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  ION: {.#ifndef S
ae60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
ae70: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e  EXTENSION.    in
ae80: 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28  t onoff;.    if(
ae90: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
aea0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
aeb0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
aec0: 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a  jv, "BOOLEAN");.
aed0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
aee0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
aef0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
af00: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
af10: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e  rp, objv[2], &on
af20: 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  off) ){.      re
af30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
af40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
af50: 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
af60: 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  tension(pDb->db,
af70: 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65   onoff);.    bre
af80: 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54 63  ak;.#else.    Tc
af90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
afa0: 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73 69 6f  nterp, "extensio
afb0: 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74 75 72  n loading is tur
afc0: 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d 70 69  ned off at compi
afd0: 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20 20  le-time",.      
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
aff0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b000: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a  L_ERROR;.#endif.
b010: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
b020: 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a    $db errorcode.
b030: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
b040: 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72   the numeric err
b050: 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61 73  or code that was
b060: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
b070: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a   most recent.  *
b080: 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
b090: 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20  3_exec()..  */. 
b0a0: 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f   case DB_ERRORCO
b0b0: 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  DE: {.    Tcl_Se
b0c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
b0d0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
b0e0: 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  (sqlite3_errcode
b0f0: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
b100: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a   break;.  }.   .
b110: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
b120: 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61   eval $sql ?arra
b130: 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e  y? ?{  ...code..
b140: 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62  . }?.  **    $db
b150: 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a   onecolumn $sql.
b160: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
b170: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24  L statement in $
b180: 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64  sql is evaluated
b190: 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c  .  For each row,
b1a0: 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a   the values are.
b1b0: 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65    ** placed in e
b1c0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61  lements of the a
b1d0: 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61  rray named "arra
b1e0: 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e  y" and ...code..
b1f0: 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  . is executed.. 
b200: 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61   ** If "array" a
b210: 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d  nd "code" are om
b220: 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63  itted, then no c
b230: 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79  allback is every
b240: 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49   invoked..  ** I
b250: 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20  f "array" is an 
b260: 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
b270: 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  en the values ar
b280: 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69  e placed in vari
b290: 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  ables.  ** that 
b2a0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61  have the same na
b2b0: 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73  me as the fields
b2c0: 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68   extracted by th
b2d0: 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  e query..  **.  
b2e0: 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e  ** The onecolumn
b2f0: 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20 65   method is the e
b300: 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20  quivalent of:.  
b310: 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 24  **     lindex [$
b320: 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a  db eval $sql] 0.
b330: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4f    */.  case DB_O
b340: 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61 73 65  NECOLUMN:.  case
b350: 20 44 42 5f 45 56 41 4c 3a 0a 20 20 63 61 73 65   DB_EVAL:.  case
b360: 20 44 42 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20   DB_EXISTS: {.  
b370: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53    char const *zS
b380: 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  ql;      /* Next
b390: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
b3a0: 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 20  o execute */.   
b3b0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4c 65   char const *zLe
b3c0: 66 74 3b 20 20 20 20 20 2f 2a 20 57 68 61 74 20  ft;     /* What 
b3d0: 69 73 20 6c 65 66 74 20 61 66 74 65 72 20 66 69  is left after fi
b3e0: 72 73 74 20 73 74 6d 74 20 69 6e 20 7a 53 71 6c  rst stmt in zSql
b3f0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
b400: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f  stmt *pStmt;   /
b410: 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73  * Compiled SQL s
b420: 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 54  tatment */.    T
b430: 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20  cl_Obj *pArray; 
b440: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
b450: 20 61 72 72 61 79 20 69 6e 74 6f 20 77 68 69 63   array into whic
b460: 68 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72  h results are wr
b470: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54 63 6c  itten */.    Tcl
b480: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
b490: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 74 6f      /* Script to
b4a0: 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20 72 65   run for each re
b4b0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
b4c0: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61 72 6d  Tcl_Obj **apParm
b4d0: 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65  ;      /* Parame
b4e0: 74 65 72 73 20 74 68 61 74 20 6e 65 65 64 20 61  ters that need a
b4f0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
b500: 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  t() */.    int n
b510: 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Parm;           
b520: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
b530: 6e 74 72 69 65 73 20 75 73 65 64 20 69 6e 20 61  ntries used in a
b540: 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54  pParm[] */.    T
b550: 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b 31 30  cl_Obj *aParm[10
b560: 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74 69 63 20  ];    /* Static 
b570: 73 70 61 63 65 20 66 6f 72 20 61 70 50 61 72 6d  space for apParm
b580: 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  [] in the common
b590: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 54 63 6c   case */.    Tcl
b5a0: 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20 20 20  _Obj *pRet;     
b5b0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
b5c0: 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 20  be returned */. 
b5d0: 20 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74     SqlPreparedSt
b5e0: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 2f  mt *pPreStmt;  /
b5f0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  * Pointer to a p
b600: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
b610: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 32  t */.    int rc2
b620: 3b 0a 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63  ;..    if( choic
b630: 65 3d 3d 44 42 5f 45 56 41 4c 20 29 7b 0a 20 20  e==DB_EVAL ){.  
b640: 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c      if( objc<3 |
b650: 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20  | objc>5 ){.    
b660: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
b670: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
b680: 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41  objv, "SQL ?ARRA
b690: 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f  Y-NAME? ?SCRIPT?
b6a0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
b6b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 74      }.      pRet
b6d0: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
b6e0: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
b6f0: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
b700: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b710: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
b720: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
b730: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
b740: 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b  2, objv, "SQL");
b750: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b760: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
b770: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 68 6f   }.      if( cho
b780: 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20 29  ice==DB_EXISTS )
b790: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  {.        pRet =
b7a0: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
b7b0: 62 6a 28 30 29 3b 0a 20 20 20 20 20 20 20 20 54  bj(0);.        T
b7c0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
b7d0: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pRet);.      }el
b7e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74  se{.        pRet
b7f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
b800: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
b810: 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 41 72  ==3 ){.      pAr
b820: 72 61 79 20 3d 20 70 53 63 72 69 70 74 20 3d 20  ray = pScript = 
b830: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
b840: 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
b850: 20 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20    pArray = 0;.  
b860: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
b870: 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  jv[3];.    }else
b880: 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d  {.      pArray =
b890: 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20   objv[3];.      
b8a0: 69 66 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  if( Tcl_GetStrin
b8b0: 67 28 70 41 72 72 61 79 29 5b 30 5d 3d 3d 30 20  g(pArray)[0]==0 
b8c0: 29 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20  ) pArray = 0;.  
b8d0: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
b8e0: 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  jv[4];.    }..  
b8f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
b900: 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  nt(objv[2]);.   
b910: 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zSql = Tcl_GetS
b920: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
b930: 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 77 68  v[2], 0);.    wh
b940: 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20  ile( rc==TCL_OK 
b950: 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20  && zSql[0] ){.  
b960: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b980: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
b990: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 72  /.      int nVar
b9a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b9b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b9c0: 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  bind parameters 
b9d0: 69 6e 20 74 68 65 20 70 53 74 6d 74 20 2a 2f 0a  in the pStmt */.
b9e0: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20        int nCol; 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
ba10: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
ba20: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  ult set */.     
ba30: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c   Tcl_Obj **apCol
ba40: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 2f 2a 20 41  Name = 0;   /* A
ba50: 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  rray of column n
ba60: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ames */.      in
ba70: 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  t len;          
ba80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
ba90: 6e 67 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 71  ng length of zSq
baa0: 6c 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 2f 2a  l */.  .      /*
bab0: 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 53   Try to find a S
bac0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  QL statement tha
bad0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
bae0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64 0a  en compiled and.
baf0: 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d        ** which m
bb00: 61 74 63 68 65 73 20 74 68 65 20 6e 65 78 74 20  atches the next 
bb10: 73 65 71 75 65 6e 63 65 20 6f 66 20 53 51 4c 2e  sequence of SQL.
bb20: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
bb30: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
bb40: 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d   pPreStmt = pDb-
bb50: 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20  >stmtList;.     
bb60: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 53   len = strlen(zS
bb70: 71 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ql);.      if( p
bb80: 50 72 65 53 74 6d 74 20 26 26 20 73 71 6c 69 74  PreStmt && sqlit
bb90: 65 33 5f 65 78 70 69 72 65 64 28 70 50 72 65 53  e3_expired(pPreS
bba0: 74 6d 74 2d 3e 70 53 74 6d 74 29 20 29 7b 0a 20  tmt->pStmt) ){. 
bbb0: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
bbc0: 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20 20 20  Cache(pDb);.    
bbd0: 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 30      pPreStmt = 0
bbe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bbf0: 66 6f 72 28 3b 20 70 50 72 65 53 74 6d 74 3b 20  for(; pPreStmt; 
bc00: 70 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74 6d  pPreStmt=pPreStm
bc10: 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
bc20: 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65 53     int n = pPreS
bc30: 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 20  tmt->nSql;.     
bc40: 20 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 20 0a 20     if( len>=n . 
bc50: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65             && me
bc60: 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a  mcmp(pPreStmt->z
bc70: 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30  Sql, zSql, n)==0
bc80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
bc90: 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a  (zSql[n]==0 || z
bca0: 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20  Sql[n-1]==';'). 
bcb0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
bcc0: 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65      pStmt = pPre
bcd0: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  Stmt->pStmt;.   
bce0: 20 20 20 20 20 20 20 7a 4c 65 66 74 20 3d 20 26         zLeft = &
bcf0: 7a 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e  zSql[pPreStmt->n
bd00: 53 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20  Sql];..         
bd10: 20 2f 2a 20 57 68 65 6e 20 61 20 70 72 65 70 61   /* When a prepa
bd20: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73  red statement is
bd30: 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69   found, unlink i
bd40: 74 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20  t from the.     
bd50: 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c 69       ** cache li
bd60: 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61 74  st.  It will lat
bd70: 65 72 20 62 65 20 61 64 64 65 64 20 62 61 63 6b  er be added back
bd80: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
bd90: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  g.          ** o
bda0: 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74  f the cache list
bdb0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
bdc0: 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61  lement LRU repla
bdd0: 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  cement..        
bde0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
bdf0: 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72  f( pPreStmt->pPr
be00: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
be10: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65    pPreStmt->pPre
be20: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65 53  v->pNext = pPreS
be30: 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  tmt->pNext;.    
be40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
be50: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
be60: 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d  mtList = pPreStm
be70: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
be80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
be90: 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  if( pPreStmt->pN
bea0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
beb0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65     pPreStmt->pNe
bec0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  xt->pPrev = pPre
bed0: 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Stmt->pPrev;.   
bee0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bef0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
bf00: 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74  tmtLast = pPreSt
bf10: 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  mt->pPrev;.     
bf20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
bf30: 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20   pDb->nStmt--;. 
bf40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bf50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bf60: 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  }.  .      /* If
bf70: 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74 61   no prepared sta
bf80: 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e 64  tement was found
bf90: 2e 20 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 53  .  Compile the S
bfa0: 51 4c 20 74 65 78 74 0a 20 20 20 20 20 20 2a 2f  QL text.      */
bfb0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74  .      if( pStmt
bfc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
bfd0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
bfe0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
bff0: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
c000: 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29   &pStmt, &zLeft)
c010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
c020: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
c030: 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
c040: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
c050: 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  g(pDb->db)));.  
c060: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
c070: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
c080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
c090: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
c0a0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
c0b0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
c0c0: 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
c0d0: 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a  ode(pDb->db) ){.
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
c0f0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72   compile-time er
c100: 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65  ror in the state
c110: 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  ment.           
c120: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
c130: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
c140: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
c150: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  oObj(sqlite3_err
c160: 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  msg(pDb->db)));.
c170: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
c180: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c190: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c1a0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c1c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  he statement was
c1d0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69   a no-op.  Conti
c1e0: 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nue to the next 
c1f0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
c200: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
c210: 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  SQL string..    
c220: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c230: 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c         zSql = zL
c240: 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
c250: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
c260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
c270: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c280: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a   pPreStmt==0 );.
c290: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
c2a0: 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74 6f  * Bind values to
c2b0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
c2c0: 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f 72   begin with $ or
c2d0: 20 3a 0a 20 20 20 20 20 20 2a 2f 20 20 0a 20 20   :.      */  .  
c2e0: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
c2f0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
c300: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
c310: 20 20 20 20 20 20 6e 50 61 72 6d 20 3d 20 30 3b        nParm = 0;
c320: 0a 20 20 20 20 20 20 69 66 28 20 6e 56 61 72 3e  .      if( nVar>
c330: 73 69 7a 65 6f 66 28 61 50 61 72 6d 29 2f 73 69  sizeof(aParm)/si
c340: 7a 65 6f 66 28 61 50 61 72 6d 5b 30 5d 29 20 29  zeof(aParm[0]) )
c350: 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d  {.        apParm
c360: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63   = (Tcl_Obj**)Tc
c370: 6c 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a 73 69 7a  l_Alloc(nVar*siz
c380: 65 6f 66 28 61 70 50 61 72 6d 5b 30 5d 29 29 3b  eof(apParm[0]));
c390: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c3a0: 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 61        apParm = a
c3b0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Parm;.      }.  
c3c0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
c3d0: 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVar; i++){.    
c3e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c3f0: 7a 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  zVar = sqlite3_b
c400: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
c410: 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  me(pStmt, i);.  
c420: 20 20 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d        if( zVar!=
c430: 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27  0 && (zVar[0]=='
c440: 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27  $' || zVar[0]=='
c450: 3a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  :') ){.         
c460: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d   Tcl_Obj *pVar =
c470: 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
c480: 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c  nterp, &zVar[1],
c490: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
c4a0: 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20    if( pVar ){.  
c4b0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b            int n;
c4c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
c4d0: 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20  *data;.         
c4e0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d     char *zType =
c4f0: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f   pVar->typePtr ?
c500: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e   pVar->typePtr->
c510: 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20  name : "";.     
c520: 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
c530: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20  zType[0];.      
c540: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27        if( c=='b'
c550: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
c560: 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30  ,"bytearray")==0
c570: 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d   && pVar->bytes=
c580: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
c590: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6c 6f 61 64      /* Only load
c5a0: 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20   a BLOB type if 
c5b0: 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65  the Tcl variable
c5c0: 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20   is a bytearray 
c5d0: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  and.            
c5e0: 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69    ** has no stri
c5f0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
c600: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  n. */.          
c610: 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47      data = Tcl_G
c620: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
c630: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
c640: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c650: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
c660: 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c  tmt, i, data, n,
c670: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
c680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
c690: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c6a0: 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pVar);.         
c6b0: 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72       apParm[nPar
c6c0: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
c6d0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
c6e0: 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74  f( (c=='b' && st
c6f0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
c700: 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  ean")==0) ||.   
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
c720: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
c730: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
c740: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
c750: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
c760: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
c770: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
c780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
c790: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c  nd_int(pStmt, i,
c7a0: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   n);.           
c7b0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64   }else if( c=='d
c7c0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
c7d0: 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  e,"double")==0 )
c7e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
c7f0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20  double r;.      
c800: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
c810: 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
c820: 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  erp, pVar, &r);.
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c840: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
c850: 65 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a  e(pStmt, i, r);.
c860: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
c870: 65 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20  e if( c=='w' && 
c880: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
c890: 64 65 49 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20  deInt")==0 ){.  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
c8b0: 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20  WideInt v;.     
c8c0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
c8d0: 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
c8e0: 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29  nterp, pVar, &v)
c8f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
c900: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
c910: 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b  64(pStmt, i, v);
c920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
c930: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
c940: 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e    data = (unsign
c950: 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65  ed char *)Tcl_Ge
c960: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
c970: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
c980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c990: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
c9a0: 20 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61   i, (char *)data
c9b0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
c9c0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
c9d0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
c9e0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
c9f0: 20 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b           apParm[
ca00: 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b  nParm++] = pVar;
ca10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
ca20: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ca40: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 20 70  te3_bind_null( p
ca50: 53 74 6d 74 2c 20 69 20 29 3b 0a 20 20 20 20 20  Stmt, i );.     
ca60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ca70: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ca80: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d  /* Compute colum
ca90: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20  n names */.     
caa0: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
cab0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
cac0: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  mt);.      if( p
cad0: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
cae0: 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54    apColName = (T
caf0: 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c  cl_Obj**)Tcl_All
cb00: 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f  oc( sizeof(Tcl_O
cb10: 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20  bj*)*nCol );.   
cb20: 20 20 20 20 20 69 66 28 20 61 70 43 6f 6c 4e 61       if( apColNa
cb30: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
cb40: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
cb50: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
cb60: 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d          apColNam
cb70: 65 5b 69 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f  e[i] = dbTextToO
cb80: 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
cb90: 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  n_name(pStmt,i))
cba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
cbb0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43  IncrRefCount(apC
cbc0: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
cbd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
cbe0: 20 20 20 20 20 2f 2a 20 49 66 20 72 65 73 75 6c       /* If resul
cbf0: 74 73 20 61 72 65 20 62 65 69 6e 67 20 73 74 6f  ts are being sto
cc00: 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20  red in an array 
cc10: 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e 20 63  variable, then c
cc20: 72 65 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  reate.      ** t
cc30: 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72  he array(*) entr
cc40: 79 20 66 6f 72 20 74 68 61 74 20 61 72 72 61 79  y for that array
cc50: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cc60: 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a 20 20  if( pArray ){.  
cc70: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
cc80: 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65  ColList = Tcl_Ne
cc90: 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 20 20  wObj();.        
cca0: 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d  Tcl_Obj *pStar =
ccb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ccc0: 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 20 20 20 20  j("*", -1);.    
ccd0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
cce0: 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a  ount(pColList);.
ccf0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
cd00: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
cd10: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
cd20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
cd30: 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69  t(interp, pColLi
cd40: 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  st, apColName[i]
cd50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cd60: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
cd70: 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72  ar2(interp, pArr
cd80: 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c  ay, pStar, pColL
cd90: 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ist,0);.        
cda0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cdb0: 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20  (pColList);.    
cdc0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
cdd0: 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20  ount(pStar);.   
cde0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
cdf0: 78 65 63 75 74 65 20 74 68 65 20 53 51 4c 0a 20  xecute the SQL. 
ce00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68       */.      wh
ce10: 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20  ile( rc==TCL_OK 
ce20: 26 26 20 70 53 74 6d 74 20 26 26 20 53 51 4c 49  && pStmt && SQLI
ce30: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
ce40: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
ce50: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
ce60: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
ce70: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
ce80: 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pVal;.         
ce90: 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53   .          /* S
cea0: 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61  et pVal to conta
ceb0: 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  in the i'th colu
cec0: 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20  mn of this row. 
ced0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 77 69  */.          swi
cee0: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
cef0: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
cf00: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i) ){.          
cf10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
cf20: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
cf30: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
cf40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
cf50: 79 74 65 73 28 70 53 74 6d 74 2c 20 69 29 3b 0a  ytes(pStmt, i);.
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
cf70: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  al = Tcl_NewByte
cf80: 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33  ArrayObj(sqlite3
cf90: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
cfa0: 6d 74 2c 20 69 29 2c 20 62 79 74 65 73 29 3b 0a  mt, i), bytes);.
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
cfc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
cfd0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
cfe0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
cff0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
d000: 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34      sqlite_int64
d010: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   v = sqlite3_col
d020: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
d030: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
d040: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
d050: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
d060: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
d070: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
d080: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
d090: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d0a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d0b0: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
d0c0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
d0d0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d0e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
d0f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d110: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d120: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
d130: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
d140: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
d150: 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
d160: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d170: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44   pVal = Tcl_NewD
d180: 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20  oubleObj(r);.   
d190: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
d1a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
d1c0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a   SQLITE_NULL: {.
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
d1e0: 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a  al = dbTextToObj
d1f0: 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20  (pDb->zNull);.  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
d210: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
d220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  .            def
d230: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
d240: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54        pVal = dbT
d250: 65 78 74 54 6f 4f 62 6a 28 28 63 68 61 72 20 2a  extToObj((char *
d260: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
d270: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29 29 3b  text(pStmt, i));
d280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
d290: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
d2a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
d2b0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28    .          if(
d2c0: 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20   pScript ){.    
d2d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 72          if( pArr
d2e0: 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ay==0 ){.       
d2f0: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
d300: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70  tVar2(interp, ap
d310: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70  ColName[i], 0, p
d320: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Val, 0);.       
d330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d340: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
d350: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
d360: 20 70 41 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61   pArray, apColNa
d370: 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b  me[i], pVal, 0);
d380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d390: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
d3a0: 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e  f( choice==DB_ON
d3b0: 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  ECOLUMN ){.     
d3c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d3d0: 52 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ret==0 );.      
d3e0: 20 20 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d        if( pRet==
d3f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
d400: 20 20 20 70 52 65 74 20 3d 20 70 56 61 6c 3b 0a     pRet = pVal;.
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
d420: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
d430: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ret);.          
d440: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
d450: 72 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a  rc = TCL_BREAK;.
d460: 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20              i = 
d470: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  nCol;.          
d480: 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65  }else if( choice
d490: 3d 3d 44 42 5f 45 58 49 53 54 53 20 29 7b 0a 20  ==DB_EXISTS ){. 
d4a0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44             Tcl_D
d4b0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ecrRefCount(pRet
d4c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
d4d0: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f  Ret = Tcl_NewBoo
d4e0: 6c 65 61 6e 4f 62 6a 28 31 29 3b 0a 20 20 20 20  leanObj(1);.    
d4f0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
d500: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
d510: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
d520: 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20   TCL_BREAK;.    
d530: 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c          i = nCol
d540: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
d550: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  e{.            T
d560: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
d570: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
d580: 70 52 65 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20  pRet, pVal);.   
d590: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d5a0: 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66   }.  .        if
d5b0: 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20  ( pScript ){.   
d5c0: 20 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f         rc = Tcl_
d5d0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
d5e0: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
d5f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
d600: 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 7b  =TCL_CONTINUE ){
d610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
d620: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20  = TCL_OK;.      
d630: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d650: 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
d660: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d670: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  TCL_OK;.      }.
d680: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74  .      /* Free t
d690: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f  he column name o
d6a0: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  bjects */.      
d6b0: 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20  if( pScript ){. 
d6c0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
d6d0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
d6e0: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
d6f0: 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61  RefCount(apColNa
d700: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  me[i]);.        
d710: 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  }.        Tcl_Fr
d720: 65 65 28 28 63 68 61 72 2a 29 61 70 43 6f 6c 4e  ee((char*)apColN
d730: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ame);.      }.. 
d740: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65       /* Free the
d750: 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61 6e   bound string an
d760: 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65 72  d blob parameter
d770: 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  s */.      for(i
d780: 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b  =0; i<nParm; i++
d790: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ){.        Tcl_D
d7a0: 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 50 61  ecrRefCount(apPa
d7b0: 72 6d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rm[i]);.      }.
d7c0: 20 20 20 20 20 20 69 66 28 20 61 70 50 61 72 6d        if( apParm
d7d0: 21 3d 61 50 61 72 6d 20 29 7b 0a 20 20 20 20 20  !=aParm ){.     
d7e0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
d7f0: 72 2a 29 61 70 50 61 72 6d 29 3b 0a 20 20 20 20  r*)apParm);.    
d800: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65    }..      /* Re
d810: 73 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  set the statemen
d820: 74 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  t.  If the resul
d830: 74 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  t code is SQLITE
d840: 5f 53 43 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20  _SCHEMA, then.  
d850: 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65      ** flush the
d860: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65   statement cache
d870: 20 61 6e 64 20 74 72 79 20 74 68 65 20 73 74 61   and try the sta
d880: 74 65 6d 65 6e 74 20 61 67 61 69 6e 2e 0a 20 20  tement again..  
d890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 32      */.      rc2
d8a0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
d8b0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
d8c0: 66 28 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  f( SQLITE_SCHEMA
d8d0: 3d 3d 72 63 32 20 29 7b 0a 20 20 20 20 20 20 20  ==rc2 ){.       
d8e0: 20 2f 2a 20 41 66 74 65 72 20 61 20 73 63 68 65   /* After a sche
d8f0: 6d 61 20 63 68 61 6e 67 65 2c 20 66 6c 75 73 68  ma change, flush
d900: 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 74   the cache and t
d910: 72 79 20 74 6f 20 72 75 6e 20 74 68 65 0a 20 20  ry to run the.  
d920: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
d930: 6e 74 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20  nt again.       
d940: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c 75 73   */.        flus
d950: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
d960: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d970: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
d980: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
d990: 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46  pPreStmt ) Tcl_F
d9a0: 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65 53  ree((char*)pPreS
d9b0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  tmt);.        co
d9c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
d9d0: 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  lse if( SQLITE_O
d9e0: 4b 21 3d 72 63 32 20 29 7b 0a 20 20 20 20 20 20  K!=rc2 ){.      
d9f0: 20 20 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74 69    /* If a run-ti
da00: 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  me error occurs,
da10: 20 72 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f   report the erro
da20: 72 20 61 6e 64 20 73 74 6f 70 20 72 65 61 64 69  r and stop readi
da30: 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ng.        ** th
da40: 65 20 53 51 4c 0a 20 20 20 20 20 20 20 20 2a 2f  e SQL.        */
da50: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
da60: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
da70: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
da80: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
da90: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20  ->db)));.       
daa0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
dab0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
dac0: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
dad0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
dae0: 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65  reStmt ) Tcl_Fre
daf0: 65 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d  e((char*)pPreStm
db00: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
db10: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
db20: 66 28 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c  f( pDb->maxStmt<
db30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
db40: 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69 73   If the cache is
db50: 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65 61   turned off, dea
db60: 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74 61  llocated the sta
db70: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
db80: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29    if( pPreStmt )
db90: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
dba0: 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20  )pPreStmt);.    
dbb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
dbc0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
dbd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dbe0: 20 20 2f 2a 20 45 76 65 72 79 74 68 69 6e 67 20    /* Everything 
dbf0: 77 6f 72 6b 65 64 20 61 6e 64 20 74 68 65 20 63  worked and the c
dc00: 61 63 68 65 20 69 73 20 6f 70 65 72 61 74 69 6f  ache is operatio
dc10: 6e 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  nal..        ** 
dc20: 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 71 6c  Create a new Sql
dc30: 50 72 65 70 61 72 65 64 53 74 6d 74 20 73 74 72  PreparedStmt str
dc40: 75 63 74 75 72 65 20 69 66 20 77 65 20 6e 65 65  ucture if we nee
dc50: 64 20 6f 6e 65 2e 0a 20 20 20 20 20 20 20 20 2a  d one..        *
dc60: 2a 20 28 49 66 20 77 65 20 61 6c 72 65 61 64 79  * (If we already
dc70: 20 68 61 76 65 20 6f 6e 65 20 77 65 20 63 61 6e   have one we can
dc80: 20 6a 75 73 74 20 72 65 75 73 65 20 69 74 2e 29   just reuse it.)
dc90: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
dca0: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
dcb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
dcc0: 20 6c 65 6e 20 3d 20 7a 4c 65 66 74 20 2d 20 7a   len = zLeft - z
dcd0: 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sql;.          p
dce0: 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c 50 72  PreStmt = (SqlPr
dcf0: 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f  eparedStmt*)Tcl_
dd00: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
dd10: 50 72 65 53 74 6d 74 29 20 2b 20 6c 65 6e 20 29  PreStmt) + len )
dd20: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
dd30: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 20 72 65  pPreStmt==0 ) re
dd40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
dd50: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
dd60: 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d  mt->pStmt = pStm
dd70: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  t;.          pPr
dd80: 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65  eStmt->nSql = le
dd90: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  n;.          mem
dda0: 63 70 79 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  cpy(pPreStmt->zS
ddb0: 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e 29 3b 0a  ql, zSql, len);.
ddc0: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
ddd0: 6d 74 2d 3e 7a 53 71 6c 5b 6c 65 6e 5d 20 3d 20  mt->zSql[len] = 
dde0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
ddf0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
de00: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
de10: 65 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ent to the begin
de20: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68  ning of the cach
de30: 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 2a  e list.        *
de40: 2f 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74  /.        pPreSt
de50: 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  mt->pNext = pDb-
de60: 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20  >stmtList;.     
de70: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
de80: 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
de90: 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  if( pDb->stmtLis
dea0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 44  t ){.         pD
deb0: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72  b->stmtList->pPr
dec0: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  ev = pPreStmt;. 
ded0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dee0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
def0: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
df00: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
df10: 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
df20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
df30: 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->nStmt==0 );.  
df40: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
df50: 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tLast = pPreStmt
df60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
df70: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
df80: 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20  t( pDb->nStmt>0 
df90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dfa0: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b       pDb->nStmt+
dfb0: 2b 3b 0a 20 20 20 0a 20 20 20 20 20 20 20 20 2f  +;.   .        /
dfc0: 2a 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f  * If we have too
dfd0: 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20   many statement 
dfe0: 69 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65  in cache, remove
dff0: 20 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f   the surplus fro
e000: 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  m the.        **
e010: 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68   end of the cach
e020: 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  e list..        
e030: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
e040: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62  ( pDb->nStmt>pDb
e050: 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20  ->maxStmt ){.   
e060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e070: 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d  inalize(pDb->stm
e080: 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  tLast->pStmt);. 
e090: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
e0a0: 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74  mtLast = pDb->st
e0b0: 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20  mtLast->pPrev;. 
e0c0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65           Tcl_Fre
e0d0: 65 28 28 63 68 61 72 2a 29 70 44 62 2d 3e 73 74  e((char*)pDb->st
e0e0: 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a  mtLast->pNext);.
e0f0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
e100: 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d  tmtLast->pNext =
e110: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44   0;.          pD
e120: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
e130: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
e140: 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 65 64 20       /* Proceed 
e150: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
e160: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
e170: 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20  Sql = zLeft;.   
e180: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
e190: 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29  efCount(objv[2])
e1a0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  ;..    if( pRet 
e1b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
e1c0: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
e1d0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
e1e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
e1f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e200: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
e210: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c  t(pRet);.    }el
e220: 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f  se if( rc==TCL_O
e230: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 52  K ){.      Tcl_R
e240: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
e250: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  p);.    }.    br
e260: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
e270: 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63   **     $db func
e280: 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50 54  tion NAME SCRIPT
e290: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
e2a0: 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63  e a new SQL func
e2b0: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
e2c0: 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61 74  .  Whenever that
e2d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a   function is.  *
e2e0: 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  * called, invoke
e2f0: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
e300: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
e310: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
e320: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
e330: 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b   SqlFunc *pFunc;
e340: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
e350: 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20  cript;.    char 
e360: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  *zName;.    if( 
e370: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
e380: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
e390: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
e3a0: 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22  v, "NAME SCRIPT"
e3b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e3c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e3d0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
e3e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
e3f0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
e400: 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
e410: 76 5b 33 5d 3b 0a 20 20 20 20 70 46 75 6e 63 20  v[3];.    pFunc 
e420: 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44  = findSqlFunc(pD
e430: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, zName);.    i
e440: 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65  f( pFunc==0 ) re
e450: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e460: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70      if( pFunc->p
e470: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
e480: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
e490: 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29  (pFunc->pScript)
e4a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e  ;.    }.    pFun
e4b0: 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63  c->pScript = pSc
e4c0: 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ript;.    Tcl_In
e4d0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
e4e0: 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e  pt);.    pFunc->
e4f0: 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61  useEvalObjv = sa
e500: 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
e510: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29  interp, pScript)
e520: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
e530: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
e540: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
e550: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
e560: 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e  F8,.        pFun
e570: 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30  c, tclSqlFunc, 0
e580: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
e590: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e5a0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
e5b0: 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ROR;.      Tcl_S
e5c0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
e5d0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
e5e0: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
e5f0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
e600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e610: 20 20 2f 2a 20 4d 75 73 74 20 66 6c 75 73 68 20    /* Must flush 
e620: 61 6e 79 20 63 61 63 68 65 64 20 73 74 61 74 65  any cached state
e630: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 66  ments */.      f
e640: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
e650: 44 62 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Db );.    }.    
e660: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
e670: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
e680: 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c  crblob ?-readonl
e690: 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
e6a0: 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a  LUMN ROWID.  */.
e6b0: 20 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c    case DB_INCRBL
e6c0: 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c  OB: {.#ifdef SQL
e6d0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
e6e0: 42 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  B.    Tcl_Append
e6f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e700: 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61  incrblob not ava
e710: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
e720: 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72  uild", 0);.    r
e730: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e740: 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69  .#else.    int i
e750: 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20  sReadonly = 0;. 
e760: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e770: 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
e780: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
e790: 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
e7a0: 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20  har *zColumn;.  
e7b0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
e7c0: 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  Row;..    /* Che
e7d0: 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65 61 64  ck for the -read
e7e0: 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  only option */. 
e7f0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 26 26     if( objc>3 &&
e800: 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53   strcmp(Tcl_GetS
e810: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
e820: 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20  "-readonly")==0 
e830: 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  ){.      isReado
e840: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  nly = 1;.    }..
e850: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 28 35      if( objc!=(5
e860: 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20  +isReadonly) && 
e870: 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61 64 6f  objc!=(6+isReado
e880: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 54 63  nly) ){.      Tc
e890: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
e8a0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
e8b0: 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42  "?-readonly? ?DB
e8c0: 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52  ? TABLE COLUMN R
e8d0: 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20 72 65  OWID");.      re
e8e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e8f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
e900: 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e  bjc==(6+isReadon
e910: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  ly) ){.      zDb
e920: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e930: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d  (objv[2]);.    }
e940: 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63  .    zTable = Tc
e950: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e960: 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a  [objc-3]);.    z
e970: 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74  Column = Tcl_Get
e980: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63  String(objv[objc
e990: 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  -2]);.    rc = T
e9a0: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
e9b0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
e9c0: 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77  v[objc-1], &iRow
e9d0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
e9e0: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
e9f0: 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63 72 62  rc = createIncrb
ea00: 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20  lobChannel(.    
ea10: 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 70 44        interp, pD
ea20: 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20  b, zDb, zTable, 
ea30: 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69  zColumn, iRow, i
ea40: 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20  sReadonly.      
ea50: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
ea60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ea70: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
ea80: 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a  b interrupt.  **
ea90: 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20  .  ** Interrupt 
eaa0: 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
eab0: 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
eac0: 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  SQL interpreter.
ead0: 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73    This.  ** caus
eae0: 65 73 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  es the SQL state
eaf0: 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61  ment to return a
eb00: 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54  n error of SQLIT
eb10: 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a  E_INTERRUPT..  *
eb20: 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45  /.  case DB_INTE
eb30: 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c  RRUPT: {.    sql
eb40: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70  ite3_interrupt(p
eb50: 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65  Db->db);.    bre
eb60: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
eb70: 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76  **     $db nullv
eb80: 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20  alue ?STRING?.  
eb90: 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
eba0: 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61 20  ext used when a 
ebb0: 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
ebc0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
ebd0: 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20  e. If ?STRING?. 
ebe0: 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65   ** is not prese
ebf0: 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nt, then the cur
ec00: 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64  rent string used
ec10: 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74   for NULL is ret
ec20: 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53  urned..  ** If S
ec30: 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74  TRING is present
ec40: 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73  , then STRING is
ec50: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a   returned..  **.
ec60: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e    */.  case DB_N
ec70: 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  ULLVALUE: {.    
ec80: 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
ec90: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
eca0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
ecb0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
ecc0: 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a  , "NULLVALUE");.
ecd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ece0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
ecf0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
ed00: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
ed10: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c        char *zNul
ed20: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
ed30: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
ed40: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
ed50: 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
ed60: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
ed70: 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20  e(pDb->zNull);. 
ed80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ed90: 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20   zNull && len>0 
eda0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
edb0: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zNull = Tcl_Allo
edc0: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
edd0: 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 70 44        strncpy(pD
ede0: 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c  b->zNull, zNull,
edf0: 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70   len);.        p
ee00: 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d  Db->zNull[len] =
ee10: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\0';.      }el
ee20: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
ee30: 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  >zNull = 0;.    
ee40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63    }.    }.    Tc
ee50: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
ee60: 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
ee70: 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b  bj(pDb->zNull));
ee80: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
ee90: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
eea0: 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  db last_insert_r
eeb0: 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owid .  **.  ** 
eec0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
eed0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52  r which is the R
eee0: 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73  OWID for the mos
eef0: 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e  t recent insert.
ef00: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
ef10: 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49  LAST_INSERT_ROWI
ef20: 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  D: {.    Tcl_Obj
ef30: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54   *pResult;.    T
ef40: 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64  cl_WideInt rowid
ef50: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
ef60: 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
ef70: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
ef80: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
ef90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
efa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
efb0: 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69      rowid = sqli
efc0: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
efd0: 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a  rowid(pDb->db);.
efe0: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
eff0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
f000: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
f010: 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52  SetWideIntObj(pR
f020: 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20  esult, rowid);. 
f030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f040: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f   /*.  ** The DB_
f050: 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64  ONECOLUMN method
f060: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
f070: 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42  together with DB
f080: 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  _EVAL..  */..  /
f090: 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73  *    $db progres
f0a0: 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20  s ?N CALLBACK?. 
f0b0: 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65   ** .  ** Invoke
f0c0: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
f0d0: 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74  ack every N virt
f0e0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f  ual machine opco
f0f0: 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74  des while execut
f100: 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  ing.  ** queries
f110: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
f120: 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20  _PROGRESS: {.   
f130: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
f140: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f150: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
f160: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f170: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
f180: 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b  ->zProgress, 0);
f190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f1a0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
f1b0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
f1c0: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69  rogress;.      i
f1d0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e  nt len;.      in
f1e0: 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t N;.      if( T
f1f0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
f200: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
f210: 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b   objv[2], &N) ){
f220: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
f230: 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  OR;.      };.   
f240: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
f250: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
f260: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
f270: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
f280: 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65   }.      zProgre
f290: 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ss = Tcl_GetStri
f2a0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
f2b0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
f2c0: 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26  if( zProgress &&
f2d0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
f2e0: 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
f2f0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
f300: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
f310: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
f320: 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73  ogress, zProgres
f330: 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  s, len+1);.     
f340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f350: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
f360: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
f370: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f380: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
f390: 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  K.      if( pDb-
f3a0: 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
f3b0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
f3c0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
f3d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
f3e0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
f3f0: 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72  ->db, N, DbProgr
f400: 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  essHandler, pDb)
f410: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
f430: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
f440: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30  pDb->db, 0, 0, 0
f450: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
f460: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
f470: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f480: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f490: 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b  bjv, "N CALLBACK
f4a0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f4b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f4c0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
f4d0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
f4e0: 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  ofile ?CALLBACK?
f4f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
f500: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
f510: 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
f520: 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65  ACK routine afte
f530: 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
f540: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68  ment.  ** that h
f550: 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78  as run.  The tex
f560: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64  t of the SQL and
f570: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65   the amount of e
f580: 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20  lapse time are. 
f590: 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20   ** appended to 
f5a0: 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
f5b0: 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75  the script is ru
f5c0: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
f5d0: 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20  B_PROFILE: {.   
f5e0: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
f5f0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f600: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f610: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
f620: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
f630: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f640: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
f650: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
f660: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
f670: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
f680: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f690: 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  p, pDb->zProfile
f6a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
f6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
f6c0: 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20  har *zProfile;. 
f6d0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
f6e0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
f6f0: 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
f700: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
f710: 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20  Profile);.      
f720: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65  }.      zProfile
f730: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f740: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
f750: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
f760: 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65  ( zProfile && le
f770: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
f780: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54  Db->zProfile = T
f790: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
f7a0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
f7b0: 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  cpy(pDb->zProfil
f7c0: 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e  e, zProfile, len
f7d0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
f7e0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
f7f0: 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20  Profile = 0;.   
f800: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f810: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
f820: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
f830: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
f840: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
f850: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
f860: 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
f870: 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69  pDb->db, DbProfi
f880: 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  leHandler, pDb);
f890: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f8a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
f8b0: 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30  ofile(pDb->db, 0
f8c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
f8d0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
f8e0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
f8f0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b    **     $db rek
f900: 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a  ey KEY.  **.  **
f910: 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72   Change the encr
f920: 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68  yption key on th
f930: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
f940: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
f950: 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a    case DB_REKEY:
f960: 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b   {.    int nKey;
f970: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b  .    void *pKey;
f980: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
f990: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
f9a0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f9b0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59  p, 2, objv, "KEY
f9c0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f9d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f9e0: 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c  }.    pKey = Tcl
f9f0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
fa00: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e  mObj(objv[2], &n
fa10: 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Key);.#ifdef SQL
fa20: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
fa30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
fa40: 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b  ekey(pDb->db, pK
fa50: 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69  ey, nKey);.    i
fa60: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
fa70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
fa80: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
fa90: 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
faa0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
fab0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ROR;.    }.#endi
fac0: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
fad0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
fae0: 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c  $db timeout MILL
faf0: 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20  ESECONDS.  **.  
fb00: 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65  ** Delay for the
fb10: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
fb20: 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65  seconds specifie
fb30: 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73  d when a file is
fb40: 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20   locked..  */.  
fb50: 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a  case DB_TIMEOUT:
fb60: 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20   {.    int ms;. 
fb70: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
fb80: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
fb90: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fba0: 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49   2, objv, "MILLI
fbb0: 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20  SECONDS");.     
fbc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fbd0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
fbe0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
fbf0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
fc00: 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
fc10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
fc20: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
fc30: 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d  meout(pDb->db, m
fc40: 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  s);.    break;. 
fc50: 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
fc60: 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68      $db total_ch
fc70: 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
fc80: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
fc90: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
fca0: 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
fcb0: 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
fcc0: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
fcd0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
fce0: 6c 65 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  le was created..
fcf0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
fd00: 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a  OTAL_CHANGES: {.
fd10: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
fd20: 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  sult;.    if( ob
fd30: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
fd40: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
fd50: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
fd60: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
fd70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fd80: 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20    }.    pResult 
fd90: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
fda0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
fdb0: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
fdc0: 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74  esult, sqlite3_t
fdd0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62  otal_changes(pDb
fde0: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
fdf0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
fe00: 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42  $db trace ?CALLB
fe10: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
fe20: 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
fe30: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
fe40: 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
fe50: 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  for each SQL sta
fe60: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74  tement.  ** that
fe70: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
fe80: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53  he text of the S
fe90: 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  QL is appended t
fea0: 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72  o CALLBACK befor
feb0: 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65  e.  ** it is exe
fec0: 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  cuted..  */.  ca
fed0: 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20  se DB_TRACE: {. 
fee0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
fef0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
ff00: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ff10: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
ff20: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
ff30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ff40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
ff50: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
ff60: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
ff70: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
ff80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ff90: 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  p, pDb->zTrace, 
ffa0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ffb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
ffc0: 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20  r *zTrace;.     
ffd0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
ffe0: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
fff0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
10000 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
10010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10020 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74  zTrace = Tcl_Get
10030 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10040 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
10050 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26      if( zTrace &
10060 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
10070 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
10080 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
10090 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
100a0 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63  emcpy(pDb->zTrac
100b0 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31  e, zTrace, len+1
100c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
100d0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72          pDb->zTr
100e0 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ace = 0;.      }
100f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10100 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20  OMIT_TRACE.     
10110 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
10120 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
10130 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
10140 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10150 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
10160 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c   DbTraceHandler,
10170 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
10180 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
10190 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
101a0 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
101b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
101c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
101d0 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73   /*    $db trans
101e0 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
101f0 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
10200 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
10210 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20    **.  ** Start 
10220 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
10230 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74  n (if we are not
10240 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
10250 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20  midst of a.  ** 
10260 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64  transaction) and
10270 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c   execute the TCL
10280 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20   script SCRIPT. 
10290 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20   After SCRIPT.  
102a0 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69  ** completes, ei
102b0 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20  ther commit the 
102c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72  transaction or r
102d0 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53  oll it back if S
102e0 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77  CRIPT.  ** throw
102f0 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  s an exception. 
10300 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72   Or if no new tr
10310 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61  ansation was sta
10320 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rted, do nothing
10330 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20  ..  ** pass the 
10340 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20  exception on up 
10350 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
10360 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
10370 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62  d was inspired b
10380 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20  y Dave Thomas's 
10390 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20  talk on Ruby at 
103a0 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27  the.  ** 2005 O'
103b0 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72  Reilly Open Sour
103c0 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f  ce Convention (O
103d0 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  SCON)..  */.  ca
103e0 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f  se DB_TRANSACTIO
103f0 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 54  N: {.    int inT
10400 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  rans;.    Tcl_Ob
10410 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
10420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67  const char *zBeg
10430 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20 20  in = "BEGIN";.  
10440 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
10450 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
10460 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10470 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10480 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49  jv, "[TYPE] SCRI
10490 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
104a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
104b0 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
104c0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 53 63  ==3 ){.      pSc
104d0 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a  ript = objv[2];.
104e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
104f0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
10500 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73  char *TTYPE_strs
10510 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22  [] = {.        "
10520 64 65 66 65 72 72 65 64 22 2c 20 20 20 22 65 78  deferred",   "ex
10530 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65  clusive",  "imme
10540 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20  diate", 0.      
10550 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54  };.      enum TT
10560 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20  YPE_enum {.     
10570 20 20 20 54 54 59 50 45 5f 44 45 46 45 52 52 45     TTYPE_DEFERRE
10580 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49  D, TTYPE_EXCLUSI
10590 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49  VE, TTYPE_IMMEDI
105a0 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  ATE.      };.   
105b0 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20     int ttype;.  
105c0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
105d0 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
105e0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59  rp, objv[2], TTY
105f0 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61  PE_strs, "transa
10600 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20  ction type",.   
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74             0, &t
10630 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20  type) ){.       
10640 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10650 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
10660 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54   switch( (enum T
10670 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20  TYPE_enum)ttype 
10680 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
10690 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20  TTYPE_DEFERRED: 
106a0 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20     /* no-op */; 
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
106d0 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53  ase TTYPE_EXCLUS
106e0 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20  IVE:   zBegin = 
106f0 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
10700 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
10710 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d     case TTYPE_IM
10720 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69  MEDIATE:   zBegi
10730 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  n = "BEGIN IMMED
10740 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20  IATE";  break;. 
10750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63       }.      pSc
10760 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  ript = objv[3];.
10770 20 20 20 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e      }.    inTran
10780 73 20 3d 20 21 73 71 6c 69 74 65 33 5f 67 65 74  s = !sqlite3_get
10790 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d  _autocommit(pDb-
107a0 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69  >db);.    if( !i
107b0 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20  nTrans ){.      
107c0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
107d0 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67  ec(pDb->db, zBeg
107e0 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  in, 0, 0, 0);.  
107f0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c    }.    rc = Tcl
10800 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
10810 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
10820 20 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73      if( !inTrans
10830 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
10840 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 20 20  char *zEnd;.    
10850 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 45 52    if( rc==TCL_ER
10860 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ROR ){.        z
10870 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  End = "ROLLBACK"
10880 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
10890 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20  .        zEnd = 
108a0 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 20 20  "COMMIT";.      
108b0 7d 0a 20 20 20 20 20 20 28 76 6f 69 64 29 73 71  }.      (void)sq
108c0 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
108d0 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20  db, zEnd, 0, 0, 
108e0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  0);.    }.    br
108f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
10900 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74   **    $db updat
10910 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  e_hook ?script?.
10920 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c    **    $db roll
10930 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  back_hook ?scrip
10940 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
10950 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a  B_UPDATE_HOOK: .
10960 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41    case DB_ROLLBA
10970 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20  CK_HOOK: {..    
10980 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f  /* set ppHook to
10990 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74   point at pUpdat
109a0 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61  eHook or pRollba
109b0 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e  ckHook, dependin
109c0 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65  g on .    ** whe
109d0 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65  ther [$db update
109e0 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72  _hook] or [$db r
109f0 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61  ollback_hook] wa
10a00 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a  s invoked..    *
10a10 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
10a20 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28  ppHook; .    if(
10a30 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41   choice==DB_UPDA
10a40 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20  TE_HOOK ){.     
10a50 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
10a60 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20  pUpdateHook;.   
10a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
10a80 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f  Hook = &pDb->pRo
10a90 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20  llbackHook;.    
10aa0 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  }..    if( objc!
10ab0 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
10ac0 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  .       Tcl_Wron
10ad0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10ae0 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49   2, objv, "?SCRI
10af0 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65  PT?");.       re
10b00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10b10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70      }.    if( *p
10b20 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54  pHook ){.      T
10b30 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10b40 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29  interp, *ppHook)
10b50 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
10b60 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ==3 ){.        T
10b70 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
10b80 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
10b90 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20    *ppHook = 0;. 
10ba0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10bb0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
10bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
10bd0 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20  *ppHook) );.    
10be0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61    if( Tcl_GetCha
10bf0 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29  rLength(objv[2])
10c00 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  >0 ){.        *p
10c10 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b  pHook = objv[2];
10c20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
10c30 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
10c40 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
10c50 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75  }..    sqlite3_u
10c60 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e  pdate_hook(pDb->
10c70 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74  db, (pDb->pUpdat
10c80 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61  eHook?DbUpdateHa
10c90 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
10ca0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c      sqlite3_roll
10cb0 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  back_hook(pDb->d
10cc0 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  b,(pDb->pRollbac
10cd0 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b  kHook?DbRollback
10ce0 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b  Handler:0),pDb);
10cf0 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ..    break;.  }
10d00 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65  ..  /*    $db ve
10d10 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rsion.  **.  ** 
10d20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69  Return the versi
10d30 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  on string for th
10d40 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  is database..  *
10d50 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53  /.  case DB_VERS
10d60 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ION: {.    Tcl_S
10d70 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
10d80 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
10d90 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54  _libversion(), T
10da0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
10db0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d  break;.  }...  }
10dc0 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53   /* End of the S
10dd0 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20  WITCH statement 
10de0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
10df0 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  }../*.**   sqlit
10e00 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41  e3 DBNAME FILENA
10e10 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20  ME ?MODE? ?-key 
10e20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  KEY?.**.** This 
10e30 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20  is the main Tcl 
10e40 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74  command.  When t
10e50 68 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20  he "sqlite" Tcl 
10e60 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e  command is.** in
10e70 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74  voked, this rout
10e80 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63  ine runs to proc
10e90 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64  ess that command
10ea0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
10eb0 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41  t argument, DBNA
10ec0 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72  ME, is an arbitr
10ed0 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ary name for a n
10ee0 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  ew.** database c
10ef0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73  onnection.  This
10f00 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73   command creates
10f10 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e   a new command n
10f20 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74  amed.** DBNAME t
10f30 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63  hat is used to c
10f40 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e  ontrol that conn
10f50 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74  ection.  The dat
10f60 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
10f70 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77  ion is deleted w
10f80 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63  hen the DBNAME c
10f90 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65  ommand is delete
10fa0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  d..**.** The sec
10fb0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
10fc0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10fd0 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
10fe0 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 73  ontains.** the s
10ff0 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
11000 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 63 63  hat is to be acc
11010 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  essed..**.** For
11020 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
11030 73 2c 20 77 65 20 61 6c 73 6f 20 73 75 70 70 6f  s, we also suppo
11040 72 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  rt the following
11050 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33  :.**.**  sqlite3
11060 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a   -encoding.**.**
11070 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74 68         Return th
11080 65 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  e encoding used 
11090 62 79 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  by LIKE and GLOB
110a0 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 43 68 6f   operators.  Cho
110b0 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 61 72  ices.**       ar
110c0 65 20 55 54 46 2d 38 20 61 6e 64 20 69 73 6f 38  e UTF-8 and iso8
110d0 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  859..**.**  sqli
110e0 74 65 33 20 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a  te3 -version.**.
110f0 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20  **       Return 
11100 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
11110 65 72 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  er of the SQLite
11120 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20   library..**.** 
11130 20 73 71 6c 69 74 65 33 20 2d 74 63 6c 2d 75 73   sqlite3 -tcl-us
11140 65 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20  es-utf.**.**    
11150 20 20 20 52 65 74 75 72 6e 20 22 31 22 20 69 66     Return "1" if
11160 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61   compiled with a
11170 20 54 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e   Tcl uses UTF-8.
11180 20 20 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a    Return "0" if.
11190 2a 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55  **       not.  U
111a0 73 65 64 20 62 79 20 74 65 73 74 73 20 74 6f 20  sed by tests to 
111b0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69  make sure the li
111c0 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
111d0 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72  ed .**       cor
111e0 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
111f0 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69  c int DbMain(voi
11200 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
11210 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
11220 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  bjc,Tcl_Obj *con
11230 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69  st*objv){.  Sqli
11240 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20  teDb *p;.  void 
11250 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  *pKey = 0;.  int
11260 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e   nKey = 0;.  con
11270 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
11280 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a   char *zErrMsg;.
11290 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
112a0 69 6c 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ile;.  Tcl_DStri
112b0 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  ng translatedFil
112c0 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a  ename;.  if( obj
112d0 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==2 ){.    zArg
112e0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
112f0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
11300 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   0);.    if( str
11310 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69  cmp(zArg,"-versi
11320 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  on")==0 ){.     
11330 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11340 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33  t(interp,sqlite3
11350 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20  _version,0);.   
11360 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
11370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11380 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61  strcmp(zArg,"-ha
11390 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a  s-codec")==0 ){.
113a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
113b0 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63  S_CODEC.      Tc
113c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
113d0 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65  nterp,"1",0);.#e
113e0 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  lse.      Tcl_Ap
113f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11400 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66  p,"0",0);.#endif
11410 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11420 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
11430 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
11440 22 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 22 29  "-tcl-uses-utf")
11450 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 54 43  ==0 ){.#ifdef TC
11460 4c 5f 55 54 46 5f 4d 41 58 0a 20 20 20 20 20 20  L_UTF_MAX.      
11470 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11480 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a  (interp,"1",0);.
11490 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f  #else.      Tcl_
114a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
114b0 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64  erp,"0",0);.#end
114c0 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
114d0 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
114e0 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20  }.  if( objc==5 
114f0 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20  || objc==6 ){.  
11500 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
11510 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
11520 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b 0a  jv[objc-2], 0);.
11530 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
11540 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29  Arg,"-key")==0 )
11550 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54  {.      pKey = T
11560 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
11570 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63  romObj(objv[objc
11580 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20  -1], &nKey);.   
11590 20 20 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20 20     objc -= 2;.  
115a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62    }.  }.  if( ob
115b0 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
115c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
115d0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
115e0 20 31 2c 20 6f 62 6a 76 2c 20 0a 23 69 66 64 65   1, objv, .#ifde
115f0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
11600 45 43 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45  EC.      "HANDLE
11610 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79 20   FILENAME ?-key 
11620 43 4f 44 45 43 2d 4b 45 59 3f 22 0a 23 65 6c 73  CODEC-KEY?".#els
11630 65 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20  e.      "HANDLE 
11640 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 22  FILENAME ?MODE?"
11650 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20  .#endif.    );. 
11660 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11670 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d  ROR;.  }.  zErrM
11680 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53  sg = 0;.  p = (S
11690 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c  qliteDb*)Tcl_All
116a0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
116b0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
116c0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
116d0 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f  t(interp, "mallo
116e0 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53  c failed", TCL_S
116f0 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
11700 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11710 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
11720 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
11730 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
11740 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11750 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  v[2], 0);.  zFil
11760 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74  e = Tcl_Translat
11770 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70  eFileName(interp
11780 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c  , zFile, &transl
11790 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  atedFilename);. 
117a0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46   sqlite3_open(zF
117b0 69 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  ile, &p->db);.  
117c0 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
117d0 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
117e0 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  ame);.  if( SQLI
117f0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
11800 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
11810 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
11820 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
11830 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
11840 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
11850 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
11860 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  ->db);.    p->db
11870 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66   = 0;.  }.#ifdef
11880 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
11890 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28  C.  sqlite3_key(
118a0 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  p->db, pKey, nKe
118b0 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  y);.#endif.  if(
118c0 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
118d0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
118e0 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20  nterp, zErrMsg, 
118f0 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
11900 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
11910 72 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  r*)p);.    sqlit
11920 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
11930 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
11940 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d  _ERROR;.  }.  p-
11950 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50  >maxStmt = NUM_P
11960 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
11970 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74   p->interp = int
11980 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63  erp;.  zArg = Tc
11990 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
119a0 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
119b0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
119c0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
119d0 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28  Arg, DbObjCmd, (
119e0 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
119f0 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  eCmd);..  /* If 
11a00 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
11a10 4c 49 54 45 5f 54 45 53 54 20 74 75 72 6e 65 64  LITE_TEST turned
11a20 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67 69 73 74   on, then regist
11a30 65 72 20 74 68 65 20 22 6d 64 35 73 75 6d 22 0a  er the "md5sum".
11a40 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f    ** SQL functio
11a50 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
11a60 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
11a70 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 4d     extern void M
11a80 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69  d5_Register(sqli
11a90 74 65 33 2a 29 3b 0a 23 69 66 64 65 66 20 53 51  te3*);.#ifdef SQ
11aa0 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20  LITE_MEMDEBUG.  
11ab0 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 66 61 69 6c    int mallocfail
11ac0 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c   = sqlite3_iMall
11ad0 6f 63 46 61 69 6c 3b 0a 20 20 20 20 73 71 6c 69  ocFail;.    sqli
11ae0 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20  te3_iMallocFail 
11af0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
11b00 4d 64 35 5f 52 65 67 69 73 74 65 72 28 70 2d 3e  Md5_Register(p->
11b10 64 62 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  db);.#ifdef SQLI
11b20 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20  TE_MEMDEBUG.    
11b30 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
11b40 61 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66 61 69 6c  ail = mallocfail
11b50 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  ;.#endif.  }.#en
11b60 64 69 66 20 20 0a 20 20 72 65 74 75 72 6e 20 54  dif  .  return T
11b70 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
11b80 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20  Provide a dummy 
11b90 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66  Tcl_InitStubs if
11ba0 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
11bb0 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a  is as a static.*
11bc0 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  * library..*/.#i
11bd0 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54  fndef USE_TCL_ST
11be0 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c  UBS.# undef  Tcl
11bf0 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66  _InitStubs.# def
11c00 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ine Tcl_InitStub
11c10 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  s(a,b,c).#endif.
11c20 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
11c30 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41   we have a PACKA
11c40 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f  GE_VERSION macro
11c50 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20   defined.  This 
11c60 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e  will be.** defin
11c70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
11c80 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65   by the TEA make
11c90 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72  file.  But other
11ca0 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f   makefiles.** do
11cb0 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a   not define it..
11cc0 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41  */.#ifndef PACKA
11cd0 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66  GE_VERSION.# def
11ce0 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ine PACKAGE_VERS
11cf0 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ION SQLITE_VERSI
11d00 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ON.#endif../*.**
11d10 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
11d20 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   module..**.** T
11d30 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63  his Tcl module c
11d40 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73  ontains only a s
11d50 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f  ingle new Tcl co
11d60 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c  mmand named "sql
11d70 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20  ite"..** (Hence 
11d80 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65  there is no name
11d90 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73  space.  There is
11da0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69   no point in usi
11db0 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a  ng a namespace.*
11dc0 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69  * if the extensi
11dd0 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73  on only supplies
11de0 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20   one new name!) 
11df0 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
11e00 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64  mmand is.** used
11e10 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53   to open a new S
11e20 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
11e30 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28   See the DbMain(
11e40 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a  ) routine above.
11e50 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
11e60 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
11e70 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  /.EXTERN int Sql
11e80 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
11e90 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
11ea0 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69   Tcl_InitStubs(i
11eb0 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29  nterp, "8.4", 0)
11ec0 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
11ed0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
11ee0 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
11ef0 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
11f00 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
11f10 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
11f20 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
11f30 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
11f40 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
11f50 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
11f60 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f   "sqlite", (Tcl_
11f70 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
11f80 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
11f90 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
11fa0 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41  rp, "sqlite", PA
11fb0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a  CKAGE_VERSION);.
11fc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11fd0 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63  .}.EXTERN int Tc
11fe0 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63  lsqlite3_Init(Tc
11ff0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12000 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
12010 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
12020 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  }.EXTERN int Sql
12030 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63  ite3_SafeInit(Tc
12040 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12050 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
12060 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
12070 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e  clsqlite3_SafeIn
12080 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
12090 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
120a0 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65  CL_OK; }..#ifnde
120b0 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
120c0 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e  X_ONLY.EXTERN in
120d0 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
120e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
120f0 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
12100 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
12110 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
12120 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  sqlite_Init(Tcl_
12130 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
12140 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
12150 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
12160 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
12170 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
12180 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12190 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
121a0 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
121b0 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54  qlite_SafeInit(T
121c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
121d0 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
121e0 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K; }.#endif..#if
121f0 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a  def TCLSH./*****
12200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12240 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
12250 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77  code that follow
12260 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  s is used to bui
12270 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43  ld standalone TC
12280 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a  L interpreters.*
12290 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
122a0 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f  macro TCLSH is o
122b0 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20  ne, then put in 
122c0 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68  code this for th
122d0 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74  e.** "main" rout
122e0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ine that will in
122f0 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64  itialize Tcl and
12300 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d   take input from
12310 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
12320 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48  ut..*/.#if TCLSH
12330 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72 20  ==1.static char 
12340 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
12350 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
12360 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20    "while {![eof 
12370 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20  stdin]} {\n".   
12380 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c   "if {$line!=\"\
12390 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70  "} {\n".      "p
123a0 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
123b0 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20  "> \"\n".    "} 
123c0 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
123d0 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
123e0 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"% \"\n".    "
123f0 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20  }\n".    "flush 
12400 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61  stdout\n".    "a
12410 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73  ppend line [gets
12420 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22   stdin]\n".    "
12430 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65  if {[info comple
12440 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a  te $line]} {\n".
12450 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63        "if {[catc
12460 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c  h {uplevel #0 $l
12470 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c  ine} result]} {\
12480 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
12490 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a   stderr \"Error:
124a0 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20   $result\"\n".  
124b0 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24      "} elseif {$
124c0 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c  result!=\"\"} {\
124d0 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
124e0 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20   $result\n".    
124f0 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73    "}\n".      "s
12500 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
12510 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
12520 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
12530 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c  e \\n\n".    "}\
12540 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e  n".  "}\n".;.#en
12550 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
12560 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
12570 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20 74   two, then get t
12580 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64  he main loop cod
12590 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20  e out of.** the 
125a0 73 65 70 61 72 61 74 65 20 66 69 6c 65 20 22 73  separate file "s
125b0 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e  paceanal_tcl.h".
125c0 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  .*/.#if TCLSH==2
125d0 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
125e0 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63  inloop[] = .#inc
125f0 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c 5f  lude "spaceanal_
12600 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a  tcl.h".;.#endif.
12610 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d  .#define TCLSH_M
12620 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65  AIN main   /* Ne
12630 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74  eded to fake out
12640 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74   mktclapp */.int
12650 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20   TCLSH_MAIN(int 
12660 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
12670 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  v){.  Tcl_Interp
12680 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
12690 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61  FindExecutable(a
126a0 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72  rgv[0]);.  inter
126b0 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e  p = Tcl_CreateIn
126c0 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74 65  terp();.  Sqlite
126d0 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
126e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
126f0 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
12700 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
12710 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  1_Init(Tcl_Inter
12720 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
12730 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f  int Sqlitetest2_
12740 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
12750 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
12760 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e  t Sqlitetest3_In
12770 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
12780 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
12790 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
127a0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
127b0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
127c0 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54  litetest5_Init(T
127d0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
127e0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
127f0 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c  tetest6_Init(Tcl
12800 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
12810 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
12820 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49  test7_Init(Tcl_I
12830 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
12840 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
12850 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st8_Init(Tcl_Int
12860 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
12870 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
12880 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  9_Init(Tcl_Inter
12890 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
128a0 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c  int Md5_Init(Tcl
128b0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
128c0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
128d0 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c  testsse_Init(Tcl
128e0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
128f0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
12900 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54  testasync_Init(T
12910 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
12920 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
12930 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69  tetesttclvar_Ini
12940 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
12950 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
12960 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f  qlitetestschema_
12970 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
12980 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
12990 74 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74  t Sqlitetest_aut
129a0 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  oext_Init(Tcl_In
129b0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
129c0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
129d0 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c  t_hexio_Init(Tcl
129e0 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20 20  _Interp*);..    
129f0 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
12a00 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
12a10 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69  litetest2_Init(i
12a20 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
12a30 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74  tetest3_Init(int
12a40 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
12a50 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72  test4_Init(inter
12a60 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
12a70 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st5_Init(interp)
12a80 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
12a90 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  6_Init(interp);.
12aa0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f      Sqlitetest7_
12ab0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
12ac0 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e    Sqlitetest8_In
12ad0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
12ae0 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
12af0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
12b00 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
12b10 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
12b20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
12b30 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
12b40 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 63 68     Sqlitetestsch
12b50 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ema_Init(interp)
12b60 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
12b70 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e  _autoext_Init(in
12b80 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
12b90 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
12ba0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d 64  (interp);.    Md
12bb0 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
12bc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53  #ifdef SQLITE_SS
12bd0 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  E.    Sqlitetest
12be0 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  sse_Init(interp)
12bf0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  ;.#endif.  }.#en
12c00 64 69 66 0a 20 20 69 66 28 20 61 72 67 63 3e 3d  dif.  if( argc>=
12c10 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b  2 || TCLSH==2 ){
12c20 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12c30 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a  char zArgc[32];.
12c40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12c50 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67  intf(sizeof(zArg
12c60 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c  c), zArgc, "%d",
12c70 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29   argc-(3-TCLSH))
12c80 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
12c90 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20  (interp,"argc", 
12ca0 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41  zArgc, TCL_GLOBA
12cb0 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
12cc0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
12cd0 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
12ce0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
12cf0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
12d00 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
12d10 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
12d20 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  LY);.    for(i=3
12d30 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20  -TCLSH; i<argc; 
12d40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
12d50 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
12d60 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a  argv", argv[i],.
12d70 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c            TCL_GL
12d80 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
12d90 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
12da0 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
12db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12dc0 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f  TCLSH==1 && Tcl_
12dd0 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c  EvalFile(interp,
12de0 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f   argv[1])!=TCL_O
12df0 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  K ){.      const
12e00 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54   char *zInfo = T
12e10 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70  cl_GetVar(interp
12e20 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54  , "errorInfo", T
12e30 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
12e40 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f  .      if( zInfo
12e50 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e  ==0 ) zInfo = in
12e60 74 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20  terp->result;.  
12e70 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
12e80 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a  rr,"%s: %s\n", *
12e90 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20  argv, zInfo);.  
12ea0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12eb0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72    }.  }.  if( ar
12ec0 67 63 3c 3d 31 20 7c 7c 20 54 43 4c 53 48 3d 3d  gc<=1 || TCLSH==
12ed0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f  2 ){.    Tcl_Glo
12ee0 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  balEval(interp, 
12ef0 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a  zMainloop);.  }.
12f00 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
12f10 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f  ndif /* TCLSH */
12f20 0a                                               .