/ Hex Artifact Content
Login

Artifact 82f7be1e8015ef224e2a9410a8f98dd6f61d64e9:


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 30 20 32 30 30 37  e.c,v 1.180 2007
0220: 2f 30 35 2f 30 31 20 31 37 3a 34 39 3a 34 39 20  /05/01 17:49:49 
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 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  ./*.** There is 
0b70: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
0b80: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
0b90: 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20 64  or each SQLite d
0ba0: 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20  atabase.** that 
0bb0: 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  has been opened 
0bc0: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54 43  by the SQLite TC
0bd0: 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  L interface..*/.
0be0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0bf0: 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44 62  qliteDb SqliteDb
0c00: 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ;.struct SqliteD
0c10: 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b {.  sqlite3 *d
0c20: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0c30: 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64   /* The "real" d
0c40: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
0c50: 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52 53 54  e. MUST BE FIRST
0c60: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
0c70: 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20   *interp;       
0c80: 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65   /* The interpre
0c90: 74 65 72 20 75 73 65 64 20 66 6f 72 20 74 68 69  ter used for thi
0ca0: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
0cb0: 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20  char *zBusy;    
0cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0cd0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
0ce0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0cf0: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20  r *zCommit;     
0d00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
0d10: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62  ommit hook callb
0d20: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
0d30: 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20   char *zTrace;  
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0d50: 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63  he trace callbac
0d60: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0d70: 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20  har *zProfile;  
0d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0d90: 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63   profile callbac
0da0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0db0: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20  har *zProgress; 
0dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0dd0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
0de0: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0df0: 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20  char *zAuth;    
0e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0e10: 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  e authorization 
0e20: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0e30: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c   */.  char *zNul
0e40: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0e50: 20 2f 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73   /* Text to subs
0e60: 74 69 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51  titute for an SQ
0e70: 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  L NULL value */.
0e80: 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
0e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0ea0: 4c 69 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63  List of SQL func
0eb0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  tions */.  Tcl_O
0ec0: 62 6a 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b  bj *pUpdateHook;
0ed0: 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
0ee0: 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20  hook script (if 
0ef0: 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  any) */.  Tcl_Ob
0f00: 6a 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  j *pRollbackHook
0f10: 3b 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  ;    /* Rollback
0f20: 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66   hook script (if
0f30: 20 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f   any) */.  SqlCo
0f40: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
0f50: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
0f60: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
0f70: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
0f80: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
0f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
0fa0: 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20  rn code of most 
0fb0: 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  recent sqlite3_e
0fc0: 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f  xec() */.  Tcl_O
0fd0: 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64  bj *pCollateNeed
0fe0: 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  ed;   /* Collati
0ff0: 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70 74  on needed script
1000: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
1010: 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b  dStmt *stmtList;
1020: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70   /* List of prep
1030: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a  ared statements*
1040: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
1050: 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f  tmt *stmtLast; /
1060: 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74  * Last statement
1070: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
1080: 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20    int maxStmt;  
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a0: 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d  The next maximum
10b0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c   number of stmtL
10c0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74  ist */.  int nSt
10d0: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
10e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73   statements in s
1100: 74 6d 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 74  tmtList */.};..t
1110: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e  ypedef struct In
1120: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 49 6e  crblobChannel In
1130: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 3b 0a 73  crblobChannel;.s
1140: 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68  truct IncrblobCh
1150: 61 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65  annel {.  sqlite
1160: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
1170: 20 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20   int iSeek;     
1180: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1190: 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20  ent seek offset 
11a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  */.};../*.** Clo
11b0: 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  se an incrementa
11c0: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
11d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
11e0: 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69 65  crblobClose(Clie
11f0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1200: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
1210: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63 72  *interp){.  Incr
1220: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d  blobChannel *p =
1230: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
1240: 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61  l *)instanceData
1250: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  ;.  sqlite3_blob
1260: 5f 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29  _close(p->pBlob)
1270: 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  ;.  Tcl_Free((ch
1280: 61 72 20 2a 29 70 29 3b 0a 20 20 72 65 74 75 72  ar *)p);.  retur
1290: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
12a0: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
12b0: 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  m an incremental
12c0: 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a   blob channel..*
12d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
12e0: 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43 6c  rblobInput(.  Cl
12f0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1300: 65 44 61 74 61 2c 20 0a 20 20 63 68 61 72 20 2a  eData, .  char *
1310: 62 75 66 2c 20 0a 20 20 69 6e 74 20 62 75 66 53  buf, .  int bufS
1320: 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f  ize,.  int *erro
1330: 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e  rCodePtr.){.  In
1340: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1350: 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e   = (IncrblobChan
1360: 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61  nel *)instanceDa
1370: 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20  ta;.  int nRead 
1380: 3d 20 62 75 66 53 69 7a 65 3b 20 20 20 20 20 20  = bufSize;      
1390: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13a0: 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
13b0: 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20  .  int nBlob;   
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
13e0: 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69   the blob */.  i
13f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
1410: 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  qlite error code
1420: 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73   */..  nBlob = s
1430: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
1440: 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69  s(p->pBlob);.  i
1450: 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52 65  f( (p->iSeek+nRe
1460: 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20  ad)>nBlob ){.   
1470: 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d 70   nRead = nBlob-p
1480: 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20 69  ->iSeek;.  }.  i
1490: 66 28 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a 20  f( nRead<=0 ){. 
14a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14b0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
14c0: 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 42  _blob_read(p->pB
14d0: 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66  lob, (void *)buf
14e0: 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65 65  , nRead, p->iSee
14f0: 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  k);.  if( rc!=SQ
1500: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
1510: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 72  errorCodePtr = r
1520: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  c;.    return -1
1530: 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65  ;.  }..  p->iSee
1540: 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72 65  k += nRead;.  re
1550: 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a 73  turn nRead;.}..s
1560: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
1570: 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65  obOutput(.  Clie
1580: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1590: 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68  ata, .  CONST ch
15a0: 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20  ar *buf, .  int 
15b0: 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a  toWrite,.  int *
15c0: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
15d0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
15e0: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
15f0: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
1600: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57  ceData;.  int nW
1610: 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 20  rite = toWrite; 
1620: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1630: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69   of bytes to wri
1640: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  te */.  int nBlo
1650: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1660: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
1670: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a  ze of the blob *
1680: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72   /* sqlite error
16b0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f   code */..  nBlo
16c0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  b = sqlite3_blob
16d0: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
16e0: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65  ;.  if( (p->iSee
16f0: 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20  k+nWrite)>nBlob 
1700: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
1710: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20  ePtr = EINVAL;. 
1720: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1730: 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d  }.  if( nWrite<=
1740: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1750: 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  0;.  }..  rc = s
1760: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
1770: 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69  e(p->pBlob, (voi
1780: 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74 65 2c  d *)buf, nWrite,
1790: 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66   p->iSeek);.  if
17a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17b0: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
17c0: 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20  ePtr = EIO;.    
17d0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
17e0: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57    p->iSeek += nW
17f0: 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  rite;.  return n
1800: 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Write;.}../*.** 
1810: 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e  Seek an incremen
1820: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
1830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1840: 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20  incrblobSeek(.  
1850: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
1860: 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67  nceData, .  long
1870: 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73   offset,.  int s
1880: 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a  eekMode,.  int *
1890: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
18a0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
18b0: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
18c0: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
18d0: 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63  ceData;..  switc
18e0: 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20  h( seekMode ){. 
18f0: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54     case SEEK_SET
1900: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
1910: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   = offset;.     
1920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1930: 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20   SEEK_CUR:.     
1940: 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66   p->iSeek += off
1950: 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  set;.      break
1960: 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f  ;.    case SEEK_
1970: 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53  END:.      p->iS
1980: 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  eek = sqlite3_bl
1990: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
19a0: 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20  b) + offset;.   
19b0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
19c0: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21  efault: assert(!
19d0: 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b  "Bad seekMode");
19e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
19f0: 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61  ->iSeek;.}...sta
1a00: 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f  tic void incrblo
1a10: 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74  bWatch(ClientDat
1a20: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
1a30: 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a  int mode){ .  /*
1a40: 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61   NO-OP */ .}.sta
1a50: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
1a60: 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61 74  Handle(ClientDat
1a70: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
1a80: 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e 74 44  int dir, ClientD
1a90: 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20 72 65  ata *hPtr){.  re
1aa0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ab0: 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68  }..static Tcl_Ch
1ac0: 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c  annelType Incrbl
1ad0: 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20  obChannelType = 
1ae0: 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20  {.  "incrblob", 
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61         /* typeNa
1b10: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1b30: 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f  /.  TCL_CHANNEL_
1b40: 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20  VERSION_2,      
1b50: 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f         /* versio
1b60: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1b80: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73  /.  incrblobClos
1b90: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1ba0: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50         /* closeP
1bb0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1bd0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75  /.  incrblobInpu
1be0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1bf0: 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50         /* inputP
1c00: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1c20: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70  /.  incrblobOutp
1c30: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
1c40: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74         /* output
1c50: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1c70: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b  /.  incrblobSeek
1c80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c90: 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72         /* seekPr
1ca0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1cc0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74         /* setOpt
1cf0: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1d10: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74         /* getOpt
1d40: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1d60: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63  /.  incrblobWatc
1d70: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
1d80: 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50         /* watchP
1d90: 72 6f 63 20 28 74 68 69 73 20 69 73 20 61 20 6e  roc (this is a n
1da0: 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a  o-op)          *
1db0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64  /.  incrblobHand
1dc0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1dd0: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e         /* getHan
1de0: 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20  dleProc (always 
1df0: 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a  returns error) *
1e00: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32         /* close2
1e30: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1e50: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d         /* blockM
1e80: 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20 20 20  odeProc         
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1ea0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50         /* flushP
1ed0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1ef0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65         /* handle
1f20: 72 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  rProc           
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f40: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65         /* wideSe
1f70: 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  ekProc          
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f90: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 20 2f 2a 20 74 68 72 65 61 64         /* thread
1fc0: 41 63 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20  ActionProc      
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1fe0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  /.};../*.** Crea
1ff0: 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f  te a new incrblo
2000: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
2010: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 49  atic int createI
2020: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a  ncrblobChannel(.
2030: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2040: 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74 65 44  terp, .  SqliteD
2050: 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74  b *pDb, .  const
2060: 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f   char *zDb,.  co
2070: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
2080: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
2090: 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c  *zColumn, .  sql
20a0: 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 0a 29  ite_int64 iRow.)
20b0: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
20c0: 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  nel *p;.  sqlite
20d0: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
20e0: 20 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f 43   int rc;.  Tcl_C
20f0: 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a  hannel channel;.
2100: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43    int flags = TC
2110: 4c 5f 52 45 41 44 41 42 4c 45 7c 54 43 4c 5f 57  L_READABLE|TCL_W
2120: 52 49 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20 54  RITABLE;..  /* T
2130: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2140: 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65  used to name the
2150: 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72   channels: "incr
2160: 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74  blob_[incr count
2170: 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69  ]" */.  static i
2180: 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  nt count = 0;.  
2190: 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34  char zChannel[64
21a0: 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ];..  rc = sqlit
21b0: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 44 62  e3_blob_open(pDb
21c0: 2d 3e 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c  ->db, zDb, zTabl
21d0: 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77  e, zColumn, iRow
21e0: 2c 20 31 2c 20 26 70 42 6c 6f 62 29 3b 0a 20 20  , 1, &pBlob);.  
21f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2200: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
2210: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
2220: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
2230: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
2240: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
2250: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2260: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  ROR;.  }..  p = 
2270: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
2280: 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a   *)Tcl_Alloc(siz
2290: 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e  eof(IncrblobChan
22a0: 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65 65  nel));.  p->iSee
22b0: 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f  k = 0;.  p->pBlo
22c0: 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73 70  b = pBlob;..  sp
22d0: 72 69 6e 74 66 28 7a 43 68 61 6e 6e 65 6c 2c 20  rintf(zChannel, 
22e0: 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b  "incrblob_%d", +
22f0: 2b 63 6f 75 6e 74 29 3b 0a 20 20 63 68 61 6e 6e  +count);.  chann
2300: 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43  el = Tcl_CreateC
2310: 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f 62  hannel(&Incrblob
2320: 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43 68  ChannelType, zCh
2330: 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73 29  annel, p, flags)
2340: 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65 72  ;.  Tcl_Register
2350: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
2360: 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 54 63 6c  channel);..  Tcl
2370: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2380: 70 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47  p, (char *)Tcl_G
2390: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
23a0: 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41  annel), TCL_VOLA
23b0: 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TILE);.  return 
23c0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
23d0: 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72   Look at the scr
23e0: 69 70 74 20 70 72 65 66 69 78 20 69 6e 20 70 43  ipt prefix in pC
23f0: 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20  md.  We will be 
2400: 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 73  executing this s
2410: 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66  cript.** after f
2420: 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f  irst appending o
2430: 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ne or more argum
2440: 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74  ents.  This rout
2450: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20  ine analyzes.** 
2460: 74 68 65 20 73 63 72 69 70 74 20 74 6f 20 73 65  the script to se
2470: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
2480: 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f  to use Tcl_EvalO
2490: 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72  bjv() on the scr
24a0: 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ipt.** rather th
24b0: 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  an the more gene
24c0: 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29  ral Tcl_EvalEx()
24d0: 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  .  Tcl_EvalObjv(
24e0: 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73  ) is much.** fas
24f0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70  ter..**.** Scrip
2500: 74 73 20 74 68 61 74 20 61 72 65 20 73 61 66 65  ts that are safe
2510: 20 74 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c   to use with Tcl
2520: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73  _EvalObjv() cons
2530: 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d  ists of a.** com
2540: 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77  mand name follow
2550: 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f  ed by zero or mo
2560: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74  re arguments wit
2570: 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a  h no [...] or $.
2580: 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b  ** or {...} or ;
2590: 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77   to be seen anyw
25a0: 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c  here.  Most call
25b0: 62 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e  back scripts con
25c0: 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20  sist.** of just 
25d0: 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75  a single procedu
25e0: 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79  re name and they
25f0: 20 6d 65 65 74 20 74 68 69 73 20 72 65 71 75 69   meet this requi
2600: 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  rement..*/.stati
2610: 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45  c int safeToUseE
2620: 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65  valObjv(Tcl_Inte
2630: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f  rp *interp, Tcl_
2640: 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a  Obj *pCmd){.  /*
2650: 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f   We could try to
2660: 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   do something wi
2670: 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20  th Tcl_Parse(). 
2680: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73   But we will ins
2690: 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64  tead.  ** just d
26a0: 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 66  o a search for f
26b0: 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61 63 74  orbidden charact
26c0: 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20  ers.  If any of 
26d0: 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20  the forbidden.  
26e0: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 70  ** characters ap
26f0: 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65  pear in pCmd, we
2700: 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65   will report the
2710: 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66   string as unsaf
2720: 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  e..  */.  const 
2730: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
2740: 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53  ;.  z = Tcl_GetS
2750: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d  tringFromObj(pCm
2760: 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28  d, &n);.  while(
2770: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
2780: 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a  int c = *(z++);.
2790: 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c      if( c=='$' |
27a0: 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27  | c=='[' || c=='
27b0: 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ;' ) return 0;. 
27c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
27d0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20  ../*.** Find an 
27e0: 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72  SqlFunc structur
27f0: 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  e with the given
2800: 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74   name.  Or creat
2810: 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69  e a new.** one i
2820: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e  f an existing on
2830: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
2840: 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  d.  Return a poi
2850: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  nter to the.** s
2860: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2870: 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e  tic SqlFunc *fin
2880: 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44  dSqlFunc(SqliteD
2890: 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68  b *pDb, const ch
28a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71  ar *zName){.  Sq
28b0: 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b  lFunc *p, *pNew;
28c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77  .  int i;.  pNew
28d0: 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c   = (SqlFunc*)Tcl
28e0: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
28f0: 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e 28 7a  pNew) + strlen(z
2900: 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70  Name) + 1 );.  p
2910: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  New->zName = (ch
2920: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
2930: 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69  for(i=0; zName[i
2940: 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a  ]; i++){ pNew->z
2950: 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65  Name[i] = tolowe
2960: 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20  r(zName[i]); }. 
2970: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20   pNew->zName[i] 
2980: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62  = 0;.  for(p=pDb
2990: 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d  ->pFunc; p; p=p-
29a0: 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66  >pNext){ .    if
29b0: 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d  ( strcmp(p->zNam
29c0: 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d  e, pNew->zName)=
29d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
29e0: 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77  Free((char*)pNew
29f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a00: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  p;.    }.  }.  p
2a10: 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44  New->interp = pD
2a20: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65  b->interp;.  pNe
2a30: 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a  w->pScript = 0;.
2a40: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
2a50: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44  pDb->pFunc;.  pD
2a60: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b  b->pFunc = pNew;
2a70: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
2a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a  }../*.** Finaliz
2a90: 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73  e and free a lis
2aa0: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
2ab0: 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  atements.*/.stat
2ac0: 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d  ic void flushStm
2ad0: 74 43 61 63 68 65 28 20 53 71 6c 69 74 65 44 62  tCache( SqliteDb
2ae0: 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72   *pDb ){.  SqlPr
2af0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
2b00: 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20  Stmt;..  while( 
2b10: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29   pDb->stmtList )
2b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
2b30: 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d  nalize( pDb->stm
2b40: 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  tList->pStmt );.
2b50: 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70      pPreStmt = p
2b60: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20  Db->stmtList;.  
2b70: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
2b80: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d  = pDb->stmtList-
2b90: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f  >pNext;.    Tcl_
2ba0: 46 72 65 65 28 20 28 63 68 61 72 2a 29 70 50 72  Free( (char*)pPr
2bb0: 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70  eStmt );.  }.  p
2bc0: 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  Db->nStmt = 0;. 
2bd0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
2be0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c   0;.}../*.** TCL
2bf0: 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63   calls this proc
2c00: 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71  edure when an sq
2c10: 6c 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63  lite3 database c
2c20: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c  ommand is.** del
2c30: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
2c40: 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64  void DbDeleteCmd
2c50: 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71  (void *db){.  Sq
2c60: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
2c70: 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66  qliteDb*)db;.  f
2c80: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44  lushStmtCache(pD
2c90: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  b);.  sqlite3_cl
2ca0: 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  ose(pDb->db);.  
2cb0: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e  while( pDb->pFun
2cc0: 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63  c ){.    SqlFunc
2cd0: 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70   *pFunc = pDb->p
2ce0: 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70  Func;.    pDb->p
2cf0: 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e  Func = pFunc->pN
2d00: 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  ext;.    Tcl_Dec
2d10: 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d  rRefCount(pFunc-
2d20: 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54  >pScript);.    T
2d30: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
2d40: 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69  Func);.  }.  whi
2d50: 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  le( pDb->pCollat
2d60: 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c  e ){.    SqlColl
2d70: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20  ate *pCollate = 
2d80: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20  pDb->pCollate;. 
2d90: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
2da0: 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65   = pCollate->pNe
2db0: 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  xt;.    Tcl_Free
2dc0: 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65  ((char*)pCollate
2dd0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
2de0: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54  ->zBusy ){.    T
2df0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
2e00: 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  sy);.  }.  if( p
2e10: 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
2e20: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
2e30: 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69  zTrace);.  }.  i
2e40: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
2e50: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
2e60: 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b  (pDb->zProfile);
2e70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
2e80: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c  zAuth ){.    Tcl
2e90: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
2ea0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
2eb0: 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54  ->zNull ){.    T
2ec0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75  cl_Free(pDb->zNu
2ed0: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ll);.  }.  if( p
2ee0: 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20  Db->pUpdateHook 
2ef0: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
2f00: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70  efCount(pDb->pUp
2f10: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20  dateHook);.  }. 
2f20: 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62   if( pDb->pRollb
2f30: 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  ackHook ){.    T
2f40: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2f50: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
2f60: 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ok);.  }.  if( p
2f70: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
2f80: 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ed ){.    Tcl_De
2f90: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
2fa0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
2fb0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28  .  }.  Tcl_Free(
2fc0: 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a  (char*)pDb);.}..
2fd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2fe0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2ff0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
3000: 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c  e is locked whil
3010: 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65  e trying.** to e
3020: 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73  xecute SQL..*/.s
3030: 74 61 74 69 63 20 69 6e 74 20 44 62 42 75 73 79  tatic int DbBusy
3040: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
3050: 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20  , int nTries){. 
3060: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
3070: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
3080: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
3090: 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 70   zVal[30];..  sp
30a0: 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64 22  rintf(zVal, "%d"
30b0: 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72 63 20  , nTries);.  rc 
30c0: 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28 70 44  = Tcl_VarEval(pD
30d0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
30e0: 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c  zBusy, " ", zVal
30f0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 69  , (char*)0);.  i
3100: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc!=TCL_OK ||
3110: 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72   atoi(Tcl_GetStr
3120: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
3130: 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72  nterp)) ){.    r
3140: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
3150: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
3160: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3170: 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65  s invoked as the
3180: 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62   'progress callb
3190: 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74  ack' for the dat
31a0: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
31b0: 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48   int DbProgressH
31c0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
31d0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
31e0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
31f0: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
3200: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72  assert( pDb->zPr
3210: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d  ogress );.  rc =
3220: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
3230: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
3240: 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63  gress);.  if( rc
3250: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
3260: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
3270: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
3280: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
3290: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
32a0: 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
32b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
32c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
32d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
32e0: 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63   the SQLite trac
32f0: 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76  e handler whenev
3300: 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63  er a new.** bloc
3310: 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63  k of SQL is exec
3320: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
3330: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54  cript in pDb->zT
3340: 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64  race is executed
3350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3360: 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28   DbTraceHandler(
3370: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
3380: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53  char *zSql){.  S
3390: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
33a0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
33b0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
33c0: 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ..  Tcl_DStringI
33d0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
33e0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
33f0: 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  str, pDb->zTrace
3400: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
3410: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
3420: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
3430: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
3440: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
3450: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
3460: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
3470: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
3480: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
3490: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
34a0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
34b0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
34c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
34d0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
34e0: 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20   SQLite profile 
34f0: 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20  handler after a 
3500: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c  statement.** SQL
3510: 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20   has executed.  
3520: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
3530: 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  n pDb->zProfile 
3540: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  is evaluated..*/
3550: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
3560: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f  rofileHandler(vo
3570: 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68  id *cd, const ch
3580: 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65  ar *zSql, sqlite
3590: 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53  _uint64 tm){.  S
35a0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
35b0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
35c0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
35d0: 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d  .  char zTm[100]
35e0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
35f0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d  rintf(sizeof(zTm
3600: 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22  )-1, zTm, "%lld"
3610: 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , tm);.  Tcl_DSt
3620: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
3630: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
3640: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
3650: 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  Profile, -1);.  
3660: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
3670: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
3680: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Sql);.  Tcl_DStr
3690: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
36a0: 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54  (&str, zTm);.  T
36b0: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
36c0: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
36d0: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
36e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
36f0: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73  &str);.  Tcl_Res
3700: 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  etResult(pDb->in
3710: 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  terp);.}.#endif.
3720: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3730: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3740: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
3750: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20   is committed.  
3760: 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70  The.** TCL scrip
3770: 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  t in pDb->zCommi
3780: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
3790: 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f  If it returns no
37a0: 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20  n-zero or.** if 
37b0: 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  it throws an exc
37c0: 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e  eption, the tran
37d0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
37e0: 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a  d back instead.*
37f0: 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * of being commi
3800: 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tted..*/.static 
3810: 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  int DbCommitHand
3820: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
3830: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
3840: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
3850: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
3860: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
3870: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
3880: 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
3890: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
38a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
38b0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
38c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
38d0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
38e0: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
38f0: 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  d DbRollbackHand
3900: 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74  ler(void *client
3910: 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44  Data){.  SqliteD
3920: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
3930: 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  Db*)clientData;.
3940: 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52    assert(pDb->pR
3950: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20  ollbackHook);.  
3960: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
3970: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
3980: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c  nterp, pDb->pRol
3990: 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b  lbackHook, 0) ){
39a0: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
39b0: 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e  undError(pDb->in
39c0: 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  terp);.  }.}..st
39d0: 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64 61  atic void DbUpda
39e0: 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69  teHandler(.  voi
39f0: 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c  d *p, .  int op,
3a00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3a10: 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  Db, .  const cha
3a20: 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69  r *zTbl, .  sqli
3a30: 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a 29  te_int64 rowid.)
3a40: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3a50: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
3a60: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  p;.  Tcl_Obj *pC
3a70: 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  md;..  assert( p
3a80: 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20  Db->pUpdateHook 
3a90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  );.  assert( op=
3aa0: 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c  =SQLITE_INSERT |
3ab0: 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44  | op==SQLITE_UPD
3ac0: 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54  ATE || op==SQLIT
3ad0: 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70  E_DELETE );..  p
3ae0: 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Cmd = Tcl_Duplic
3af0: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64  ateObj(pDb->pUpd
3b00: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f  ateHook);.  Tcl_
3b10: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
3b20: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
3b30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
3b40: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
3b50: 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20  tringObj(.    ( 
3b60: 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45  (op==SQLITE_INSE
3b70: 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70  RT)?"INSERT":(op
3b80: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 29  ==SQLITE_UPDATE)
3b90: 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c 45 54  ?"UPDATE":"DELET
3ba0: 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  E"), -1));.  Tcl
3bb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3bc0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
3bd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3be0: 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  zDb, -1));.  Tcl
3bf0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3c00: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
3c10: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3c20: 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zTbl, -1));.  Tc
3c30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3c40: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
3c50: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
3c60: 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c  j(rowid));.  Tcl
3c70: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
3c80: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
3c90: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
3ca0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  }..static void t
3cb0: 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28  clCollateNeeded(
3cc0: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
3cd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
3ce0: 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74  int enc,.  const
3cf0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
3d00: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3d10: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43  = (SqliteDb *)pC
3d20: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
3d30: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70  Script = Tcl_Dup
3d40: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
3d50: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
3d60: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
3d70: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54  nt(pScript);.  T
3d80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3d90: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69  Element(0, pScri
3da0: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
3db0: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
3dc0: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
3dd0: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
3de0: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63  Script, 0);.  Tc
3df0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3e00: 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Script);.}../*.*
3e10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3e20: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
3e30: 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c  uate an SQL coll
3e40: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
3e50: 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73  mplemented.** us
3e60: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a  ing TCL script..
3e70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
3e80: 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76  lSqlCollate(.  v
3e90: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
3ea0: 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nA,.  const voi
3eb0: 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
3ec0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
3ed0: 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  B.){.  SqlCollat
3ee0: 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  e *p = (SqlColla
3ef0: 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  te *)pCtx;.  Tcl
3f00: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70  _Obj *pCmd;..  p
3f10: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
3f20: 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70  ingObj(p->zScrip
3f30: 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  t, -1);.  Tcl_In
3f40: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
3f50: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
3f60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
3f70: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
3f80: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
3f90: 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c  A, nA));.  Tcl_L
3fa0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3fb0: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
3fc0: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
3fd0: 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a  ngObj(zB, nB));.
3fe0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
3ff0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
4000: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
4010: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
4020: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72  Count(pCmd);.  r
4030: 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f  eturn (atoi(Tcl_
4040: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
4050: 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a  p->interp)));.}.
4060: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4070: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
4080: 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c   evaluate an SQL
4090: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
40a0: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54  ented.** using T
40b0: 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  CL script..*/.st
40c0: 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71 6c  atic void tclSql
40d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
40e0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
40f0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
4100: 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20  _value**argv){. 
4110: 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71   SqlFunc *p = sq
4120: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
4130: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f  context);.  Tcl_
4140: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74  Obj *pCmd;.  int
4150: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
4160: 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a   if( argc==0 ){.
4170: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
4180: 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  are no arguments
4190: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
41a0: 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  , call Tcl_EvalO
41b0: 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20 20  bjEx on the.    
41c0: 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74  ** script object
41d0: 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
41e0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c 20   allows the TCL 
41f0: 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e 65  compiler to gene
4200: 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  rate.    ** byte
4210: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  code for the com
4220: 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72 73  mand on the firs
4230: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
4240: 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a   thus make.    *
4250: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  * subsequent inv
4260: 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66 61  ocations much fa
4270: 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d  ster. */.    pCm
4280: 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a  d = p->pScript;.
4290: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
42a0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
42b0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
42c0: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
42d0: 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  md, 0);.    Tcl_
42e0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
42f0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
4300: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
4310: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
4320: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65  e function, make
4330: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20   a shallow copy 
4340: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63  of the.    ** sc
4350: 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70  ript object, lap
4360: 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e  pend the argumen
4370: 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  ts, then evaluat
4380: 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  e the copy..    
4390: 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73 68  **.    ** By "sh
43a0: 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65 20  allow" copy, we 
43b0: 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20  mean a only the 
43c0: 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f  outer list Tcl_O
43d0: 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65 64  bj is duplicated
43e0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65 77  ..    ** The new
43f0: 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e   Tcl_Obj contain
4400: 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  s pointers to th
4410: 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  e original list 
4420: 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a  elements. .    *
4430: 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e  * That way, when
4440: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
4450: 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d  is run and shimm
4460: 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65 6c  ers the first el
4470: 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20  ement.    ** of 
4480: 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43  the list to tclC
4490: 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74  mdNameType, that
44a0: 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65   alternate repre
44b0: 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20  sentation will. 
44c0: 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76     ** be preserv
44d0: 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  ed and reused on
44e0: 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61   the next invoca
44f0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
4500: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b   Tcl_Obj **aArg;
4510: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
4520: 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f     if( Tcl_ListO
4530: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d  bjGetElements(p-
4540: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72  >interp, p->pScr
4550: 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72  ipt, &nArg, &aAr
4560: 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  g) ){.      sqli
4570: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
4580: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
4590: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
45a0: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
45b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
45c0: 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43 6d    }     .    pCm
45d0: 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  d = Tcl_NewListO
45e0: 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a  bj(nArg, aArg);.
45f0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
4600: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
4610: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
4620: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
4630: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20  ite3_value *pIn 
4640: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20  = argv[i];.     
4650: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
4660: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
4670: 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74     /* Set pVal t
4680: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27  o contain the i'
4690: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69  th column of thi
46a0: 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  s row. */.      
46b0: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
46c0: 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20  value_type(pIn) 
46d0: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
46e0: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
46f0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
4700: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
4710: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
4720: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
4730: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
4740: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  Obj(sqlite3_valu
4750: 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74  e_blob(pIn), byt
4760: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
4770: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4780: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4790: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
47a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
47b0: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
47c0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49  3_value_int64(pI
47d0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n);.          if
47e0: 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37  ( v>=-2147483647
47f0: 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34   && v<=214748364
4800: 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  7 ){.           
4810: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49   pVal = Tcl_NewI
4820: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
4830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4840: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
4850: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
4860: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  v);.          }.
4870: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4880: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4890: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
48a0: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  LOAT: {.        
48b0: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c    double r = sql
48c0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
48d0: 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  e(pIn);.        
48e0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
48f0: 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20  DoubleObj(r);.  
4900: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4920: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
4930: 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  L: {.          p
4940: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
4950: 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a 20  ingObj("", 0);. 
4960: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4980: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4990: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
49a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
49b0: 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20  _bytes(pIn);.   
49c0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
49d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
49e0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
49f0: 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c 20  alue_text(pIn), 
4a00: 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20  bytes);.        
4a10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4a20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
4a30: 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62   rc = Tcl_ListOb
4a40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
4a50: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
4a60: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
4a70: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54   rc ){.        T
4a80: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4a90: 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 73  pCmd);.        s
4aa0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
4ab0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c  ror(context, Tcl
4ac0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
4ad0: 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29  (p->interp), -1)
4ae0: 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ; .        retur
4af0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
4b00: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73 65  .    if( !p->use
4b10: 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20  EvalObjv ){.    
4b20: 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a    /* Tcl_EvalObj
4b30: 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61  Ex() will automa
4b40: 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c  tically call Tcl
4b50: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20 70  _EvalObjv() if p
4b60: 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  Cmd.      ** is 
4b70: 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20 61  a list without a
4b80: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
4b90: 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76  tation.  To prev
4ba0: 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  ent this from.  
4bb0: 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67      ** happening
4bc0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d 64  , make sure pCmd
4bd0: 20 68 61 73 20 61 20 76 61 6c 69 64 20 73 74 72   has a valid str
4be0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
4bf0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f  on */.      Tcl_
4c00: 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29 3b  GetString(pCmd);
4c10: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
4c20: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
4c30: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
4c40: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
4c50: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
4c60: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d  Count(pCmd);.  }
4c70: 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63  ..  if( rc && rc
4c80: 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a  !=TCL_RETURN ){.
4c90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4ca0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
4cb0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
4cc0: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
4cd0: 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b  , -1); .  }else{
4ce0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  .    Tcl_Obj *pV
4cf0: 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  ar = Tcl_GetObjR
4d00: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
4d10: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
4d20: 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 63   u8 *data;.    c
4d30: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61  har *zType = pVa
4d40: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
4d50: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
4d60: 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20   : "";.    char 
4d70: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
4d80: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
4d90: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
4da0: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
4db0: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29  pVar->bytes==0 )
4dc0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  {.      /* Only 
4dd0: 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79  return a BLOB ty
4de0: 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61  pe if the Tcl va
4df0: 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65  riable is a byte
4e00: 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20  array and.      
4e10: 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  ** has no string
4e20: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
4e30: 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20 3d   */.      data =
4e40: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
4e50: 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  yFromObj(pVar, &
4e60: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
4e70: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
4e80: 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20  ntext, data, n, 
4e90: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
4ea0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
4eb0: 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63   (c=='b' && strc
4ec0: 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61  mp(zType,"boolea
4ed0: 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20  n")==0) ||.     
4ee0: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
4ef0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
4f00: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
4f10: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
4f20: 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b  bj(0, pVar, &n);
4f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
4f40: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
4f50: 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, n);.    }else
4f60: 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
4f70: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75  trcmp(zType,"dou
4f80: 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
4f90: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
4fa0: 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
4fb0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
4fc0: 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &r);.      sqlit
4fd0: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
4fe0: 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20  (context, r);.  
4ff0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
5000: 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  w' && strcmp(zTy
5010: 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30  pe,"wideInt")==0
5020: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69   ){.      Tcl_Wi
5030: 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54  deInt v;.      T
5040: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
5050: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76  mObj(0, pVar, &v
5060: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5070: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
5080: 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d  ntext, v);.    }
5090: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74 61  else{.      data
50a0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
50b0: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
50c0: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
50d0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
50e0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
50f0: 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 64  ntext, (char *)d
5100: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54  ata, n, SQLITE_T
5110: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
5120: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
5130: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5140: 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  ORIZATION./*.** 
5150: 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68  This is the auth
5160: 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74  entication funct
5170: 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73  ion.  It appends
5180: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
5190: 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65  ion.** type code
51a0: 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67   and the two arg
51b0: 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d  uments to zCmd[]
51c0: 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68   then invokes th
51d0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74  e result.** on t
51e0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  he interpreter. 
51f0: 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78   The reply is ex
5200: 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d  amined to determ
5210: 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75  ine if the.** au
5220: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69  thentication fai
5230: 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a  ls or succeeds..
5240: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
5250: 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  th_callback(.  v
5260: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
5270: 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63   code,.  const c
5280: 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f  har *zArg1,.  co
5290: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c  nst char *zArg2,
52a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
52b0: 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg3,.  const ch
52c0: 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63  ar *zArg4.){.  c
52d0: 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63  har *zCode;.  Tc
52e0: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
52f0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
5300: 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20   char *zReply;. 
5310: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
5320: 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67   (SqliteDb*)pArg
5330: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64  ;..  switch( cod
5340: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
5350: 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20  LITE_COPY       
5360: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
5370: 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72  SQLITE_COPY"; br
5380: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5390: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
53a0: 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  X      : zCode="
53b0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
53c0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
53d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
53e0: 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a  ATE_TABLE      :
53f0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5400: 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72  REATE_TABLE"; br
5410: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5420: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
5430: 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22  _INDEX : zCode="
5440: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5450: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
5460: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5470: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
5480: 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  BLE : zCode="SQL
5490: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
54a0: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
54b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
54c0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
54d0: 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  ER: zCode="SQLIT
54e0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52  E_CREATE_TEMP_TR
54f0: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
5500: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5510: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20  REATE_TEMP_VIEW 
5520: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5530: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5540: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
5550: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5560: 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a  E_TRIGGER    : z
5570: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
5580: 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72  ATE_TRIGGER"; br
5590: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
55a0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
55b0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
55c0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
55d0: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
55e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45  case SQLITE_DELE
55f0: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
5600: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45  zCode="SQLITE_DE
5610: 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LETE"; break;.  
5620: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
5630: 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20  OP_INDEX        
5640: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5650: 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  DROP_INDEX"; bre
5660: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5670: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20  ITE_DROP_TABLE  
5680: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5690: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
56a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
56b0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
56c0: 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43  EMP_INDEX   : zC
56d0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
56e0: 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72  _TEMP_INDEX"; br
56f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5700: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
5710: 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22  ABLE   : zCode="
5720: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
5730: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
5740: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5750: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
5760: 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  R : zCode="SQLIT
5770: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
5780: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
5790: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
57a0: 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a  P_TEMP_VIEW    :
57b0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
57c0: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ROP_TEMP_VIEW"; 
57d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
57e0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
57f0: 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  GER      : zCode
5800: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  ="SQLITE_DROP_TR
5810: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
5820: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
5830: 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20 20  ROP_VIEW        
5840: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5850: 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65  _DROP_VIEW"; bre
5860: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5870: 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20  ITE_INSERT      
5880: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5890: 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62  QLITE_INSERT"; b
58a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
58b0: 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20  QLITE_PRAGMA    
58c0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
58d0: 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b  "SQLITE_PRAGMA";
58e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
58f0: 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20   SQLITE_READ    
5900: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
5910: 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b  e="SQLITE_READ";
5920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5930: 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20   SQLITE_SELECT  
5940: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
5950: 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e="SQLITE_SELECT
5960: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5970: 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  se SQLITE_TRANSA
5980: 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43  CTION       : zC
5990: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e  ode="SQLITE_TRAN
59a0: 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b  SACTION"; break;
59b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
59c0: 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 20 20  _UPDATE         
59d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
59e0: 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61  TE_UPDATE"; brea
59f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5a00: 54 45 5f 41 54 54 41 43 48 20 20 20 20 20 20 20  TE_ATTACH       
5a10: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5a20: 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72  LITE_ATTACH"; br
5a30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5a40: 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20 20 20  LITE_DETACH     
5a50: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
5a60: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20  SQLITE_DETACH"; 
5a70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5a80: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
5a90: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
5aa0: 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  ="SQLITE_ALTER_T
5ab0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
5ac0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
5ad0: 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
5ae0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5af0: 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  REINDEX"; break;
5b00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5b10: 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20  _ANALYZE        
5b20: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5b30: 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65  TE_ANALYZE"; bre
5b40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5b50: 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c  ITE_CREATE_VTABL
5b60: 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  E     : zCode="S
5b70: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41  QLITE_CREATE_VTA
5b80: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
5b90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
5ba0: 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20 20 3a  P_VTABLE       :
5bb0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
5bc0: 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62 72 65  ROP_VTABLE"; bre
5bd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5be0: 49 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20  ITE_FUNCTION    
5bf0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5c00: 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b  QLITE_FUNCTION";
5c10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
5c20: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
5c30: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
5c40: 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b  e="????"; break;
5c50: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69  .  }.  Tcl_DStri
5c60: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
5c70: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
5c80: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75  d(&str, pDb->zAu
5c90: 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  th, -1);.  Tcl_D
5ca0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
5cb0: 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29  ent(&str, zCode)
5cc0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
5cd0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
5ce0: 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31  r, zArg1 ? zArg1
5cf0: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
5d00: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
5d10: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f  nt(&str, zArg2 ?
5d20: 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20   zArg2 : "");.  
5d30: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
5d40: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
5d50: 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22  Arg3 ? zArg3 : "
5d60: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
5d70: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
5d80: 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72  str, zArg4 ? zAr
5d90: 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d  g4 : "");.  rc =
5da0: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
5db0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
5dc0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
5dd0: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
5de0: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
5df0: 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65   zReply = Tcl_Ge
5e00: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
5e10: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  b->interp);.  if
5e20: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
5e30: 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20  "SQLITE_OK")==0 
5e40: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
5e50: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
5e60: 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79  f( strcmp(zReply
5e70: 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d  ,"SQLITE_DENY")=
5e80: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
5e90: 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65  QLITE_DENY;.  }e
5ea0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
5eb0: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47  Reply,"SQLITE_IG
5ec0: 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20  NORE")==0 ){.   
5ed0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e   rc = SQLITE_IGN
5ee0: 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ORE;.  }else{.  
5ef0: 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a    rc = 999;.  }.
5f00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
5f10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5f20: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5f30: 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65  ON */../*.** zTe
5f40: 78 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  xt is a pointer 
5f50: 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
5f60: 20 76 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f   via an sqlite3_
5f70: 72 65 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a  result_text().**
5f80: 20 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65   or similar inte
5f90: 72 66 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74  rface. This rout
5fa0: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 54 63  ine returns a Tc
5fb0: 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c  l string object,
5fc0: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63   .** reference c
5fd0: 6f 75 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63  ount set to 0, c
5fe0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
5ff0: 78 74 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61  xt. If a transla
6000: 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20  tion.** between 
6010: 69 73 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d  iso8859 and UTF-
6020: 38 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69  8 is required, i
6030: 74 20 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a  t is preformed..
6040: 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  */.static Tcl_Ob
6050: 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63  j *dbTextToObj(c
6060: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
6070: 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
6080: 61 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54  al;.#ifdef UTF_T
6090: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
60a0: 44 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  D.  Tcl_DString 
60b0: 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72  dCol;.  Tcl_DStr
60c0: 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a  ingInit(&dCol);.
60d0: 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f    Tcl_ExternalTo
60e0: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c  UtfDString(NULL,
60f0: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f   zText, -1, &dCo
6100: 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c  l);.  pVal = Tcl
6110: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
6120: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
6130: 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63  dCol), -1);.  Tc
6140: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
6150: 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56  Col);.#else.  pV
6160: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
6170: 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29  ngObj(zText, -1)
6180: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
6190: 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pVal;.}../*.**
61a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
61b0: 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65  ads a line of te
61c0: 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c  xt from FILE in,
61d0: 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74   stores.** the t
61e0: 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ext in memory ob
61f0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
6200: 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73  oc() and returns
6210: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6220: 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c   the text.  NULL
6230: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20   is returned at 
6240: 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20  end of file, or 
6250: 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66  if malloc().** f
6260: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails..**.** The 
6270: 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b  interface is lik
6280: 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74  e "readline" but
6290: 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   no command-line
62a0: 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64   editing.** is d
62b0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65  one..**.** copie
62c0: 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66  d from shell.c f
62d0: 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f  rom '.import' co
62e0: 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20  mmand.*/.static 
62f0: 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c  char *local_getl
6300: 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70  ine(char *zPromp
6310: 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  t, FILE *in){.  
6320: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69  char *zLine;.  i
6330: 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  nt nLine;.  int 
6340: 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20  n;.  int eol;.. 
6350: 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20   nLine = 100;.  
6360: 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  zLine = malloc( 
6370: 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a  nLine );.  if( z
6380: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
6390: 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65   0;.  n = 0;.  e
63a0: 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ol = 0;.  while(
63b0: 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28   !eol ){.    if(
63c0: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
63d0: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
63e0: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
63f0: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
6400: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
6410: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
6420: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
6430: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
6440: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
6450: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
6460: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
6470: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
6480: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
6490: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
64a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
64b0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
64c0: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  eol = 1;.      b
64d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
64e0: 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20  while( zLine[n] 
64f0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ n++; }.    if
6500: 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e  ( n>0 && zLine[n
6510: 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  -1]=='\n' ){.   
6520: 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c     n--;.      zL
6530: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
6540: 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d    eol = 1;.    }
6550: 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72  .  }.  zLine = r
6560: 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e  ealloc( zLine, n
6570: 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  +1 );.  return z
6580: 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Line;.}../*.** T
6590: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
65a0: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
65b0: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
65c0: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
65d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
65e0: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
65f0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
6600: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
6610: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
6620: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
6630: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
6640: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
6650: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
6660: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
6670: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
6680: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
6690: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
66a0: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
66b0: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
66c0: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
66d0: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
66e0: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
66f0: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
6700: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
6710: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
6720: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
6730: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
6740: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
6750: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
6760: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
6770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6780: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
6790: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
67a0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
67b0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
67c0: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
67d0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
67e0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
67f0: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
6800: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
6810: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
6820: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
6830: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
6840: 20 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 20       "busy",    
6850: 20 20 20 20 20 20 20 20 20 20 22 63 61 63 68 65            "cache
6860: 22 2c 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22  ",.    "changes"
6870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6c  ,            "cl
6880: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
6890: 20 20 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20    "collate",.   
68a0: 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64   "collation_need
68b0: 65 64 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68  ed",   "commit_h
68c0: 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d  ook",       "com
68d0: 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70  plete",.    "cop
68e0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
68f0: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
6900: 78 74 65 6e 73 69 6f 6e 22 2c 22 65 72 72 6f 72  xtension","error
6910: 63 6f 64 65 22 2c 0a 20 20 20 20 22 65 76 61 6c  code",.    "eval
6920: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6930: 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20 20   "exists",      
6940: 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22        "function"
6950: 2c 0a 20 20 20 20 22 69 6e 63 72 62 6c 6f 62 22  ,.    "incrblob"
6960: 2c 0a 20 20 20 20 22 69 6e 74 65 72 72 75 70 74  ,.    "interrupt
6970: 22 2c 20 20 20 20 20 20 20 20 20 20 22 6c 61 73  ",          "las
6980: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
6990: 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 0a 20 20   "nullvalue",.  
69a0: 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20 20    "onecolumn",  
69b0: 20 20 20 20 20 20 20 20 22 70 72 6f 66 69 6c 65          "profile
69c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 70 72  ",           "pr
69d0: 6f 67 72 65 73 73 22 2c 0a 20 20 20 20 22 72 65  ogress",.    "re
69e0: 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  key",           
69f0: 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f     "rollback_hoo
6a00: 6b 22 2c 20 20 20 20 20 22 74 69 6d 65 6f 75 74  k",     "timeout
6a10: 22 2c 0a 20 20 20 20 22 74 6f 74 61 6c 5f 63 68  ",.    "total_ch
6a20: 61 6e 67 65 73 22 2c 20 20 20 20 20 20 22 74 72  anges",      "tr
6a30: 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ace",           
6a40: 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c    "transaction",
6a50: 0a 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f  .    "update_hoo
6a60: 6b 22 2c 20 20 20 20 20 20 20 20 22 76 65 72 73  k",        "vers
6a70: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  ion",           
6a80: 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42  0.  };.  enum DB
6a90: 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41  _enum {.    DB_A
6aa0: 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20  UTHORIZER,      
6ab0: 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20    DB_BUSY,      
6ac0: 20 20 20 20 20 20 20 44 42 5f 43 41 43 48 45 2c         DB_CACHE,
6ad0: 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c  .    DB_CHANGES,
6ae0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c             DB_CL
6af0: 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
6b00: 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20 20  DB_COLLATE,.    
6b10: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
6b20: 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54 5f  DED,  DB_COMMIT_
6b30: 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43 4f  HOOK,      DB_CO
6b40: 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f 43  MPLETE,.    DB_C
6b50: 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  OPY,            
6b60: 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44    DB_ENABLE_LOAD
6b70: 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f 45 52  _EXTENSION,DB_ER
6b80: 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44 42 5f  RORCODE,.    DB_
6b90: 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20  EVAL,           
6ba0: 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20 20 20     DB_EXISTS,   
6bb0: 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43 54          DB_FUNCT
6bc0: 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 49 4e 43 52  ION,.    DB_INCR
6bd0: 42 4c 4f 42 2c 0a 20 20 20 20 44 42 5f 49 4e 54  BLOB,.    DB_INT
6be0: 45 52 52 55 50 54 2c 20 20 20 20 20 20 20 20 20  ERRUPT,         
6bf0: 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52  DB_LAST_INSERT_R
6c00: 4f 57 49 44 2c 44 42 5f 4e 55 4c 4c 56 41 4c 55  OWID,DB_NULLVALU
6c10: 45 2c 0a 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c  E,.    DB_ONECOL
6c20: 55 4d 4e 2c 20 20 20 20 20 20 20 20 20 44 42 5f  UMN,         DB_
6c30: 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20  PROFILE,        
6c40: 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 0a 20    DB_PROGRESS,. 
6c50: 20 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20     DB_REKEY,    
6c60: 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c           DB_ROLL
6c70: 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20 44 42  BACK_HOOK,    DB
6c80: 5f 54 49 4d 45 4f 55 54 2c 0a 20 20 20 20 44 42  _TIMEOUT,.    DB
6c90: 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 20  _TOTAL_CHANGES, 
6ca0: 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20 20 20      DB_TRACE,   
6cb0: 20 20 20 20 20 20 20 20 20 44 42 5f 54 52 41 4e           DB_TRAN
6cc0: 53 41 43 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f  SACTION,.    DB_
6cd0: 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20  UPDATE_HOOK,    
6ce0: 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c 20 20     DB_VERSION,  
6cf0: 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20          .  };.  
6d00: 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74  /* don't leave t
6d10: 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f  railing commas o
6d20: 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f  n DB_enum, it co
6d30: 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78  nfuses the AIX x
6d40: 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a  lc compiler */..
6d50: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
6d60: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
6d70: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
6d80: 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e  objv, "SUBCOMMAN
6d90: 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74  D ...");.    ret
6da0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6db0: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
6dc0: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
6dd0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42  erp, objv[1], DB
6de0: 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  _strs, "option",
6df0: 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a   0, &choice) ){.
6e00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6e10: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  RROR;.  }..  swi
6e20: 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e  tch( (enum DB_en
6e30: 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20  um)choice ){..  
6e40: 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72  /*    $db author
6e50: 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  izer ?CALLBACK?.
6e60: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
6e70: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
6e80: 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65  ack to authorize
6e90: 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74   each SQL operat
6ea0: 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a  ion as it is.  *
6eb0: 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61  * compiled.  5 a
6ec0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70  rguments are app
6ed0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c  ended to the cal
6ee0: 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20  lback before it 
6ef0: 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a  is.  ** invoked:
6f00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29  .  **.  **   (1)
6f10: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
6f20: 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c  on type (ex: SQL
6f30: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
6f40: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
6f50: 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29   ...).  **   (2)
6f60: 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69   First descripti
6f70: 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73  ve name (depends
6f80: 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   on authorizatio
6f90: 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28  n type).  **   (
6fa0: 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69  3) Second descri
6fb0: 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20  ptive name.  ** 
6fc0: 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68    (4) Name of th
6fd0: 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20  e database (ex: 
6fe0: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a  "main", "temp").
6ff0: 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20    **   (5) Name 
7000: 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20  of trigger that 
7010: 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63  is doing the acc
7020: 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ess.  **.  ** Th
7030: 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c  e callback shoul
7040: 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74  d return on of t
7050: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
7060: 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c  ings: SQLITE_OK,
7070: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e  .  ** SQLITE_IGN
7080: 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44  ORE, or SQLITE_D
7090: 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ENY.  Any other 
70a0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
70b0: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20  an error..  **. 
70c0: 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68   ** If this meth
70d0: 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  od is invoked wi
70e0: 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c  th no arguments,
70f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74   the current aut
7100: 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  horization.  ** 
7110: 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20  callback string 
7120: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
7130: 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48  /.  case DB_AUTH
7140: 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66  ORIZER: {.#ifdef
7150: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7160: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54  HORIZATION.    T
7170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7180: 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69  interp, "authori
7190: 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c  zation not avail
71a0: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
71b0: 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ld", 0);.    ret
71c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
71d0: 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a  else.    if( obj
71e0: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
71f0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
7200: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
7210: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
7220: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7230: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
7240: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
7250: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
7260: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
7270: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7280: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75  interp, pDb->zAu
7290: 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  th, 0);.      }.
72a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
72b0: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20   char *zAuth;.  
72c0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
72d0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
72e0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
72f0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
7300: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7310: 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74   zAuth = Tcl_Get
7320: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
7330: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
7340: 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26      if( zAuth &&
7350: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
7360: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54    pDb->zAuth = T
7370: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
7380: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
7390: 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20  cpy(pDb->zAuth, 
73a0: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 65  zAuth);.      }e
73b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
73c0: 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->zAuth = 0;.   
73d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
73e0: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
73f0: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
7400: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
7410: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
7420: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
7430: 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  b, auth_callback
7440: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
7450: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7460: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
7470: 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  zer(pDb->db, 0, 
7480: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
7490: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
74a0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
74b0: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
74c0: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
74d0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
74e0: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
74f0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
7500: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
7510: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
7520: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
7530: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
7540: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
7550: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
7560: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
7570: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
7580: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
7590: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
75a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
75b0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
75c0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
75d0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
75e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
75f0: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30  p, pDb->zBusy, 0
7600: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
7620: 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69   *zBusy;.      i
7630: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
7640: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
7650: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
7660: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
7670: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73      }.      zBus
7680: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
7690: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
76a0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
76b0: 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e  f( zBusy && len>
76c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
76d0: 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c  ->zBusy = Tcl_Al
76e0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
76f0: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
7700: 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79  Db->zBusy, zBusy
7710: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7720: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
7730: 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sy = 0;.      }.
7740: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
7750: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
7760: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
7770: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
7780: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
7790: 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75  er(pDb->db, DbBu
77a0: 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  syHandler, pDb);
77b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
77c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
77d0: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
77e0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
77f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
7800: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
7810: 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73    $db cache flus
7820: 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  h.  **     $db c
7830: 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a  ache size n.  **
7840: 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  .  ** Flush the 
7850: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
7860: 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74  nt cache, or set
7870: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
7880: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68  ber of.  ** cach
7890: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
78a0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41   */.  case DB_CA
78b0: 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  CHE: {.    char 
78c0: 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74  *subCmd;.    int
78d0: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   n;..    if( obj
78e0: 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c<=2 ){.      Tc
78f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7900: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7910: 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61  "cache option ?a
7920: 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  rg?");.      ret
7930: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7940: 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20     }.    subCmd 
7950: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
7960: 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c  romObj( objv[2],
7970: 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73   0 );.    if( *s
7980: 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74  ubCmd=='f' && st
7990: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75  rcmp(subCmd,"flu
79a0: 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sh")==0 ){.     
79b0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
79c0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
79d0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
79e0: 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68   2, objv, "flush
79f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
7a00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7a10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7a20: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
7a30: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
7a40: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
7a50: 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20  *subCmd=='s' && 
7a60: 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73  strcmp(subCmd,"s
7a70: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
7a80: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
7a90: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
7aa0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
7ab0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65  , 2, objv, "size
7ac0: 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65   n");.        re
7ad0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7ae0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7af0: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52       if( TCL_ERR
7b00: 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OR==Tcl_GetIntFr
7b10: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
7b20: 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20  jv[3], &n) ){.  
7b30: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
7b40: 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
7b50: 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72  , "cannot conver
7b60: 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  t \"", .        
7b70: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
7b80: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
7b90: 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69  [3],0), "\" to i
7ba0: 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20  nteger", 0);.   
7bb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
7bc0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
7bd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7be0: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
7bf0: 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74           flushSt
7c00: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
7c20: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
7c30: 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45  se if( n>MAX_PRE
7c40: 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20  PARED_STMTS ){. 
7c50: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d             n = M
7c60: 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
7c70: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  S;.          }. 
7c80: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61           pDb->ma
7c90: 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20  xStmt = n;.     
7ca0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7cb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
7cc0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
7cd0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74  interp, "bad opt
7ce0: 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20  ion \"", .      
7cf0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
7d00: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
7d10: 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62  ,0), "\": must b
7d20: 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22  e flush or size"
7d30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
7d40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7d50: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
7d60: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62   }..  /*     $db
7d70: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20   changes.  **.  
7d80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
7d90: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
7da0: 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
7db0: 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
7dc0: 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68  leted by.  ** th
7dd0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e  e most recent IN
7de0: 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
7df0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
7e00: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  , not including 
7e10: 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65  .  ** any change
7e20: 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65  s made by trigge
7e30: 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f  r programs..  */
7e40: 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47  .  case DB_CHANG
7e50: 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
7e60: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
7e70: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
7e80: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
7e90: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
7ea0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
7eb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7ec0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
7ed0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
7ee0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
7ef0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
7f00: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
7f10: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62  ite3_changes(pDb
7f20: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
7f30: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
7f40: 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20  $db close.  **. 
7f50: 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65   ** Shutdown the
7f60: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20   database.  */. 
7f70: 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20   case DB_CLOSE: 
7f80: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  {.    Tcl_Delete
7f90: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
7fa0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7fb0: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
7fc0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
7fd0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
7fe0: 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d   $db collate NAM
7ff0: 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
8000: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
8010: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
8020: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
8030: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
8040: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
8050: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
8060: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
8070: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
8080: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
8090: 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  DB_COLLATE: {.  
80a0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
80b0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72  ollate;.    char
80c0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
80d0: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
80e0: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
80f0: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
8100: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
8110: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
8120: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
8130: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
8140: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8150: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
8160: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
8170: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
8180: 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
8190: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
81a0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
81b0: 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
81c0: 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f  Collate = (SqlCo
81d0: 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63  llate*)Tcl_Alloc
81e0: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61  ( sizeof(*pColla
81f0: 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20  te) + nScript + 
8200: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  1 );.    if( pCo
8210: 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72  llate==0 ) retur
8220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8230: 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72   pCollate->inter
8240: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
8250: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20  pCollate->pNext 
8260: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
8270: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a  .    pCollate->z
8280: 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29  Script = (char*)
8290: 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20  &pCollate[1];.  
82a0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
82b0: 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  = pCollate;.    
82c0: 73 74 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d  strcpy(pCollate-
82d0: 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70  >zScript, zScrip
82e0: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  t);.    if( sqli
82f0: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
8300: 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
8310: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
8320: 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  , .        pColl
8330: 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61  ate, tclSqlColla
8340: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  te) ){.      Tcl
8350: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
8360: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
8370: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
8380: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
8390: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
83a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
83b0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
83c0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
83d0: 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  db collation_nee
83e0: 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ded SCRIPT.  **.
83f0: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
8400: 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
8410: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
8420: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
8430: 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
8440: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
8450: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
8460: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
8470: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
8480: 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e  e DB_COLLATION_N
8490: 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28  EEDED: {.    if(
84a0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
84b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
84c0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
84d0: 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
84e0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
84f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8500: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
8510: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
8520: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
8530: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
8540: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  Needed);.    }. 
8550: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
8560: 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70  Needed = Tcl_Dup
8570: 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32  licateObj(objv[2
8580: 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  ]);.    Tcl_Incr
8590: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
85a0: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
85b0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61     sqlite3_colla
85c0: 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d  tion_needed(pDb-
85d0: 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c  >db, pDb, tclCol
85e0: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
85f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
8600: 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f  *    $db commit_
8610: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  hook ?CALLBACK?.
8620: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
8630: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
8640: 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ack just before 
8650: 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79  committing every
8660: 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   SQL transaction
8670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
8680: 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e  llback throws an
8690: 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65   exception or re
86a0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
86b0: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72  then the.  ** tr
86c0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f  ansaction is abo
86d0: 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41  rted.  If CALLBA
86e0: 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  CK is an empty s
86f0: 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62  tring, the callb
8700: 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ack.  ** is disa
8710: 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  bled..  */.  cas
8720: 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b  e DB_COMMIT_HOOK
8730: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
8740: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
8750: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8760: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
8770: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
8780: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8790: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
87a0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
87b0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
87c0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
87d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
87e0: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  (interp, pDb->zC
87f0: 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  ommit, 0);.     
8800: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8810: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
8820: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
8830: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
8840: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
8850: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
8860: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
8870: 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
8880: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
8890: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
88a0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
88b0: 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
88c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
88d0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
88e0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
88f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
8900: 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
8910: 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   zCommit);.     
8920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8930: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
8940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8950: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
8960: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
8970: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
8980: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8990: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
89a0: 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
89b0: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
89c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
89d0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
89e0: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
89f0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
8a00: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
8a10: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
8a20: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
8a30: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
8a40: 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
8a50: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
8a60: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
8a70: 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
8a80: 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
8a90: 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
8aa0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
8ab0: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
8ac0: 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
8ad0: 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
8ae0: 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
8af0: 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
8b00: 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
8b10: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
8b20: 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
8b30: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
8b40: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
8b50: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
8b60: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
8b70: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
8b80: 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
8b90: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8ba0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8bb0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
8bc0: 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
8bd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8be0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
8bf0: 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
8c00: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
8c10: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
8c20: 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
8c30: 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
8c40: 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
8c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
8c60: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
8c70: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
8c80: 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
8c90: 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
8ca0: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
8cb0: 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
8cc0: 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
8cd0: 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
8ce0: 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
8cf0: 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
8d00: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
8d10: 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
8d20: 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
8d30: 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
8d40: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
8d50: 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
8d60: 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
8d70: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
8d80: 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
8d90: 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
8da0: 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
8db0: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
8dc0: 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
8dd0: 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
8de0: 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
8df0: 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
8e00: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
8e10: 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
8e20: 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
8e30: 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
8e40: 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
8e50: 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
8e60: 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
8e70: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
8e80: 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
8e90: 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
8ea0: 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
8eb0: 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
8ec0: 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
8ed0: 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
8ee0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
8ef0: 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
8f00: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
8f10: 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
8f20: 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
8f30: 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
8f40: 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
8f50: 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
8f60: 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
8f70: 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
8f80: 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
8f90: 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
8fa0: 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
8fb0: 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
8fc0: 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
8fd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
8fe0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8ff0: 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
9000: 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
9010: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
9020: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
9030: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
9040: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
9050: 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
9060: 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
9070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9080: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
9090: 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
90a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
90b0: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
90c0: 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
90d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  */.    int rc;  
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90f0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
9100: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  e */.    int nCo
9110: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9130: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9140: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
9150: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
9160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9170: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
9180: 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f  an SQL string */
9190: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  .    int i, j;  
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
91c0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
91d0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
91e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
91f0: 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b  f bytes in zSep[
9200: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75  ] */.    int nNu
9210: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
9220: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9230: 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c  f bytes in zNull
9240: 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  [] */.    char *
9250: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
9260: 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20        /* An SQL 
9270: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
9280: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20   char *zLine;   
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
92a0: 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  A single line of
92b0: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
92c0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
92d0: 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20   **azCol;       
92e0: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65          /* zLine
92f0: 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74  [] broken up int
9300: 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  o columns */.   
9310: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9330: 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68  How to commit ch
9340: 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c  anges */.    FIL
9350: 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
9360: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9370: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
9380: 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30    int lineno = 0
9390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
93a0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20   Line number of 
93b0: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
93c0: 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b    char zLineNum[
93d0: 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  80];          /*
93e0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69   Line number pri
93f0: 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  nt buffer */.   
9400: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
9410: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
9420: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f  interp result */
9430: 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70  ..    char *zSep
9440: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c  ;.    char *zNul
9450: 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  l;.    if( objc<
9460: 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20  5 || objc>7 ){. 
9470: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
9480: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
9490: 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20   objv, .        
94a0: 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52   "CONFLICT-ALGOR
94b0: 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e  ITHM TABLE FILEN
94c0: 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  AME ?SEPARATOR? 
94d0: 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22  ?NULLINDICATOR?"
94e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
94f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9500: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36  .    if( objc>=6
9510: 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d   ){.      zSep =
9520: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9530: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30  omObj(objv[5], 0
9540: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9550: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b      zSep = "\t";
9560: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
9570: 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20  bjc>=7 ){.      
9580: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
9590: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
95a0: 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[6], 0);.    }e
95b0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  lse{.      zNull
95c0: 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20   = "";.    }.   
95d0: 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c   zConflict = Tcl
95e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
95f0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
9600: 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
9610: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9620: 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20  (objv[3], 0);.  
9630: 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
9640: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9650: 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[4], 0);.    
9660: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53  nSep = strlen(zS
9670: 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d  ep);.    nNull =
9680: 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a   strlen(zNull);.
9690: 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
96a0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
96b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
96c0: 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c  ,"Error: non-nul
96d0: 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  l separator requ
96e0: 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30  ired for copy",0
96f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9700: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9710: 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65 33 53  .    if(sqlite3S
9720: 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  trICmp(zConflict
9730: 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d  , "rollback") !=
9740: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c   0 &&.       sql
9750: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e  ite3StrICmp(zCon
9760: 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20  flict, "abort"  
9770: 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
9780: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
9790: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69  (zConflict, "fai
97a0: 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a  l"    ) != 0 &&.
97b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
97c0: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
97d0: 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20   "ignore"  ) != 
97e0: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
97f0: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
9800: 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20  lict, "replace" 
9810: 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20  ) != 0 ) {.     
9820: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9830: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
9840: 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74  : \"", zConflict
9850: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
9860: 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67  \", conflict-alg
9870: 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f  orithm must be o
9880: 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c  ne of: rollback,
9890: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
98a0: 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
98b0: 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22  ore, or replace"
98c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
98d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
98e0: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
98f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
9900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25  SELECT * FROM '%
9910: 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  q'", zTable);.  
9920: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
9930: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
9940: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9950: 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20  "Error: no such 
9960: 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65  table: ", zTable
9970: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
9980: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9990: 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
99a0: 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20  strlen(zSql);.  
99b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
99c0: 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20  repare(pDb->db, 
99d0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
99e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
99f0: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
9a00: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
9a10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9a20: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
9a30: 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
9a40: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
9a50: 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  );.      nCol = 
9a60: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
9a70: 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
9a80: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
9a90: 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
9aa0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
9ab0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
9ac0: 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20  f( nCol==0 ) {. 
9ad0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9ae0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9af0: 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20   zSql = malloc( 
9b00: 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f  nByte + 50 + nCo
9b10: 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  l*2 );.    if( z
9b20: 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Sql==0 ) {.     
9b30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9b40: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
9b50: 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
9b60: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
9b70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9b80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9b90: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b  _snprintf(nByte+
9ba0: 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52  50, zSql, "INSER
9bb0: 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71  T OR %q INTO '%q
9bc0: 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20  ' VALUES(?",.   
9bd0: 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c        zConflict,
9be0: 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20   zTable);.    j 
9bf0: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
9c00: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
9c10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
9c20: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
9c30: 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
9c40: 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
9c50: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
9c60: 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
9c70: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
9c80: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
9c90: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
9ca0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
9cb0: 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20   free(zSql);.   
9cc0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
9cd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9ce0: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
9cf0: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
9d00: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
9d10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9d20: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
9d30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9d40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9d50: 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46     in = fopen(zF
9d60: 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  ile, "rb");.    
9d70: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
9d80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9d90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
9da0: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
9db0: 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20  file: ", zFile, 
9dc0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
9dd0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
9de0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
9df0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9e00: 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20    }.    azCol = 
9e10: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
9e20: 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31  zCol[0])*(nCol+1
9e30: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43  ) );.    if( azC
9e40: 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ol==0 ) {.      
9e50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9e60: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
9e70: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
9e80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f  , 0);.      fclo
9e90: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65  se(in);.      re
9ea0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9eb0: 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29      }.    (void)
9ec0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
9ed0: 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  ->db, "BEGIN", 0
9ee0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f  , 0, 0);.    zCo
9ef0: 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b  mmit = "COMMIT";
9f00: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69  .    while( (zLi
9f10: 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69  ne = local_getli
9f20: 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b  ne(0, in))!=0 ){
9f30: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  .      char *z;.
9f40: 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20        i = 0;.   
9f50: 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
9f60: 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c     azCol[0] = zL
9f70: 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ine;.      for(i
9f80: 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b  =0, z=zLine; *z;
9f90: 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   z++){.        i
9fa0: 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26  f( *z==zSep[0] &
9fb0: 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65  & strncmp(z, zSe
9fc0: 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20  p, nSep)==0 ){. 
9fd0: 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b           *z = 0;
9fe0: 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
9ff0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
a000: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
a010: 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26      azCol[i] = &
a020: 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20  z[nSep];.       
a030: 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31       z += nSep-1
a040: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a050: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a060: 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e        if( i+1!=n
a070: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Col ){.        c
a080: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
a090: 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63     zErr = malloc
a0a0: 28 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46  (200 + strlen(zF
a0b0: 69 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ile));.        i
a0c0: 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
a0d0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72       sprintf(zEr
a0e0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
a0f0: 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20  "Error: %s line 
a100: 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
a110: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
a120: 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20  but found %d",. 
a130: 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
a140: 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c  e, lineno, nCol,
a150: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
a160: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a170: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20  t(interp, zErr, 
a180: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72  0);.          fr
a190: 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ee(zErr);.      
a1a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d    }.        zCom
a1b0: 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
a1c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
a1d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
a1e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
a1f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
a200: 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20   check for null 
a210: 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e  data, if so, bin
a220: 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  d as null */.   
a230: 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e       if ((nNull>
a240: 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f  0 && strcmp(azCo
a250: 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29  l[i], zNull)==0)
a260: 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c   || strlen(azCol
a270: 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20  [i])==0) {.     
a280: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
a290: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b  d_null(pStmt, i+
a2a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
a2b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
a2c0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
a2d0: 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c  Stmt, i+1, azCol
a2e0: 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
a2f0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
a300: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a310: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
a320: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
a330: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
a340: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65  Stmt);.      fre
a350: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
a360: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a370: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
a380: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a390: 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20  terp,"Error: ", 
a3a0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
a3b0: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
a3c0: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
a3d0: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
a3e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a3f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
a400: 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c  (azCol);.    fcl
a410: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c  ose(in);.    sql
a420: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
a430: 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  tmt);.    (void)
a440: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
a450: 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30  ->db, zCommit, 0
a460: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66  , 0, 0);..    if
a470: 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20  ( zCommit[0] == 
a480: 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  'C' ){.      /* 
a490: 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73  success, set res
a4a0: 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66  ult as number of
a4b0: 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64   lines processed
a4c0: 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c   */.      pResul
a4d0: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
a4e0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
a4f0: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
a500: 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e  j(pResult, linen
a510: 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  o);.      rc = T
a520: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
a530: 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75  {.      /* failu
a540: 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e  re, append linen
a550: 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a  o where failed *
a560: 2f 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  /.      sprintf(
a570: 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69  zLineNum,"%d",li
a580: 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c  neno);.      Tcl
a590: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a5a0: 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77  terp,", failed w
a5b0: 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  hile processing 
a5c0: 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d  line: ",zLineNum
a5d0: 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ,0);.      rc = 
a5e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a5f0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
a600: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
a610: 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  b enable_load_ex
a620: 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a  tension BOOLEAN.
a630: 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74    **.  ** Turn t
a640: 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61  he extension loa
a650: 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20  ding feature on 
a660: 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f  or off.  It if o
a670: 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75  ff by.  ** defau
a680: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  lt..  */.  case 
a690: 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  DB_ENABLE_LOAD_E
a6a0: 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e  XTENSION: {.#ifn
a6b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a6c0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
a6d0: 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20     int onoff;.  
a6e0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
a6f0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
a700: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a710: 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41  2, objv, "BOOLEA
a720: 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  N");.      retur
a730: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a740: 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47   }.    if( Tcl_G
a750: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
a760: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
a770: 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20  , &onoff) ){.   
a780: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a790: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
a7a0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
a7b0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62  ad_extension(pDb
a7c0: 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20  ->db, onoff);.  
a7d0: 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20    break;.#else. 
a7e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a7f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74  ult(interp, "ext
a800: 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69  ension loading i
a810: 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20  s turned off at 
a820: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20  compile-time",. 
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 20 20 20 20 30 29 3b 0a 20 20 20 20 72 65 74 75      0);.    retu
a850: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
a860: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ndif.  }..  /*. 
a870: 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72   **    $db error
a880: 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  code.  **.  ** R
a890: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69  eturn the numeri
a8a0: 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  c error code tha
a8b0: 74 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62  t was returned b
a8c0: 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
a8d0: 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  t.  ** call to s
a8e0: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20  qlite3_exec().. 
a8f0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52   */.  case DB_ER
a900: 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54  RORCODE: {.    T
a910: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
a920: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
a930: 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ntObj(sqlite3_er
a940: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29  rcode(pDb->db)))
a950: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
a960: 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  .   .  /*.  **  
a970: 20 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20    $db eval $sql 
a980: 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63  ?array? ?{  ...c
a990: 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20  ode... }?.  **  
a9a0: 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20    $db onecolumn 
a9b0: 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  $sql.  **.  ** T
a9c0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
a9d0: 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c   in $sql is eval
a9e0: 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68  uated.  For each
a9f0: 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73   row, the values
aa00: 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64   are.  ** placed
aa10: 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   in elements of 
aa20: 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20  the array named 
aa30: 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63  "array" and ...c
aa40: 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74  ode... is execut
aa50: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
aa60: 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61  ay" and "code" a
aa70: 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e  re omitted, then
aa80: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20   no callback is 
aa90: 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20  every invoked.. 
aaa0: 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69   ** If "array" i
aab0: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
aac0: 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  g, then the valu
aad0: 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e  es are placed in
aae0: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
aaf0: 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61  that have the sa
ab00: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66  me name as the f
ab10: 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20  ields extracted 
ab20: 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  by the query..  
ab30: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63  **.  ** The onec
ab40: 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20  olumn method is 
ab50: 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
ab60: 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64  f:.  **     lind
ab70: 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71  ex [$db eval $sq
ab80: 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65  l] 0.  */.  case
ab90: 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20   DB_ONECOLUMN:. 
aba0: 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20   case DB_EVAL:. 
abb0: 20 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a   case DB_EXISTS:
abc0: 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73   {.    char cons
abd0: 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a  t *zSql;      /*
abe0: 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   Next SQL statem
abf0: 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a  ent to execute *
ac00: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
ac10: 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *zLeft;     /* 
ac20: 57 68 61 74 20 69 73 20 6c 65 66 74 20 61 66 74  What is left aft
ac30: 65 72 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e  er first stmt in
ac40: 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c   zSql */.    sql
ac50: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
ac60: 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20  ;   /* Compiled 
ac70: 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a  SQL statment */.
ac80: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72      Tcl_Obj *pAr
ac90: 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ray;       /* Na
aca0: 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f  me of array into
acb0: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61   which results a
acc0: 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  re written */.  
acd0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
ace0: 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69  pt;      /* Scri
acf0: 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61  pt to run for ea
ad00: 63 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ch result set */
ad10: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
ad20: 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50  pParm;      /* P
ad30: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e  arameters that n
ad40: 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65  eed a Tcl_DecrRe
ad50: 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20  fCount() */.    
ad60: 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20  int nParm;      
ad70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ad80: 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65 64   of entries used
ad90: 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a   in apParm[] */.
ada0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61      Tcl_Obj *aPa
adb0: 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74  rm[10];    /* St
adc0: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
add0: 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63  pParm[] in the c
ade0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
adf0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
ae00: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
ae10: 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
ae20: 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61   */.    SqlPrepa
ae30: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
ae40: 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  t;  /* Pointer t
ae50: 6f 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  o a prepared sta
ae60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
ae70: 74 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20  t rc2;..    if( 
ae80: 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20  choice==DB_EVAL 
ae90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
aea0: 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b  c<3 || objc>5 ){
aeb0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
aec0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
aed0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20  , 2, objv, "SQL 
aee0: 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43  ?ARRAY-NAME? ?SC
aef0: 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20  RIPT?");.       
af00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
af10: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
af20: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
af30: 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  bj();.      Tcl_
af40: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
af50: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
af60: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
af70: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
af80: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
af90: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
afa0: 51 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  QL");.        re
afb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
afc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
afd0: 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49  ( choice==DB_EXI
afe0: 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70  STS ){.        p
aff0: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f  Ret = Tcl_NewBoo
b000: 6c 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20  leanObj(0);.    
b010: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
b020: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
b030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b040: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
b050: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b060: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
b070: 20 20 70 41 72 72 61 79 20 3d 20 70 53 63 72 69    pArray = pScri
b080: 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  pt = 0;.    }els
b090: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
b0a0: 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20  .      pArray = 
b0b0: 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  0;.      pScript
b0c0: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
b0d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 72  }else{.      pAr
b0e0: 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ray = objv[3];. 
b0f0: 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
b100: 53 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b 30  String(pArray)[0
b110: 5d 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d 20  ]==0 ) pArray = 
b120: 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  0;.      pScript
b130: 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20   = objv[4];.    
b140: 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  }..    Tcl_IncrR
b150: 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29  efCount(objv[2])
b160: 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c  ;.    zSql = Tcl
b170: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
b180: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
b190: 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43     while( rc==TC
b1a0: 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20  L_OK && zSql[0] 
b1b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  ){.      int i; 
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
b1e0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
b1f0: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
b200: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b210: 72 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d 65  r of bind parame
b220: 74 65 72 73 20 69 6e 20 74 68 65 20 70 53 74 6d  ters in the pStm
b230: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
b240: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
b250: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b260: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
b270: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
b280: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a        Tcl_Obj **
b290: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20  apColName = 0;  
b2a0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
b2b0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
b2c0: 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20     int len;     
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b2e0: 20 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f   String length o
b2f0: 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20  f zSql */.  .   
b300: 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e     /* Try to fin
b310: 64 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  d a SQL statemen
b320: 74 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  t that has alrea
b330: 64 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64  dy been compiled
b340: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77 68   and.      ** wh
b350: 69 63 68 20 6d 61 74 63 68 65 73 20 74 68 65 20  ich matches the 
b360: 6e 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f 66  next sequence of
b370: 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   SQL..      */. 
b380: 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a       pStmt = 0;.
b390: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d        pPreStmt =
b3a0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a   pDb->stmtList;.
b3b0: 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c        len = strl
b3c0: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  en(zSql);.      
b3d0: 69 66 28 20 70 50 72 65 53 74 6d 74 20 26 26 20  if( pPreStmt && 
b3e0: 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28  sqlite3_expired(
b3f0: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29  pPreStmt->pStmt)
b400: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73   ){.        flus
b410: 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b  hStmtCache(pDb);
b420: 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d  .        pPreStm
b430: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
b440: 20 20 20 20 20 66 6f 72 28 3b 20 70 50 72 65 53       for(; pPreS
b450: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
b460: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
b470: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
b480: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a  pPreStmt->nSql;.
b490: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
b4a0: 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =n .            
b4b0: 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74  && memcmp(pPreSt
b4c0: 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  mt->zSql, zSql, 
b4d0: 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
b4e0: 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30    && (zSql[n]==0
b4f0: 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27   || zSql[n-1]=='
b500: 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ;').        ){. 
b510: 20 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d           pStmt =
b520: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
b530: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65 66  ;.          zLef
b540: 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74  t = &zSql[pPreSt
b550: 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20  mt->nSql];..    
b560: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20        /* When a 
b570: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
b580: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c  nt is found, unl
b590: 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ink it from the.
b5a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63            ** cac
b5b0: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
b5c0: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
b5d0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
b5e0: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  inning.         
b5f0: 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65   ** of the cache
b600: 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74   list in order t
b610: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20  o implement LRU 
b620: 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20  replacement..   
b630: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b640: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
b650: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
b660: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
b670: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
b680: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
b690: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
b6a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
b6b0: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
b6c0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
b6d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b6e0: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
b6f0: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
b700: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
b710: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
b720: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
b730: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
b740: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
b750: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
b760: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
b770: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b780: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
b790: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  --;.          br
b7a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
b7b0: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
b7c0: 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65  /* If no prepare
b7d0: 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  d statement was 
b7e0: 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20  found.  Compile 
b7f0: 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20 20  the SQL text.   
b800: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
b810: 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pStmt==0 ){.    
b820: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
b830: 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61  K!=sqlite3_prepa
b840: 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
b850: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a  , -1, &pStmt, &z
b860: 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
b870: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
b880: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
b890: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
b8a0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29  errmsg(pDb->db))
b8b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
b8c0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
b8d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b8f0: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
b900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51            if( SQ
b910: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
b920: 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
b930: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
b940: 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69   /* A compile-ti
b950: 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  me error in the 
b960: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
b970: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b980: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
b990: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
b9a0: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
b9b0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
b9c0: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
b9d0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
b9e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
b9f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ak;.          }e
ba00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ba10: 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e   /* The statemen
ba20: 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  t was a no-op.  
ba30: 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20  Continue to the 
ba40: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  next statement. 
ba50: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
ba60: 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e   the SQL string.
ba70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c              zSql
ba90: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20   = zLeft;.      
baa0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
bab0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
bad0: 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d  sert( pPreStmt==
bae0: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  0 );.      }..  
baf0: 20 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75      /* Bind valu
bb00: 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73  es to parameters
bb10: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
bb20: 20 24 20 6f 72 20 3a 0a 20 20 20 20 20 20 2a 2f   $ or :.      */
bb30: 20 20 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20    .      nVar = 
bb40: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
bb50: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
bb60: 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50 61 72 6d  mt);.      nParm
bb70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
bb80: 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61 50 61 72  nVar>sizeof(aPar
bb90: 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61 72 6d 5b  m)/sizeof(aParm[
bba0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  0]) ){.        a
bbb0: 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a  pParm = (Tcl_Obj
bbc0: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61  **)Tcl_Alloc(nVa
bbd0: 72 2a 73 69 7a 65 6f 66 28 61 70 50 61 72 6d 5b  r*sizeof(apParm[
bbe0: 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  0]));.      }els
bbf0: 65 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72  e{.        apPar
bc00: 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20 20 20  m = aParm;.     
bc10: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31   }.      for(i=1
bc20: 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b  ; i<=nVar; i++){
bc30: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
bc40: 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69  har *zVar = sqli
bc50: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
bc60: 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  er_name(pStmt, i
bc70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
bc80: 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b  Var!=0 && (zVar[
bc90: 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b  0]=='$' || zVar[
bca0: 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20 20 20 20  0]==':') ){.    
bcb0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
bcc0: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  Var = Tcl_GetVar
bcd0: 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61  2Ex(interp, &zVa
bce0: 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  r[1], 0, 0);.   
bcf0: 20 20 20 20 20 20 20 69 66 28 20 70 56 61 72 20         if( pVar 
bd00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
bd10: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  nt n;.          
bd20: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
bd30: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
bd40: 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65  ype = pVar->type
bd50: 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65  Ptr ? pVar->type
bd60: 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a  Ptr->name : "";.
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
bd80: 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20   c = zType[0];. 
bd90: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
bda0: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
bdb0: 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79  zType,"bytearray
bdc0: 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62  ")==0 && pVar->b
bdd0: 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ytes==0 ){.     
bde0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
bdf0: 20 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70   load a BLOB typ
be00: 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72  e if the Tcl var
be10: 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61  iable is a bytea
be20: 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20  rray and.       
be30: 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f         ** has no
be40: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
be50: 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  tation. */.     
be60: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
be70: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
be80: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
be90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
bea0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
beb0: 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74  ob(pStmt, i, dat
bec0: 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  a, n, SQLITE_STA
bed0: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
bee0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
bef0: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
bf00: 20 20 20 20 20 20 20 20 20 20 61 70 50 61 72 6d            apParm
bf10: 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [nParm++] = pVar
bf20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
bf30: 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62 27 20  lse if( (c=='b' 
bf40: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
bf50: 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29 20 7c  "boolean")==0) |
bf60: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
bf70: 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73      (c=='i' && s
bf80: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74  trcmp(zType,"int
bf90: 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ")==0) ){.      
bfa0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49          Tcl_GetI
bfb0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
bfc0: 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  , pVar, &n);.   
bfd0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
bfe0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
bff0: 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t, i, n);.      
c000: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c010: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
c020: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
c030: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
c040: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
c060: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
c070: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
c080: 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &r);.           
c090: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
c0a0: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c  double(pStmt, i,
c0b0: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   r);.           
c0c0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 77   }else if( c=='w
c0d0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
c0e0: 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 20  e,"wideInt")==0 
c0f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
c100: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
c120: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
c130: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
c140: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
c150: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
c160: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  d_int64(pStmt, i
c170: 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , v);.          
c180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c190: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75         data = (u
c1a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
c1b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
c1c0: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
c1e0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
c1f0: 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a  Stmt, i, (char *
c200: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
c210: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
c220: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
c230: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
c250: 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[nParm++] = 
c260: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20  pVar;.          
c270: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
c280: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
c290: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
c2a0: 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a  ll( pStmt, i );.
c2b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
c2d0: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20       /* Compute 
c2e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
c2f0: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
c300: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
c310: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
c320: 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20  if( pScript ){. 
c330: 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65         apColName
c340: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63   = (Tcl_Obj**)Tc
c350: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
c360: 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29  Tcl_Obj*)*nCol )
c370: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
c380: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ColName==0 ) bre
c390: 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ak;.        for(
c3a0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
c3b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
c3c0: 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65  olName[i] = dbTe
c3d0: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
c3e0: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
c3f0: 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20  t,i));.         
c400: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
c410: 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  t(apColName[i]);
c420: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c430: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
c440: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
c450: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
c460: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
c470: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 20  hen create.     
c480: 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29   ** the array(*)
c490: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20   entry for that 
c4a0: 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2f 0a 20  array.      */. 
c4b0: 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79 20       if( pArray 
c4c0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  ){.        Tcl_O
c4d0: 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54  bj *pColList = T
c4e0: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
c4f0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53       Tcl_Obj *pS
c500: 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  tar = Tcl_NewStr
c510: 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b  ingObj("*", -1);
c520: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
c530: 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69  rRefCount(pColLi
c540: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  st);.        for
c550: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
c560: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
c570: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
c580: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
c590: 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61  ColList, apColNa
c5a0: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  me[i]);.        
c5b0: 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  }.        Tcl_Ob
c5c0: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
c5d0: 20 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20   pArray, pStar, 
c5e0: 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20  pColList,0);.   
c5f0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
c600: 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b  Count(pColList);
c610: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
c620: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
c630: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c640: 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
c650: 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  SQL.      */.   
c660: 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43     while( rc==TC
c670: 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20 26 26  L_OK && pStmt &&
c680: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
c690: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
c6a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
c6b0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
c6c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
c6d0: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20  _Obj *pVal;.    
c6e0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
c6f0: 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20   /* Set pVal to 
c700: 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68  contain the i'th
c710: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20   column of this 
c720: 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  row. */.        
c730: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
c740: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
c750: 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  tmt, i) ){.     
c760: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
c770: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
c780: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
c790: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  es = sqlite3_col
c7a0: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
c7b0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
c7c0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
c7d0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71  wByteArrayObj(sq
c7e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
c7f0: 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 62 79 74  b(pStmt, i), byt
c800: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  es);.           
c810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c820: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c830: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c840: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
c850: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
c860: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
c870: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
c880: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
c890: 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d          if( v>=-
c8a0: 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c  2147483647 && v<
c8b0: 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20  =2147483647 ){. 
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c8d0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74  Val = Tcl_NewInt
c8e0: 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Obj(v);.        
c8f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
c910: 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  l = Tcl_NewWideI
c920: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
c930: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c940: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c950: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
c960: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
c970: 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
c980: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
c990: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
c9a0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
c9b0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
c9c0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
c9d0: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29  _NewDoubleObj(r)
c9e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
c9f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
ca00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
ca10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
ca20: 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L: {.           
ca30: 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74     pVal = dbText
ca40: 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c  ToObj(pDb->zNull
ca50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ca60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ca70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ca80: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
ca90: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
caa0: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 28 63  = dbTextToObj((c
cab0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
cac0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
cad0: 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   i));.          
cae0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
caf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cb00: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
cb10: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
cb20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
cb30: 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20   pArray==0 ){.  
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
cb50: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
cb60: 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  p, apColName[i],
cb70: 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20   0, pVal, 0);.  
cb80: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
cb90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
cba0: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
cbb0: 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70  terp, pArray, ap
cbc0: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c  ColName[i], pVal
cbd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
cbe0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
cbf0: 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d  lse if( choice==
cc00: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a  DB_ONECOLUMN ){.
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
cc20: 72 74 28 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20  rt( pRet==0 );. 
cc30: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
cc40: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ret==0 ){.      
cc50: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70          pRet = p
cc60: 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Val;.           
cc70: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
cc80: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
cc90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cca0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52       rc = TCL_BR
ccb0: 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EAK;.           
ccc0: 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i = nCol;.     
ccd0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
cce0: 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53  hoice==DB_EXISTS
ccf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
cd00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cd10: 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  (pRet);.        
cd20: 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e      pRet = Tcl_N
cd30: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 3b  ewBooleanObj(1);
cd40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
cd50: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _IncrRefCount(pR
cd60: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
cd70: 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b   rc = TCL_BREAK;
cd80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d  .            i =
cd90: 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   nCol;.         
cda0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cdb0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
cdc0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
cdd0: 65 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c 29  erp, pRet, pVal)
cde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
cdf0: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
ce00: 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29     if( pScript )
ce10: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
ce20: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
ce30: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
ce40: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
ce50: 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e  ( rc==TCL_CONTIN
ce60: 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  UE ){.          
ce70: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
ce80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ce90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
cea0: 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42     if( rc==TCL_B
ceb0: 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  REAK ){.        
cec0: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
ced0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
cee0: 72 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ree the column n
cef0: 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  ame objects */. 
cf00: 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74       if( pScript
cf10: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
cf20: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
cf30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
cf40: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _DecrRefCount(ap
cf50: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
cf60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
cf70: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61  cl_Free((char*)a
cf80: 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  pColName);.     
cf90: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   }..      /* Fre
cfa0: 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69  e the bound stri
cfb0: 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61  ng and blob para
cfc0: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  meters */.      
cfd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d  for(i=0; i<nParm
cfe0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
cff0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
d000: 28 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20  (apParm[i]);.   
d010: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
d020: 70 50 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a  pParm!=aParm ){.
d030: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
d040: 28 28 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b  ((char*)apParm);
d050: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d060: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 73 74 61  /* Reset the sta
d070: 74 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20  tement.  If the 
d080: 72 65 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53  result code is S
d090: 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68  QLITE_SCHEMA, th
d0a0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  en.      ** flus
d0b0: 68 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  h the statement 
d0c0: 63 61 63 68 65 20 61 6e 64 20 74 72 79 20 74 68  cache and try th
d0d0: 65 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69  e statement agai
d0e0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
d0f0: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
d100: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
d110: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 53      if( SQLITE_S
d120: 43 48 45 4d 41 3d 3d 72 63 32 20 29 7b 0a 20 20  CHEMA==rc2 ){.  
d130: 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 61        /* After a
d140: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
d150: 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 20  flush the cache 
d160: 61 6e 64 20 74 72 79 20 74 6f 20 72 75 6e 20 74  and try to run t
d170: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  he.        ** st
d180: 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 0a 20 20  atement again.  
d190: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d1a0: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
d1b0: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20   pDb );.        
d1c0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
d1d0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
d1e0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20   if( pPreStmt ) 
d1f0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
d200: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20  pPreStmt);.     
d210: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
d220: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c     }else if( SQL
d230: 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20  ITE_OK!=rc2 ){. 
d240: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72         /* If a r
d250: 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63  un-time error oc
d260: 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65  curs, report the
d270: 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20   error and stop 
d280: 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20  reading.        
d290: 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20  ** the SQL.     
d2a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63     */.        Tc
d2b0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
d2c0: 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
d2d0: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
d2e0: 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  g(pDb->db)));.  
d2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
d300: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
d310: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
d320: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69  ERROR;.        i
d330: 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63  f( pPreStmt ) Tc
d340: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50  l_Free((char*)pP
d350: 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  reStmt);.       
d360: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
d370: 6c 73 65 20 69 66 28 20 70 44 62 2d 3e 6d 61 78  lse if( pDb->max
d380: 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt<=0 ){.     
d390: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63     /* If the cac
d3a0: 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  he is turned off
d3b0: 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68  , deallocated th
d3c0: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
d3d0: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
d3e0: 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28  tmt ) Tcl_Free((
d3f0: 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b  char*)pPreStmt);
d400: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d410: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
d420: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d430: 20 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79 74         /* Everyt
d440: 68 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64 20  hing worked and 
d450: 74 68 65 20 63 61 63 68 65 20 69 73 20 6f 70 65  the cache is ope
d460: 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20  rational..      
d470: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
d480: 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  w SqlPreparedStm
d490: 74 20 73 74 72 75 63 74 75 72 65 20 69 66 20 77  t structure if w
d4a0: 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20  e need one..    
d4b0: 20 20 20 20 2a 2a 20 28 49 66 20 77 65 20 61 6c      ** (If we al
d4c0: 72 65 61 64 79 20 68 61 76 65 20 6f 6e 65 20 77  ready have one w
d4d0: 65 20 63 61 6e 20 6a 75 73 74 20 72 65 75 73 65  e can just reuse
d4e0: 20 69 74 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f   it.).        */
d4f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
d500: 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eStmt==0 ){.    
d510: 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66        len = zLef
d520: 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20  t - zSql;.      
d530: 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28      pPreStmt = (
d540: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a  SqlPreparedStmt*
d550: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
d560: 6f 66 28 2a 70 50 72 65 53 74 6d 74 29 20 2b 20  of(*pPreStmt) + 
d570: 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  len );.         
d580: 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30   if( pPreStmt==0
d590: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d5a0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ROR;.          p
d5b0: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d  PreStmt->pStmt =
d5c0: 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
d5d0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c    pPreStmt->nSql
d5e0: 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20   = len;.        
d5f0: 20 20 6d 65 6d 63 70 79 28 70 50 72 65 53 74 6d    memcpy(pPreStm
d600: 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c  t->zSql, zSql, l
d610: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  en);.          p
d620: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65  PreStmt->zSql[le
d630: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
d640: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64  }..        /* Ad
d650: 64 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  d the prepared s
d660: 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20  tatement to the 
d670: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
d680: 20 63 61 63 68 65 20 6c 69 73 74 0a 20 20 20 20   cache list.    
d690: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
d6a0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d  PreStmt->pNext =
d6b0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a   pDb->stmtList;.
d6c0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
d6d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
d6e0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74       if( pDb->st
d6f0: 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  mtList ){.      
d700: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
d710: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74  ->pPrev = pPreSt
d720: 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  mt;.        }.  
d730: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
d740: 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  ist = pPreStmt;.
d750: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d          if( pDb-
d760: 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a  >stmtLast==0 ){.
d770: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
d780: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20  ( pDb->nStmt==0 
d790: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
d7a0: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72  ->stmtLast = pPr
d7b0: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  eStmt;.        }
d7c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d7d0: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74  assert( pDb->nSt
d7e0: 6d 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  mt>0 );.        
d7f0: 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e  }.        pDb->n
d800: 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20  Stmt++;.   .    
d810: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
d820: 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65  e too many state
d830: 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72  ment in cache, r
d840: 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75  emove the surplu
d850: 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20  s from the.     
d860: 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
d870: 20 63 61 63 68 65 20 6c 69 73 74 2e 0a 20 20 20   cache list..   
d880: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
d890: 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d  while( pDb->nStm
d8a0: 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29  t>pDb->maxStmt )
d8b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d8c0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62  te3_finalize(pDb
d8d0: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d  ->stmtLast->pStm
d8e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  t);.          pD
d8f0: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44  b->stmtLast = pD
d900: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72  b->stmtLast->pPr
d910: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  ev;.          Tc
d920: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44  l_Free((char*)pD
d930: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65  b->stmtLast->pNe
d940: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xt);.          p
d950: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e  Db->stmtLast->pN
d960: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
d970: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b     pDb->nStmt--;
d980: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d990: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f   }..      /* Pro
d9a0: 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ceed to the next
d9b0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
d9c0: 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74      zSql = zLeft
d9d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
d9e0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a  DecrRefCount(obj
d9f0: 76 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20  v[2]);..    if( 
da00: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66  pRet ){.      if
da10: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
da20: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
da30: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
da40: 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a   pRet);.      }.
da50: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
da60: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
da70: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
da80: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
da90: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
daa0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20  interp);.    }. 
dab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
dac0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
dad0: 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 53   function NAME S
dae0: 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
daf0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
db00: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
db10: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
db20: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
db30: 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69  s.  ** called, i
db40: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
db50: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
db60: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
db70: 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20  se DB_FUNCTION: 
db80: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
db90: 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  Func;.    Tcl_Ob
dba0: 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
dbb0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
dbc0: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
dbd0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
dbe0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
dbf0: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
dc00: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
dc10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
dc20: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
dc30: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
dc40: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
dc50: 30 29 3b 0a 20 20 20 20 70 53 63 72 69 70 74 20  0);.    pScript 
dc60: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 70  = objv[3];.    p
dc70: 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75  Func = findSqlFu
dc80: 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a  nc(pDb, zName);.
dc90: 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30      if( pFunc==0
dca0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
dcb0: 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75  ROR;.    if( pFu
dcc0: 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20  nc->pScript ){. 
dcd0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
dce0: 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
dcf0: 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ript);.    }.   
dd00: 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
dd10: 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54  = pScript;.    T
dd20: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
dd30: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46  pScript);.    pF
dd40: 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76  unc->useEvalObjv
dd50: 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c   = safeToUseEval
dd60: 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63  Objv(interp, pSc
dd70: 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  ript);.    rc = 
dd80: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
dd90: 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  unction(pDb->db,
dda0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
ddb0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
ddc0: 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75   pFunc, tclSqlFu
ddd0: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nc, 0, 0);.    i
dde0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ddf0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
de00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
de10: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
de20: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
de30: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
de40: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
de50: 49 4c 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ILE);.    }else{
de60: 0a 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 66  .      /* Must f
de70: 6c 75 73 68 20 61 6e 79 20 63 61 63 68 65 64 20  lush any cached 
de80: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
de90: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
dea0: 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 7d  he( pDb );.    }
deb0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
dec0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
ded0: 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 44 42 3f  db incrblob ?DB?
dee0: 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f   TABLE COLUMN RO
def0: 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  WID.  */.  case 
df00: 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 20  DB_INCRBLOB: {. 
df10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
df20: 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
df30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
df40: 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
df50: 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20  har *zColumn;.  
df60: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
df70: 52 6f 77 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  Row;..    if( ob
df80: 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36  jc!=5 && objc!=6
df90: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
dfa0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dfb0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 42  p, 2, objv, "?DB
dfc0: 3f 20 54 41 42 4c 45 20 52 4f 57 49 44 22 29 3b  ? TABLE ROWID");
dfd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
dfe0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
dff0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20      if( objc==6 
e000: 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54  ){.      zDb = T
e010: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e020: 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  v[2]);.    }.   
e030: 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
e040: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
e050: 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75  c-3]);.    zColu
e060: 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  mn = Tcl_GetStri
e070: 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29  ng(objv[objc-2])
e080: 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47  ;.    rc = Tcl_G
e090: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
e0a0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62  (interp, objv[ob
e0b0: 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a  jc-1], &iRow);..
e0c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
e0d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
e0e0: 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43   createIncrblobC
e0f0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70  hannel(interp, p
e100: 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c  Db, zDb, zTable,
e110: 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 29 3b   zColumn, iRow);
e120: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
e130: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
e140: 20 20 20 20 20 24 64 62 20 69 6e 74 65 72 72 75       $db interru
e150: 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74  pt.  **.  ** Int
e160: 65 72 72 75 70 74 20 74 68 65 20 65 78 65 63 75  errupt the execu
e170: 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65  tion of the inne
e180: 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72  r-most SQL inter
e190: 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20  preter.  This.  
e1a0: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 53 51  ** causes the SQ
e1b0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  L statement to r
e1c0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f  eturn an error o
e1d0: 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  f SQLITE_INTERRU
e1e0: 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  PT..  */.  case 
e1f0: 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a  DB_INTERRUPT: {.
e200: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65      sqlite3_inte
e210: 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a  rrupt(pDb->db);.
e220: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
e230: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
e240: 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52  b nullvalue ?STR
e250: 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ING?.  **.  ** C
e260: 68 61 6e 67 65 20 74 65 78 74 20 75 73 65 64 20  hange text used 
e270: 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65  when a NULL come
e280: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
e290: 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54  database. If ?ST
e2a0: 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f  RING?.  ** is no
e2b0: 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
e2c0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69  the current stri
e2d0: 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c  ng used for NULL
e2e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
e2f0: 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73 20  ** If STRING is 
e300: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54  present, then ST
e310: 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64  RING is returned
e320: 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61  ..  **.  */.  ca
e330: 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a  se DB_NULLVALUE:
e340: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
e350: 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
e360: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
e370: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e380: 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41  2, objv, "NULLVA
e390: 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  LUE");.      ret
e3a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e3b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
e3c0: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e  c==3 ){.      in
e3d0: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61  t len;.      cha
e3e0: 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47  r *zNull = Tcl_G
e3f0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e400: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
e410: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
e420: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
e430: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e  Tcl_Free(pDb->zN
e440: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
e450: 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26      if( zNull &&
e460: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
e470: 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54    pDb->zNull = T
e480: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
e490: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
e4a0: 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  ncpy(pDb->zNull,
e4b0: 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20   zNull, len);.  
e4c0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
e4d0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
e4e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e4f0: 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
e500: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
e510: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
e520: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
e530: 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a  TextToObj(pDb->z
e540: 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65 61  Null));.    brea
e550: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
e560: 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69  *     $db last_i
e570: 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a  nsert_rowid .  *
e580: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e  *.  ** Return an
e590: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
e5a0: 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20  s the ROWID for 
e5b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
e5c0: 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63  insert..  */.  c
e5d0: 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45  ase DB_LAST_INSE
e5e0: 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20  RT_ROWID: {.    
e5f0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
e600: 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e  ;.    Tcl_WideIn
e610: 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28  t rowid;.    if(
e620: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
e630: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
e640: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
e650: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
e660: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e670: 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64  .    }.    rowid
e680: 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f   = sqlite3_last_
e690: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62  insert_rowid(pDb
e6a0: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75  ->db);.    pResu
e6b0: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
e6c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
e6d0: 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e     Tcl_SetWideIn
e6e0: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f  tObj(pResult, ro
e6f0: 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  wid);.    break;
e700: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
e710: 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  The DB_ONECOLUMN
e720: 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65   method is imple
e730: 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20  mented together 
e740: 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20  with DB_EVAL..  
e750: 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  */..  /*    $db 
e760: 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c  progress ?N CALL
e770: 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a  BACK?.  ** .  **
e780: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
e790: 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79  n callback every
e7a0: 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   N virtual machi
e7b0: 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65  ne opcodes while
e7c0: 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20   executing.  ** 
e7d0: 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
e7e0: 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53  case DB_PROGRESS
e7f0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
e800: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
e810: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
e820: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
e830: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e840: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
e850: 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ss, 0);.      }.
e860: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
e870: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
e880: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
e890: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
e8a0: 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
e8b0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
e8c0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
e8d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
e8e0: 20 26 4e 29 20 29 7b 0a 09 72 65 74 75 72 6e 20   &N) ){..return 
e8f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
e900: 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   };.      if( pD
e910: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
e920: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
e930: 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29  (pDb->zProgress)
e940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e950: 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
e960: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
e970: 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b  (objv[3], &len);
e980: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67  .      if( zProg
e990: 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b  ress && len>0 ){
e9a0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
e9b0: 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c  rogress = Tcl_Al
e9c0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
e9d0: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
e9e0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a  Db->zProgress, z
e9f0: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
ea00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ea10: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
ea20: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
ea30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ea40: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
ea50: 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  K.      if( pDb-
ea60: 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
ea70: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
ea80: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
ea90: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
eaa0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
eab0: 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72  ->db, N, DbProgr
eac0: 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  essHandler, pDb)
ead0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
eae0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
eaf0: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
eb00: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30  pDb->db, 0, 0, 0
eb10: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
eb20: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
eb30: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
eb40: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
eb50: 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b  bjv, "N CALLBACK
eb60: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
eb70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
eb80: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
eb90: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
eba0: 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  ofile ?CALLBACK?
ebb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
ebc0: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
ebd0: 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
ebe0: 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65  ACK routine afte
ebf0: 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
ec00: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68  ment.  ** that h
ec10: 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78  as run.  The tex
ec20: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64  t of the SQL and
ec30: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65   the amount of e
ec40: 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20  lapse time are. 
ec50: 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20   ** appended to 
ec60: 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
ec70: 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75  the script is ru
ec80: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
ec90: 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20  B_PROFILE: {.   
eca0: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
ecb0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
ecc0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
ecd0: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
ece0: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
ecf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ed00: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
ed10: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
ed20: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
ed30: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
ed40: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ed50: 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  p, pDb->zProfile
ed60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
ed70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
ed80: 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20  har *zProfile;. 
ed90: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
eda0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
edb0: 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
edc0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
edd0: 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20  Profile);.      
ede0: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65  }.      zProfile
edf0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
ee00: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
ee10: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
ee20: 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65  ( zProfile && le
ee30: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
ee40: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54  Db->zProfile = T
ee50: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
ee60: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
ee70: 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  cpy(pDb->zProfil
ee80: 65 2c 20 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  e, zProfile);.  
ee90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eea0: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
eeb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
eec0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eed0: 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66  T_TRACE.      if
eee0: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
eef0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
ef00: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
ef10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ef20: 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62  _profile(pDb->db
ef30: 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c  , DbProfileHandl
ef40: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
ef50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
ef60: 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70  qlite3_profile(p
ef70: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
ef80: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
ef90: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
efa0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
efb0: 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a    $db rekey KEY.
efc0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65    **.  ** Change
efd0: 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20   the encryption 
efe0: 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65  key on the curre
eff0: 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61  ntly open databa
f000: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
f010: 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20  DB_REKEY: {.    
f020: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f  int nKey;.    vo
f030: 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66  id *pKey;.    if
f040: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
f050: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f060: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f070: 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20  bjv, "KEY");.   
f080: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f090: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
f0a0: 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
f0b0: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
f0c0: 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23  jv[2], &nKey);.#
f0d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
f0e0: 5f 43 4f 44 45 43 0a 20 20 20 20 72 63 20 3d 20  _CODEC.    rc = 
f0f0: 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44  sqlite3_rekey(pD
f100: 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  b->db, pKey, nKe
f110: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  y);.    if( rc )
f120: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
f130: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f140: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
f150: 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  c), 0);.      rc
f160: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
f170: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
f180: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
f190: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d    **     $db tim
f1a0: 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44  eout MILLESECOND
f1b0: 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61  S.  **.  ** Dela
f1c0: 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  y for the number
f1d0: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
f1e0: 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20   specified when 
f1f0: 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64  a file is locked
f200: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
f210: 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20  _TIMEOUT: {.    
f220: 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20  int ms;.    if( 
f230: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
f240: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f250: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
f260: 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53  v, "MILLISECONDS
f270: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f280: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f290: 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  }.    if( Tcl_Ge
f2a0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
f2b0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73  rp, objv[2], &ms
f2c0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f2d0: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
f2e0: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70  3_busy_timeout(p
f2f0: 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20  Db->db, ms);.   
f300: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20   break;.  }.  . 
f310: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
f320: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20   total_changes. 
f330: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
f340: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
f350: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
f360: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
f370: 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a   or deleted .  *
f380: 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61  * since the data
f390: 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20  base handle was 
f3a0: 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  created..  */.  
f3b0: 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48  case DB_TOTAL_CH
f3c0: 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
f3d0: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
f3e0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
f3f0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
f400: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f410: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
f420: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f430: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f440: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
f450: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f460: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
f470: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
f480: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
f490: 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
f4a0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f4b0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
f4c0: 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ce ?CALLBACK?.  
f4d0: 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
f4e0: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
f4f0: 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
f500: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63   routine for eac
f510: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
f520: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65    ** that is exe
f530: 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74  cuted.  The text
f540: 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61   of the SQL is a
f550: 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
f560: 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  ACK before.  ** 
f570: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
f580: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
f590: 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  RACE: {.    if( 
f5a0: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
f5b0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
f5c0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
f5d0: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
f5e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f5f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
f600: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
f610: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
f620: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
f630: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f640: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
f650: 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20  >zTrace, 0);.   
f660: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f670: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61        char *zTra
f680: 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ce;.      int le
f690: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
f6a0: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
f6b0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
f6c0: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20  ->zTrace);.     
f6d0: 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20   }.      zTrace 
f6e0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f6f0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
f700: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
f710: 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30   zTrace && len>0
f720: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
f730: 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c  >zTrace = Tcl_Al
f740: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
f750: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
f760: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61  Db->zTrace, zTra
f770: 63 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ce);.      }else
f780: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
f790: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
f7a0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f7b0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
f7c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
f7d0: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ce ){.        pD
f7e0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
f7f0: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
f800: 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
f810: 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  b, DbTraceHandle
f820: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
f830: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
f840: 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
f850: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
f860: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
f870: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f880: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
f890: 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72  nsaction [-defer
f8a0: 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d  red|-immediate|-
f8b0: 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50  exclusive] SCRIP
f8c0: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72  T.  **.  ** Star
f8d0: 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
f8e0: 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e  ion (if we are n
f8f0: 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ot already in th
f900: 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a  e midst of a.  *
f910: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61  * transaction) a
f920: 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54  nd execute the T
f930: 43 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54  CL script SCRIPT
f940: 2e 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a  .  After SCRIPT.
f950: 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20    ** completes, 
f960: 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68  either commit th
f970: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
f980: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66   roll it back if
f990: 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72   SCRIPT.  ** thr
f9a0: 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
f9b0: 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20  .  Or if no new 
f9c0: 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73  transation was s
f9d0: 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69  tarted, do nothi
f9e0: 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68  ng..  ** pass th
f9f0: 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75  e exception on u
fa00: 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  p the stack..  *
fa10: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
fa20: 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64  and was inspired
fa30: 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27   by Dave Thomas'
fa40: 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61  s talk on Ruby a
fa50: 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20  t the.  ** 2005 
fa60: 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f  O'Reilly Open So
fa70: 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20  urce Convention 
fa80: 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (OSCON)..  */.  
fa90: 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54  case DB_TRANSACT
faa0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  ION: {.    int i
fab0: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f  nTrans;.    Tcl_
fac0: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20  Obj *pScript;.  
fad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
fae0: 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a  egin = "BEGIN";.
faf0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
fb00: 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
fb10: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
fb20: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
fb30: 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43  objv, "[TYPE] SC
fb40: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
fb50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fb60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
fb70: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70  jc==3 ){.      p
fb80: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d  Script = objv[2]
fb90: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
fba0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
fbb0: 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
fbc0: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
fbd0: 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
fbe0: 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
fbf0: 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
fc00: 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
fc10: 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
fc20: 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
fc30: 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
fc40: 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
fc50: 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
fc60: 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
fc70: 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
fc80: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
fc90: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
fca0: 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
fcb0: 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
fce0: 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
fcf0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fd00: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
fd10: 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
fd20: 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
fd30: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
fd40: 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
fd50: 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
fd60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fd70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
fd80: 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
fd90: 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
fda0: 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
fdb0: 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
fdc0: 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
fdd0: 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
fde0: 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
fdf0: 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
fe00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
fe10: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
fe20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 54 72  ;.    }.    inTr
fe30: 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33 5f 67  ans = !sqlite3_g
fe40: 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44  et_autocommit(pD
fe50: 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  b->db);.    if( 
fe60: 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  !inTrans ){.    
fe70: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
fe80: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42  exec(pDb->db, zB
fe90: 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
fea0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54      }.    rc = T
feb0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
fec0: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
fed0: 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61  ;.    if( !inTra
fee0: 6e 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ns ){.      cons
fef0: 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20  t char *zEnd;.  
ff00: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
ff10: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20  ERROR ){.       
ff20: 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43   zEnd = "ROLLBAC
ff30: 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  K";.      } else
ff40: 20 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20   {.        zEnd 
ff50: 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20  = "COMMIT";.    
ff60: 20 20 7d 0a 20 20 20 20 20 20 28 76 6f 69 64 29    }.      (void)
ff70: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
ff80: 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30  ->db, zEnd, 0, 0
ff90: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
ffa0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
ffb0: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64  .  **    $db upd
ffc0: 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74  ate_hook ?script
ffd0: 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f  ?.  **    $db ro
ffe0: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72  llback_hook ?scr
fff0: 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ipt?.  */.  case
10000 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a   DB_UPDATE_HOOK:
10010 20 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c   .  case DB_ROLL
10020 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20  BACK_HOOK: {..  
10030 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20    /* set ppHook 
10040 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64  to point at pUpd
10050 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c  ateHook or pRoll
10060 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64  backHook, depend
10070 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77  ing on .    ** w
10080 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61  hether [$db upda
10090 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62  te_hook] or [$db
100a0 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20   rollback_hook] 
100b0 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20  was invoked..   
100c0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
100d0 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69  **ppHook; .    i
100e0 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50  f( choice==DB_UP
100f0 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20  DATE_HOOK ){.   
10100 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62     ppHook = &pDb
10110 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20  ->pUpdateHook;. 
10120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10130 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
10140 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20  RollbackHook;.  
10150 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
10160 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
10170 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72  ){.       Tcl_Wr
10180 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10190 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
101a0 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20  RIPT?");.       
101b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
101c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
101d0 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20  *ppHook ){.     
101e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
101f0 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f  t(interp, *ppHoo
10200 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62  k);.      if( ob
10210 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc==3 ){.       
10220 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
10230 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
10240 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b      *ppHook = 0;
10250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10260 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
10270 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10280 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20  !(*ppHook) );.  
10290 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43      if( Tcl_GetC
102a0 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32  harLength(objv[2
102b0 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>0 ){.        
102c0 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32  *ppHook = objv[2
102d0 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  ];.        Tcl_I
102e0 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ncrRefCount(*ppH
102f0 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ook);.      }.  
10300 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
10310 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62  _update_hook(pDb
10320 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64  ->db, (pDb->pUpd
10330 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65  ateHook?DbUpdate
10340 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
10350 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f  ;.    sqlite3_ro
10360 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d  llback_hook(pDb-
10370 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  >db,(pDb->pRollb
10380 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61  ackHook?DbRollba
10390 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62  ckHandler:0),pDb
103a0 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  );..    break;. 
103b0 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
103c0 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a  version.  **.  *
103d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72  * Return the ver
103e0 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20  sion string for 
103f0 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20  this database.. 
10400 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45   */.  case DB_VE
10410 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c  RSION: {.    Tcl
10420 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
10430 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
10440 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c  e3_libversion(),
10450 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
10460 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20    break;.  }... 
10470 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65   } /* End of the
10480 20 53 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e   SWITCH statemen
10490 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  t */.  return rc
104a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c  ;.}../*.**   sql
104b0 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45  ite3 DBNAME FILE
104c0 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65  NAME ?MODE? ?-ke
104d0 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69  y KEY?.**.** Thi
104e0 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63  s is the main Tc
104f0 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e  l command.  When
10500 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54 63   the "sqlite" Tc
10510 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20  l command is.** 
10520 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f  invoked, this ro
10530 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72  utine runs to pr
10540 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61  ocess that comma
10550 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  nd..**.** The fi
10560 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42  rst argument, DB
10570 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69  NAME, is an arbi
10580 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61  trary name for a
10590 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65   new.** database
105a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
105b0 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74  is command creat
105c0 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64  es a new command
105d0 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45   named.** DBNAME
105e0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
105f0 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f   control that co
10600 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64  nnection.  The d
10610 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
10620 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64  ction is deleted
10630 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45   when the DBNAME
10640 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65   command is dele
10650 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
10660 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
10670 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
10680 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
10690 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
106a0 20 73 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   sqlite database
106b0 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 61   that is to be a
106c0 63 63 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  ccessed..**.** F
106d0 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
106e0 73 65 73 2c 20 77 65 20 61 6c 73 6f 20 73 75 70  ses, we also sup
106f0 70 6f 72 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  port the followi
10700 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  ng:.**.**  sqlit
10710 65 33 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a  e3 -encoding.**.
10720 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20  **       Return 
10730 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  the encoding use
10740 64 20 62 79 20 4c 49 4b 45 20 61 6e 64 20 47 4c  d by LIKE and GL
10750 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 43  OB operators.  C
10760 68 6f 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20  hoices.**       
10770 61 72 65 20 55 54 46 2d 38 20 61 6e 64 20 69 73  are UTF-8 and is
10780 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71  o8859..**.**  sq
10790 6c 69 74 65 33 20 2d 76 65 72 73 69 6f 6e 0a 2a  lite3 -version.*
107a0 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72  *.**       Retur
107b0 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  n the version nu
107c0 6d 62 65 72 20 6f 66 20 74 68 65 20 53 51 4c 69  mber of the SQLi
107d0 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a  te library..**.*
107e0 2a 20 20 73 71 6c 69 74 65 33 20 2d 74 63 6c 2d  *  sqlite3 -tcl-
107f0 75 73 65 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20  uses-utf.**.**  
10800 20 20 20 20 20 52 65 74 75 72 6e 20 22 31 22 20       Return "1" 
10810 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  if compiled with
10820 20 61 20 54 63 6c 20 75 73 65 73 20 55 54 46 2d   a Tcl uses UTF-
10830 38 2e 20 20 52 65 74 75 72 6e 20 22 30 22 20 69  8.  Return "0" i
10840 66 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20  f.**       not. 
10850 20 55 73 65 64 20 62 79 20 74 65 73 74 73 20 74   Used by tests t
10860 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
10870 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
10880 69 6c 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 63  iled .**       c
10890 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
108a0 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76  tic int DbMain(v
108b0 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  oid *cd, Tcl_Int
108c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
108d0 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63   objc,Tcl_Obj *c
108e0 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71  onst*objv){.  Sq
108f0 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69  liteDb *p;.  voi
10900 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69  d *pKey = 0;.  i
10910 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63  nt nKey = 0;.  c
10920 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
10930 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
10940 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10950 7a 46 69 6c 65 3b 0a 20 20 54 63 6c 5f 44 53 74  zFile;.  Tcl_DSt
10960 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46  ring translatedF
10970 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6f  ilename;.  if( o
10980 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41  bjc==2 ){.    zA
10990 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
109a0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
109b0 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73  ], 0);.    if( s
109c0 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72  trcmp(zArg,"-ver
109d0 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sion")==0 ){.   
109e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
109f0 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74  ult(interp,sqlit
10a00 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20  e3_version,0);. 
10a10 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10a20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
10a30 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
10a40 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29  has-codec")==0 )
10a50 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
10a60 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
10a70 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10a80 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a  (interp,"1",0);.
10a90 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f  #else.      Tcl_
10aa0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10ab0 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64  erp,"0",0);.#end
10ac0 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
10ad0 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
10ae0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
10af0 67 2c 22 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66  g,"-tcl-uses-utf
10b00 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
10b10 54 43 4c 5f 55 54 46 5f 4d 41 58 0a 20 20 20 20  TCL_UTF_MAX.    
10b20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10b30 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29  lt(interp,"1",0)
10b40 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
10b50 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10b60 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65  nterp,"0",0);.#e
10b70 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
10b80 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
10b90 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
10ba0 35 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a  5 || objc==6 ){.
10bb0 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47      zArg = Tcl_G
10bc0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10bd0 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29  objv[objc-2], 0)
10be0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
10bf0 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30  (zArg,"-key")==0
10c00 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d   ){.      pKey =
10c10 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
10c20 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62  yFromObj(objv[ob
10c30 6a 63 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20  jc-1], &nKey);. 
10c40 20 20 20 20 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a       objc -= 2;.
10c50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10c60 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21  objc!=3 && objc!
10c70 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
10c80 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10c90 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 23 69 66  p, 1, objv, .#if
10ca0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
10cb0 4f 44 45 43 0a 20 20 20 20 20 20 22 48 41 4e 44  ODEC.      "HAND
10cc0 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65  LE FILENAME ?-ke
10cd0 79 20 43 4f 44 45 43 2d 4b 45 59 3f 22 0a 23 65  y CODEC-KEY?".#e
10ce0 6c 73 65 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  lse.      "HANDL
10cf0 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45  E FILENAME ?MODE
10d00 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b  ?".#endif.    );
10d10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10d20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72  ERROR;.  }.  zEr
10d30 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rMsg = 0;.  p = 
10d40 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41  (SqliteDb*)Tcl_A
10d50 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
10d60 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
10d70 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
10d80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c  ult(interp, "mal
10d90 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c  loc failed", TCL
10da0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
10db0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10dc0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
10dd0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
10de0 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
10df0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10e00 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46  bjv[2], 0);.  zF
10e10 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c  ile = Tcl_Transl
10e20 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65  ateFileName(inte
10e30 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e  rp, zFile, &tran
10e40 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
10e50 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  .  sqlite3_open(
10e60 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a  zFile, &p->db);.
10e70 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
10e80 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  e(&translatedFil
10e90 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 51  ename);.  if( SQ
10ea0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
10eb0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20  _errcode(p->db) 
10ec0 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  ){.    zErrMsg =
10ed0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10ee0 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
10ef0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
10f00 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
10f10 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e  (p->db);.    p->
10f20 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64  db = 0;.  }.#ifd
10f30 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
10f40 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65  DEC.  sqlite3_ke
10f50 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e  y(p->db, pKey, n
10f60 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Key);.#endif.  i
10f70 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20  f( p->db==0 ){. 
10f80 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
10f90 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67  (interp, zErrMsg
10fa0 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
10fb0 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
10fc0 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c  har*)p);.    sql
10fd0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
10fe0 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  g);.    return T
10ff0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
11000 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d  p->maxStmt = NUM
11010 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b  _PREPARED_STMTS;
11020 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
11030 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20  nterp;.  zArg = 
11040 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
11050 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
11060 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
11070 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
11080 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c   zArg, DbObjCmd,
11090 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c   (char*)p, DbDel
110a0 65 74 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 49  eteCmd);..  /* I
110b0 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  f compiled with 
110c0 53 51 4c 49 54 45 5f 54 45 53 54 20 74 75 72 6e  SQLITE_TEST turn
110d0 65 64 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67 69  ed on, then regi
110e0 73 74 65 72 20 74 68 65 20 22 6d 64 35 73 75 6d  ster the "md5sum
110f0 22 0a 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63 74  ".  ** SQL funct
11100 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ion..  */.#ifdef
11110 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
11120 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
11130 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71   Md5_Register(sq
11140 6c 69 74 65 33 2a 29 3b 0a 23 69 66 64 65 66 20  lite3*);.#ifdef 
11150 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a  SQLITE_MEMDEBUG.
11160 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 66 61      int mallocfa
11170 69 6c 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d 61  il = sqlite3_iMa
11180 6c 6c 6f 63 46 61 69 6c 3b 0a 20 20 20 20 73 71  llocFail;.    sq
11190 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
111a0 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  l = 0;.#endif.  
111b0 20 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 70    Md5_Register(p
111c0 2d 3e 64 62 29 3b 0a 23 69 66 64 65 66 20 53 51  ->db);.#ifdef SQ
111d0 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20  LITE_MEMDEBUG.  
111e0 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f    sqlite3_iMallo
111f0 63 46 61 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66 61  cFail = mallocfa
11200 69 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  il;.#endif.  }.#
11210 65 6e 64 69 66 20 20 0a 20 20 72 65 74 75 72 6e  endif  .  return
11220 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
11230 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d  * Provide a dumm
11240 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20  y Tcl_InitStubs 
11250 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20  if we are using 
11260 74 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63  this as a static
11270 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  .** library..*/.
11280 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f  #ifndef USE_TCL_
11290 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54  STUBS.# undef  T
112a0 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64  cl_InitStubs.# d
112b0 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74  efine Tcl_InitSt
112c0 75 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  ubs(a,b,c).#endi
112d0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  f../*.** Make su
112e0 72 65 20 77 65 20 68 61 76 65 20 61 20 50 41 43  re we have a PAC
112f0 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63  KAGE_VERSION mac
11300 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69  ro defined.  Thi
11310 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66  s will be.** def
11320 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ined automatical
11330 6c 79 20 62 79 20 74 68 65 20 54 45 41 20 6d 61  ly by the TEA ma
11340 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68  kefile.  But oth
11350 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20  er makefiles.** 
11360 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74  do not define it
11370 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43  ..*/.#ifndef PAC
11380 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64  KAGE_VERSION.# d
11390 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45  efine PACKAGE_VE
113a0 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52  RSION SQLITE_VER
113b0 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  SION.#endif../*.
113c0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
113d0 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a  is module..**.**
113e0 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65   This Tcl module
113f0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61   contains only a
11400 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20   single new Tcl 
11410 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73  command named "s
11420 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63  qlite"..** (Henc
11430 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61  e there is no na
11440 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72 65 20  mespace.  There 
11450 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75  is no point in u
11460 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65  sing a namespace
11470 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e  .** if the exten
11480 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69  sion only suppli
11490 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21  es one new name!
114a0 29 20 20 54 68 65 20 22 73 71 6c 69 74 65 22 20  )  The "sqlite" 
114b0 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73  command is.** us
114c0 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  ed to open a new
114d0 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
114e0 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d 61 69  .  See the DbMai
114f0 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76  n() routine abov
11500 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  e.** for additio
11510 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
11520 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  .*/.EXTERN int S
11530 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
11540 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
11550 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  .  Tcl_InitStubs
11560 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20  (interp, "8.4", 
11570 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
11580 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
11590 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54  p, "sqlite3", (T
115a0 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44  cl_ObjCmdProc*)D
115b0 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  bMain, 0, 0);.  
115c0 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
115d0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
115e0 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
115f0 4e 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  N);.  Tcl_Create
11600 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
11610 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63  p, "sqlite", (Tc
11620 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
11630 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54  Main, 0, 0);.  T
11640 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
11650 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20  terp, "sqlite", 
11660 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
11670 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
11680 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K;.}.EXTERN int 
11690 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28  Tclsqlite3_Init(
116a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
116b0 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
116c0 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
116d0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
116e0 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
116f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11700 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
11710 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
11720 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65   Tclsqlite3_Safe
11730 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
11740 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
11750 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e   TCL_OK; }..#ifn
11760 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46  def SQLITE_3_SUF
11770 46 49 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20  FIX_ONLY.EXTERN 
11780 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28  int Sqlite_Init(
11790 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
117a0 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
117b0 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
117c0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
117d0 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  clsqlite_Init(Tc
117e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
117f0 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
11800 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
11810 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  }.EXTERN int Sql
11820 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  ite_SafeInit(Tcl
11830 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
11840 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
11850 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
11860 6c 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74  lsqlite_SafeInit
11870 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
11880 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
11890 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK; }.#endif..#
118a0 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a  ifdef TCLSH./***
118b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
11900 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c  e code that foll
11910 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62  ows is used to b
11920 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20  uild standalone 
11930 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73  TCL interpreters
11940 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .*/../*.** If th
11950 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
11960 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69   one, then put i
11970 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20  n code this for 
11980 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f  the.** "main" ro
11990 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
119a0 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61  initialize Tcl a
119b0 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72  nd take input fr
119c0 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  om.** standard i
119d0 6e 70 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c  nput..*/.#if TCL
119e0 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61  SH==1.static cha
119f0 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a  r zMainloop[] =.
11a00 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
11a10 22 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f  ".  "while {![eo
11a20 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20  f stdin]} {\n". 
11a30 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c     "if {$line!=\
11a40 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
11a50 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
11a60 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"> \"\n".    "
11a70 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
11a80 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
11a90 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20  ne \"% \"\n".   
11aa0 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73   "}\n".    "flus
11ab0 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20  h stdout\n".    
11ac0 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
11ad0 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
11ae0 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70   "if {[info comp
11af0 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e  lete $line]} {\n
11b00 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61  ".      "if {[ca
11b10 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20  tch {uplevel #0 
11b20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20  $line} result]} 
11b30 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
11b40 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f  ts stderr \"Erro
11b50 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a  r: $result\"\n".
11b60 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20        "} elseif 
11b70 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20  {$result!=\"\"} 
11b80 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
11b90 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20  ts $result\n".  
11ba0 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
11bb0 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
11bc0 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
11bd0 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c  .      "append l
11be0 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22  ine \\n\n".    "
11bf0 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23  }\n".  "}\n".;.#
11c00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
11c10 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20  the macro TCLSH 
11c20 69 73 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74  is two, then get
11c30 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63   the main loop c
11c40 6f 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68  ode out of.** th
11c50 65 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 20  e separate file 
11c60 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68  "spaceanal_tcl.h
11c70 22 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d  "..*/.#if TCLSH=
11c80 3d 32 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  =2.static char z
11c90 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69  Mainloop[] = .#i
11ca0 6e 63 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61  nclude "spaceana
11cb0 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69  l_tcl.h".;.#endi
11cc0 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48  f..#define TCLSH
11cd0 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20  _MAIN main   /* 
11ce0 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f  Needed to fake o
11cf0 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69  ut mktclapp */.i
11d00 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e  nt TCLSH_MAIN(in
11d10 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
11d20 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  rgv){.  Tcl_Inte
11d30 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
11d40 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  l_FindExecutable
11d50 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74  (argv[0]);.  int
11d60 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
11d70 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69  Interp();.  Sqli
11d80 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
11d90 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11da0 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74  TEST.  {.    ext
11db0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
11dc0 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st1_Init(Tcl_Int
11dd0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
11de0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
11df0 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  2_Init(Tcl_Inter
11e00 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
11e10 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f  int Sqlitetest3_
11e20 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
11e30 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
11e40 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e  t Sqlitetest4_In
11e50 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
11e60 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
11e70 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
11e80 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
11e90 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
11ea0 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54  litetest6_Init(T
11eb0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
11ec0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
11ed0 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c  tetest7_Init(Tcl
11ee0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
11ef0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
11f00 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49  test8_Init(Tcl_I
11f10 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
11f20 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
11f30 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st9_Init(Tcl_Int
11f40 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
11f50 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54  n int Md5_Init(T
11f60 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
11f70 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
11f80 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54  tetestsse_Init(T
11f90 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
11fa0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
11fb0 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74  tetestasync_Init
11fc0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
11fd0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
11fe0 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49  litetesttclvar_I
11ff0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
12000 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
12010 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d   Sqlitetestschem
12020 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  a_Init(Tcl_Inter
12030 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
12040 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 61  int Sqlitetest_a
12050 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f  utoext_Init(Tcl_
12060 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
12070 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
12080 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54  est_hexio_Init(T
12090 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20  cl_Interp*);..  
120a0 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e    Sqlitetest1_In
120b0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
120c0 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74  Sqlitetest2_Init
120d0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
120e0 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69  litetest3_Init(i
120f0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
12100 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74  tetest4_Init(int
12110 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
12120 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72  test5_Init(inter
12130 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
12140 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st6_Init(interp)
12150 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
12160 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  7_Init(interp);.
12170 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f      Sqlitetest8_
12180 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
12190 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e    Sqlitetest9_In
121a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
121b0 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f  Sqlitetestasync_
121c0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
121d0 20 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76    Sqlitetesttclv
121e0 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ar_Init(interp);
121f0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73  .    Sqlitetests
12200 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72  chema_Init(inter
12210 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
12220 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28  st_autoext_Init(
12230 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
12240 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e  itetest_hexio_In
12250 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
12260 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Md5_Init(interp)
12270 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
12280 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65  SSE.    Sqlitete
12290 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72  stsse_Init(inter
122a0 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  p);.#endif.  }.#
122b0 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67 63  endif.  if( argc
122c0 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20  >=2 || TCLSH==2 
122d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
122e0 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d    char zArgc[32]
122f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
12300 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
12310 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64  rgc), zArgc, "%d
12320 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48  ", argc-(3-TCLSH
12330 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56  ));.    Tcl_SetV
12340 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22  ar(interp,"argc"
12350 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f  , zArgc, TCL_GLO
12360 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
12370 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
12380 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d  ,"argv0",argv[1]
12390 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59  ,TCL_GLOBAL_ONLY
123a0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
123b0 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c  r(interp,"argv",
123c0 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f   "", TCL_GLOBAL_
123d0 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69  ONLY);.    for(i
123e0 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63  =3-TCLSH; i<argc
123f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
12400 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
12410 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d   "argv", argv[i]
12420 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f  ,.          TCL_
12430 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43  GLOBAL_ONLY | TC
12440 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c  L_LIST_ELEMENT |
12450 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55   TCL_APPEND_VALU
12460 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
12470 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63  ( TCLSH==1 && Tc
12480 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72  l_EvalFile(inter
12490 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c  p, argv[1])!=TCL
124a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  _OK ){.      con
124b0 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d  st char *zInfo =
124c0 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65   Tcl_GetVar(inte
124d0 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c  rp, "errorInfo",
124e0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
124f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  );.      if( zIn
12500 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20  fo==0 ) zInfo = 
12510 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a  interp->result;.
12520 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
12530 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c  derr,"%s: %s\n",
12540 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a   *argv, zInfo);.
12550 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
12560 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
12570 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c 53 48  argc<=1 || TCLSH
12580 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47  ==2 ){.    Tcl_G
12590 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70  lobalEval(interp
125a0 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20  , zMainloop);.  
125b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
125c0 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20  #endif /* TCLSH 
125d0 2a 2f 0a                                         */.