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

Artifact 0906902b96e4b292ba98499dd380e22d3322f817:


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 33 20 32 30 30 37  e.c,v 1.183 2007
0220: 2f 30 35 2f 30 34 20 31 32 3a 30 35 3a 35 36 20  /05/04 12:05:56 
0230: 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20  danielk1977 Exp 
0240: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 74  $.*/.#include "t
0250: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0260: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  errno.h>../*.** 
0270: 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Some additional 
0280: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61 72  include files ar
0290: 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69 73  e needed if this
02a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
02b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
02c0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
02d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
02e0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69  AMALGAMATION.# i
02f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0300: 74 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 22  t.h".# include "
0310: 68 61 73 68 2e 68 22 0a 23 20 69 6e 63 6c 75 64  hash.h".# includ
0320: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 20 69  e <stdlib.h>.# i
0330: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0340: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 61 73 73  >.# include <ass
0350: 65 72 74 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ert.h>.# include
0360: 20 3c 63 74 79 70 65 2e 68 3e 0a 23 65 6e 64 69   <ctype.h>.#endi
0370: 66 0a 0a 2f 2a 0a 20 2a 20 57 69 6e 64 6f 77 73  f../*. * Windows
0380: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
0390: 68 69 63 68 20 73 79 6d 62 6f 6c 73 20 74 6f 20  hich symbols to 
03a0: 65 78 70 6f 72 74 2e 20 20 55 6e 69 78 20 64 6f  export.  Unix do
03b0: 65 73 20 6e 6f 74 2e 0a 20 2a 20 42 55 49 4c 44  es not.. * BUILD
03c0: 5f 73 71 6c 69 74 65 20 73 68 6f 75 6c 64 20 62  _sqlite should b
03d0: 65 20 75 6e 64 65 66 69 6e 65 64 20 66 6f 72 20  e undefined for 
03e0: 55 6e 69 78 2e 0a 20 2a 2f 0a 23 69 66 64 65 66  Unix.. */.#ifdef
03f0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 0a 23 75   BUILD_sqlite.#u
0400: 6e 64 65 66 20 54 43 4c 5f 53 54 4f 52 41 47 45  ndef TCL_STORAGE
0410: 5f 43 4c 41 53 53 0a 23 64 65 66 69 6e 65 20 54  _CLASS.#define T
0420: 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53  CL_STORAGE_CLASS
0430: 20 44 4c 4c 45 58 50 4f 52 54 0a 23 65 6e 64 69   DLLEXPORT.#endi
0440: 66 20 2f 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74  f /* BUILD_sqlit
0450: 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4e 55  e */..#define NU
0460: 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  M_PREPARED_STMTS
0470: 20 31 30 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f   10.#define MAX_
0480: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31  PREPARED_STMTS 1
0490: 30 30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c  00../*.** If TCL
04a0: 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e 64 20   uses UTF-8 and 
04b0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66 69 67  SQLite is config
04c0: 75 72 65 64 20 74 6f 20 75 73 65 20 69 73 6f 38  ured to use iso8
04d0: 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20  859, then we.** 
04e0: 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74 72 61  have to do a tra
04f0: 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f  nslation when go
0500: 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20  ing between the 
0510: 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20 0a 2a  two.  Set the .*
0520: 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f  * UTF_TRANSLATIO
0530: 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f 20 74  N_NEEDED macro t
0540: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
0550: 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a  we need to do.**
0560: 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f   this translatio
0570: 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  n.  .*/.#if defi
0580: 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29  ned(TCL_UTF_MAX)
0590: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
05a0: 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65 66 69  ITE_UTF8).# defi
05b0: 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ne UTF_TRANSLATI
05c0: 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e 64  ON_NEEDED 1.#end
05d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51  if../*.** New SQ
05e0: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  L functions can 
05f0: 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43  be created as TC
0600: 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68  L scripts.  Each
0610: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a   such function.*
0620: 2a 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62  * is described b
0630: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  y an instance of
0640: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0650: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
0660: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 46  edef struct SqlF
0670: 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72  unc SqlFunc;.str
0680: 75 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20  uct SqlFunc {.  
0690: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
06a0: 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  rp;   /* The TCL
06b0: 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78   interpret to ex
06c0: 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69  ecute the functi
06d0: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  on */.  Tcl_Obj 
06e0: 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20 2f 2a  *pScript;     /*
06f0: 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70   The Tcl_Obj rep
0700: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
0710: 68 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69  he script */.  i
0720: 6e 74 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20  nt useEvalObjv; 
0730: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0740: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
0750: 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a  e Tcl_EvalObjv *
0760: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
0780: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
0790: 6f 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20  on */.  SqlFunc 
07a0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a  *pNext;       /*
07b0: 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f   Next function o
07c0: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68  n the list of th
07d0: 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  em all */.};../*
07e0: 0a 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f  .** New collatio
07f0: 6e 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63  n sequences func
0800: 74 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61  tion can be crea
0810: 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70  ted as TCL scrip
0820: 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a  ts.  Each such.*
0830: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65  * function is de
0840: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0850: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0860: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0870: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0880: 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20  ruct SqlCollate 
0890: 53 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75  SqlCollate;.stru
08a0: 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a  ct SqlCollate {.
08b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
08c0: 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54  terp;   /* The T
08d0: 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20  CL interpret to 
08e0: 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63  execute the func
08f0: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
0900: 7a 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20  zScript;        
0910: 2f 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f  /* The script to
0920: 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c   be run */.  Sql
0930: 43 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20  Collate *pNext; 
0940: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
0950: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
0960: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
0970: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  ;../*.** Prepare
0980: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  d statements are
0990: 20 63 61 63 68 65 64 20 66 6f 72 20 66 61 73 74   cached for fast
09a0: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45  er execution.  E
09b0: 61 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  ach prepared.** 
09c0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73  statement is des
09d0: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
09e0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
09f0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0a00: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0a10: 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  uct SqlPreparedS
0a20: 74 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  tmt SqlPreparedS
0a30: 74 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50  tmt;.struct SqlP
0a40: 72 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20  reparedStmt {.  
0a50: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
0a60: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
0a70: 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20   in linked list 
0a80: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
0a90: 53 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a  Stmt *pPrev;  /*
0aa0: 20 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65   Previous on the
0ab0: 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
0ac0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
0ad0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
0ae0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
0af0: 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20  .  int nSql;    
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
0b10: 68 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a  hars in zSql[] *
0b20: 2f 0a 20 20 63 68 61 72 20 7a 53 71 6c 5b 31 5d  /.  char zSql[1]
0b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0b40: 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  Text of the SQL 
0b50: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a  statement */.};.
0b60: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0b70: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
0b80: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 3b  IncrblobChannel;
0b90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ../*.** There is
0ba0: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
0bb0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0bc0: 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20  for each SQLite 
0bd0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74  database.** that
0be0: 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
0bf0: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54   by the SQLite T
0c00: 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  CL interface..*/
0c10: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0c20: 53 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44  SqliteDb SqliteD
0c30: 62 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65  b;.struct Sqlite
0c40: 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db {.  sqlite3 *
0c50: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
0c60: 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22 20    /* The "real" 
0c70: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
0c80: 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52 53  re. MUST BE FIRS
0c90: 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  T */.  Tcl_Inter
0ca0: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20 20  p *interp;      
0cb0: 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72    /* The interpr
0cc0: 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  eter used for th
0cd0: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
0ce0: 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20 20   char *zBusy;   
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0d00: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
0d10: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
0d20: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20  ar *zCommit;    
0d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d40: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c  commit hook call
0d50: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
0d60: 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 20    char *zTrace; 
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0d80: 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62 61  The trace callba
0d90: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0da0: 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20  char *zProfile; 
0db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0dc0: 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61  e profile callba
0dd0: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0de0: 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b  char *zProgress;
0df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0e00: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
0e10: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
0e20: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20 20   char *zAuth;   
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0e40: 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  he authorization
0e50: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0e60: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75  e */.  char *zNu
0e70: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
0e80: 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 73 75 62    /* Text to sub
0e90: 73 74 69 74 75 74 65 20 66 6f 72 20 61 6e 20 53  stitute for an S
0ea0: 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f  QL NULL value */
0eb0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e  .  SqlFunc *pFun
0ec0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
0ed0: 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 66 75 6e   List of SQL fun
0ee0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f  ctions */.  Tcl_
0ef0: 4f 62 6a 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b  Obj *pUpdateHook
0f00: 3b 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;      /* Update
0f10: 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66   hook script (if
0f20: 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f   any) */.  Tcl_O
0f30: 62 6a 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  bj *pRollbackHoo
0f40: 6b 3b 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63  k;    /* Rollbac
0f50: 6b 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69  k hook script (i
0f60: 66 20 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43  f any) */.  SqlC
0f70: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
0f80: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
0f90: 66 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  f SQL collation 
0fa0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
0fb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
0fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
0fd0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74  urn code of most
0fe0: 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
0ff0: 65 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f  exec() */.  Tcl_
1000: 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65  Obj *pCollateNee
1010: 64 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74  ded;   /* Collat
1020: 69 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70  ion needed scrip
1030: 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  t */.  SqlPrepar
1040: 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74  edStmt *stmtList
1050: 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65  ; /* List of pre
1060: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
1070: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
1080: 53 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20  Stmt *stmtLast; 
1090: 2f 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e  /* Last statemen
10a0: 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  t in the list */
10b0: 0a 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20  .  int maxStmt; 
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d0: 20 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75   The next maximu
10e0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74  m number of stmt
10f0: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  List */.  int nS
1100: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1110: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1120: 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  f statements in 
1130: 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 49 6e  stmtList */.  In
1140: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1150: 49 6e 63 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b  Incrblob;/* Link
1160: 65 64 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  ed list of open 
1170: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1180: 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  s */.};..struct 
1190: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
11a0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
11b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
11c0: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
11d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
11f0: 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f  b *pBlob;      /
1200: 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20 68  * sqlite3 blob h
1210: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
1220: 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Seek;           
1230: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1240: 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  seek offset */..
1250: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
1260: 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43  annel;      /* C
1270: 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69 65  hannel identifie
1280: 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r */.  IncrblobC
1290: 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20  hannel *pNext;  
12a0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
12b0: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
12c0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
12d0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
12e0: 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20  el *pPrev;   /* 
12f0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
1300: 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  ll open incrblob
1310: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a   channels */.};.
1320: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
1330: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
1340: 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  ls opened using 
1350: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1360: 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73  ion pDb..** This
1370: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1380: 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68  shutting down th
1390: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
13b0: 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62   void closeIncrb
13c0: 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69  lobChannels(Sqli
13d0: 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e  teDb *pDb){.  In
13e0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
13f0: 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  ;.  IncrblobChan
1400: 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66  nel *pNext;..  f
1410: 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62  or(p=pDb->pIncrb
1420: 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  lob; p; p=pNext)
1430: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
1440: 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  >pNext;..    /* 
1450: 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e  Note: Calling un
1460: 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61  register here ca
1470: 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20  ll Tcl_Close on 
1480: 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  the incrblob cha
1490: 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77 68  nnel, .    ** wh
14a0: 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65 20  ich deletes the 
14b0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
14c0: 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e  structure at *p.
14d0: 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   So do not.    *
14e0: 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28  * call Tcl_Free(
14f0: 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ) here..    */. 
1500: 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65     Tcl_Unregiste
1510: 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e  rChannel(pDb->in
1520: 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c  terp, p->channel
1530: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1540: 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65  Close an increme
1550: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1560: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1570: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43   incrblobClose(C
1580: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1590: 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ceData, Tcl_Inte
15a0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49  rp *interp){.  I
15b0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
15c0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
15d0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
15e0: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ata;.  int rc = 
15f0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
1600: 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  se(p->pBlob);.  
1610: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1620: 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  >pDb->db;..  /* 
1630: 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e  Remove the chann
1640: 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69  el from the Sqli
1650: 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c  teDb.pIncrblob l
1660: 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ist. */.  if( p-
1670: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
1680: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1690: 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
16a0: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
16b0: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
16c0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
16d0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62    }.  if( p->pDb
16e0: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29  ->pIncrblob==p )
16f0: 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49  {.    p->pDb->pI
1700: 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65  ncrblob = p->pNe
1710: 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72  xt;.  }..  /* Fr
1720: 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43  ee the IncrblobC
1730: 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65  hannel structure
1740: 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28   */.  Tcl_Free((
1750: 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66  char *)p);..  if
1760: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1770: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
1780: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1790: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
17a0: 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  msg(db), TCL_VOL
17b0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
17c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17d0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
17e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  K;.}../*.** Read
17f0: 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e   data from an in
1800: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1810: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1820: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e  c int incrblobIn
1830: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
1840: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
1850: 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  .  char *buf, . 
1860: 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20   int bufSize,.  
1870: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1880: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1890: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
18a0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
18b0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
18c0: 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69  nt nRead = bufSi
18d0: 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ze;         /* N
18e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
18f0: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1900: 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  nBlob;          
1910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1920: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  l size of the bl
1930: 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ob */.  int rc; 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65       /* sqlite e
1960: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  rror code */..  
1970: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
1980: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
1990: 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  lob);.  if( (p->
19a0: 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c  iSeek+nRead)>nBl
19b0: 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20  ob ){.    nRead 
19c0: 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b  = nBlob-p->iSeek
19d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61  ;.  }.  if( nRea
19e0: 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d<=0 ){.    retu
19f0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  rn 0;.  }..  rc 
1a00: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
1a10: 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76  ead(p->pBlob, (v
1a20: 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64  oid *)buf, nRead
1a30: 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69  , p->iSeek);.  i
1a40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a50: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
1a60: 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20  dePtr = rc;.    
1a70: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
1a80: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52    p->iSeek += nR
1a90: 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52  ead;.  return nR
1aa0: 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ead;.}../*.** Wr
1ab0: 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69  ite data to an i
1ac0: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
1ad0: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
1ae0: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 4f  ic int incrblobO
1af0: 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44  utput(.  ClientD
1b00: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
1b10: 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72 20  , .  CONST char 
1b20: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f 57  *buf, .  int toW
1b30: 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  rite,.  int *err
1b40: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
1b50: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1b60: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
1b70: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1b80: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ata;.  int nWrit
1b90: 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20 20  e = toWrite;    
1ba0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bb0: 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
1bc0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20  */.  int nBlob; 
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
1bf0: 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20  of the blob */. 
1c00: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c20: 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
1c30: 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d  de */..  nBlob =
1c40: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
1c50: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  tes(p->pBlob);. 
1c60: 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e   if( (p->iSeek+n
1c70: 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a  Write)>nBlob ){.
1c80: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
1c90: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20  r = EINVAL;.    
1ca0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
1cb0: 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29   if( nWrite<=0 )
1cc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1cd0: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
1ce0: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70  te3_blob_write(p
1cf0: 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a  ->pBlob, (void *
1d00: 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d  )buf, nWrite, p-
1d10: 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72  >iSeek);.  if( r
1d20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d30: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
1d40: 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65 74  r = EIO;.    ret
1d50: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70  urn -1;.  }..  p
1d60: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74  ->iSeek += nWrit
1d70: 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72 69  e;.  return nWri
1d80: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  te;.}../*.** See
1d90: 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  k an incremental
1da0: 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a   blob channel..*
1db0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1dc0: 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69  rblobSeek(.  Cli
1dd0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
1de0: 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66  Data, .  long of
1df0: 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b  fset,.  int seek
1e00: 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Mode,.  int *err
1e10: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
1e20: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1e30: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
1e40: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1e50: 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ata;..  switch( 
1e60: 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20  seekMode ){.    
1e70: 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20  case SEEK_SET:. 
1e80: 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20       p->iSeek = 
1e90: 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72  offset;.      br
1ea0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45  eak;.    case SE
1eb0: 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70 2d  EK_CUR:.      p-
1ec0: 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74  >iSeek += offset
1ed0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ee0: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e 44     case SEEK_END
1ef0: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
1f00: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1f10: 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20  bytes(p->pBlob) 
1f20: 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  + offset;.      
1f30: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
1f40: 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42 61  ult: assert(!"Ba
1f50: 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20  d seekMode");.  
1f60: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69  }..  return p->i
1f70: 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  Seek;.}...static
1f80: 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57 61   void incrblobWa
1f90: 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20 69  tch(ClientData i
1fa0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
1fb0: 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f   mode){ .  /* NO
1fc0: 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69 63  -OP */ .}.static
1fd0: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61 6e   int incrblobHan
1fe0: 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  dle(ClientData i
1ff0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
2000: 20 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74 61   dir, ClientData
2010: 20 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75 72   *hPtr){.  retur
2020: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
2030: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e  static Tcl_Chann
2040: 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43  elType IncrblobC
2050: 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20  hannelType = {. 
2060: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20      /* typeName 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
20b0: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
20c0: 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20  SION_2,         
20d0: 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20      /* version  
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2100: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20   incrblobClose, 
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63      /* closeProc
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2150: 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20   incrblobInput, 
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63      /* inputProc
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
21a0: 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c   incrblobOutput,
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f      /* outputPro
21d0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
21f0: 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20   incrblobSeek,  
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20      /* seekProc 
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2240: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e      /* setOption
2270: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2280: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2290: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e      /* getOption
22c0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
22e0: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20   incrblobWatch, 
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63      /* watchProc
2310: 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f   (this is a no-o
2320: 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  p)          */. 
2330: 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c   incrblobHandle,
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65      /* getHandle
2360: 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74  Proc (always ret
2370: 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20  urns error) */. 
2380: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f      /* close2Pro
23b0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
23d0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65      /* blockMode
2400: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2410: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2420: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63      /* flushProc
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2470: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72      /* handlerPr
24a0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
24c0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50      /* wideSeekP
24f0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2500: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2510: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 20 20 20 2f 2a 20 74 68 72 65 61 64 41 63 74      /* threadAct
2540: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
2550: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d              */.}
2560: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ;../*.** Create 
2570: 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63  a new incrblob c
2580: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
2590: 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72  c int createIncr
25a0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54  blobChannel(.  T
25b0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
25c0: 70 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  p, .  SqliteDb *
25d0: 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  pDb, .  const ch
25e0: 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74  ar *zDb,.  const
25f0: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20 0a   char *zTable, .
2600: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
2610: 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74 65  olumn, .  sqlite
2620: 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20 69  _int64 iRow,.  i
2630: 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b  nt isReadonly.){
2640: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
2650: 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  el *p;.  sqlite3
2660: 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a   *db = pDb->db;.
2670: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
2680: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pBlob;.  int rc;
2690: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54  .  int flags = T
26a0: 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73 52  CL_READABLE|(isR
26b0: 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43  eadonly ? 0 : TC
26c0: 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20  L_WRITABLE);..  
26d0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  /* This variable
26e0: 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d 65   is used to name
26f0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22   the channels: "
2700: 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63  incrblob_[incr c
2710: 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74  ount]" */.  stat
2720: 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30  ic int count = 0
2730: 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e 65  ;.  char zChanne
2740: 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73  l[64];..  rc = s
2750: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
2760: 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  (db, zDb, zTable
2770: 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c  , zColumn, iRow,
2780: 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70   !isReadonly, &p
2790: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63 21  Blob);.  if( rc!
27a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27b0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
27c0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
27d0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
27e0: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
27f0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
2800: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2810: 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62 6c  }..  p = (Incrbl
2820: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f  obChannel *)Tcl_
2830: 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63  Alloc(sizeof(Inc
2840: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a  rblobChannel));.
2850: 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a    p->iSeek = 0;.
2860: 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c    p->pBlob = pBl
2870: 6f 62 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a  ob;..  sprintf(z
2880: 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c  Channel, "incrbl
2890: 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29  ob_%d", ++count)
28a0: 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d  ;.  p->channel =
28b0: 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e   Tcl_CreateChann
28c0: 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e  el(&IncrblobChan
28d0: 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65  nelType, zChanne
28e0: 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  l, p, flags);.  
28f0: 54 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e  Tcl_RegisterChan
2900: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63  nel(interp, p->c
2910: 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c  hannel);..  /* L
2920: 69 6e 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e  ink the new chan
2930: 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c  nel into the Sql
2940: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
2950: 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e  list. */.  p->pN
2960: 65 78 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72  ext = pDb->pIncr
2970: 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76  blob;.  p->pPrev
2980: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70   = 0;.  if( p->p
2990: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
29a0: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
29b0: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63  .  }.  pDb->pInc
29c0: 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e  rblob = p;.  p->
29d0: 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63  pDb = pDb;..  Tc
29e0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
29f0: 72 70 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f  rp, (char *)Tcl_
2a00: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70  GetChannelName(p
2a10: 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f  ->channel), TCL_
2a20: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74  VOLATILE);.  ret
2a30: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65  *.** Look at the
2a50: 20 73 63 72 69 70 74 20 70 72 65 66 69 78 20 69   script prefix i
2a60: 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c  n pCmd.  We will
2a70: 20 62 65 20 65 78 65 63 75 74 69 6e 67 20 74 68   be executing th
2a80: 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74  is script.** aft
2a90: 65 72 20 66 69 72 73 74 20 61 70 70 65 6e 64 69  er first appendi
2aa0: 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61  ng one or more a
2ab0: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20  rguments.  This 
2ac0: 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
2ad0: 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20 74  .** the script t
2ae0: 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20 73  o see if it is s
2af0: 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45  afe to use Tcl_E
2b00: 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65  valObjv() on the
2b10: 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65   script.** rathe
2b20: 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20  r than the more 
2b30: 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c  general Tcl_Eval
2b40: 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f  Ex().  Tcl_EvalO
2b50: 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a  bjv() is much.**
2b60: 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53   faster..**.** S
2b70: 63 72 69 70 74 73 20 74 68 61 74 20 61 72 65 20  cripts that are 
2b80: 73 61 66 65 20 74 6f 20 75 73 65 20 77 69 74 68  safe to use with
2b90: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
2ba0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
2bb0: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f   command name fo
2bc0: 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f  llowed by zero o
2bd0: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
2be0: 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f   with no [...] o
2bf0: 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20  r $.** or {...} 
2c00: 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20  or ; to be seen 
2c10: 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20  anywhere.  Most 
2c20: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73  callback scripts
2c30: 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a   consist.** of j
2c40: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  ust a single pro
2c50: 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20  cedure name and 
2c60: 74 68 65 79 20 6d 65 65 74 20 74 68 69 73 20 72  they meet this r
2c70: 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  equirement..*/.s
2c80: 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f  tatic int safeTo
2c90: 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f  UseEvalObjv(Tcl_
2ca0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2cb0: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a  Tcl_Obj *pCmd){.
2cc0: 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72    /* We could tr
2cd0: 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  y to do somethin
2ce0: 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65  g with Tcl_Parse
2cf0: 28 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  ().  But we will
2d00: 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75   instead.  ** ju
2d10: 73 74 20 64 6f 20 61 20 73 65 61 72 63 68 20 66  st do a search f
2d20: 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61  or forbidden cha
2d30: 72 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79  racters.  If any
2d40: 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64 65   of the forbidde
2d50: 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72  n.  ** character
2d60: 73 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64  s appear in pCmd
2d70: 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74  , we will report
2d80: 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 75   the string as u
2d90: 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f  nsafe..  */.  co
2da0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
2db0: 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f  nt n;.  z = Tcl_
2dc0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
2dd0: 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68  (pCmd, &n);.  wh
2de0: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
2df0: 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b      int c = *(z+
2e00: 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  +);.    if( c=='
2e10: 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20  $' || c=='[' || 
2e20: 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20  c==';' ) return 
2e30: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
2e40: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  1;.}../*.** Find
2e50: 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75   an SqlFunc stru
2e60: 63 74 75 72 65 20 77 69 74 68 20 74 68 65 20 67  cture with the g
2e70: 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63  iven name.  Or c
2e80: 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f  reate a new.** o
2e90: 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ne if an existin
2ea0: 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20  g one cannot be 
2eb0: 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61  found.  Return a
2ec0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
2ed0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
2ee0: 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20  .static SqlFunc 
2ef0: 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c  *findSqlFunc(Sql
2f00: 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73  iteDb *pDb, cons
2f10: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
2f20: 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70    SqlFunc *p, *p
2f30: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
2f40: 70 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a  pNew = (SqlFunc*
2f50: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
2f60: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c  of(*pNew) + strl
2f70: 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b  en(zName) + 1 );
2f80: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d  .  pNew->zName =
2f90: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
2fa0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
2fb0: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65  me[i]; i++){ pNe
2fc0: 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f  w->zName[i] = to
2fd0: 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b  lower(zName[i]);
2fe0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65   }.  pNew->zName
2ff0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  [i] = 0;.  for(p
3000: 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20  =pDb->pFunc; p; 
3010: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20  p=p->pNext){ .  
3020: 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e    if( strcmp(p->
3030: 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61  zName, pNew->zNa
3040: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
3050: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
3060: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74  pNew);.      ret
3070: 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn p;.    }.  }
3080: 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20  .  pNew->interp 
3090: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  = pDb->interp;. 
30a0: 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d   pNew->pScript =
30b0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   0;.  pNew->pNex
30c0: 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  t = pDb->pFunc;.
30d0: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
30e0: 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  New;.  return pN
30f0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  ew;.}../*.** Fin
3100: 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61  alize and free a
3110: 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65   list of prepare
3120: 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a  d statements.*/.
3130: 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73  static void flus
3140: 68 53 74 6d 74 43 61 63 68 65 28 20 53 71 6c 69  hStmtCache( Sqli
3150: 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20 20 53  teDb *pDb ){.  S
3160: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
3170: 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69  pPreStmt;..  whi
3180: 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69  le(  pDb->stmtLi
3190: 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
31a0: 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d  3_finalize( pDb-
31b0: 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74  >stmtList->pStmt
31c0: 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74   );.    pPreStmt
31d0: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
31e0: 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c  ;.    pDb->stmtL
31f0: 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ist = pDb->stmtL
3200: 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
3210: 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61 72 2a  Tcl_Free( (char*
3220: 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d  )pPreStmt );.  }
3230: 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20  .  pDb->nStmt = 
3240: 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61  0;.  pDb->stmtLa
3250: 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  st = 0;.}../*.**
3260: 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20   TCL calls this 
3270: 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61  procedure when a
3280: 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62 61  n sqlite3 databa
3290: 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  se command is.**
32a0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
32b0: 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74  tic void DbDelet
32c0: 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a  eCmd(void *db){.
32d0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
32e0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b  = (SqliteDb*)db;
32f0: 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68  .  flushStmtCach
3300: 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49  e(pDb);.  closeI
3310: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
3320: 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pDb);.  sqlite3_
3330: 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a  close(pDb->db);.
3340: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46    while( pDb->pF
3350: 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75  unc ){.    SqlFu
3360: 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d  nc *pFunc = pDb-
3370: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d  >pFunc;.    pDb-
3380: 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e  >pFunc = pFunc->
3390: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44  pNext;.    Tcl_D
33a0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
33b0: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
33c0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
33d0: 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77  )pFunc);.  }.  w
33e0: 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c  hile( pDb->pColl
33f0: 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f  ate ){.    SqlCo
3400: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20  llate *pCollate 
3410: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
3420: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
3430: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  te = pCollate->p
3440: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
3450: 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61  ee((char*)pColla
3460: 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  te);.  }.  if( p
3470: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
3480: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3490: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
34a0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
34b0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
34c0: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
34d0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
34e0: 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  le ){.    Tcl_Fr
34f0: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
3500: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3510: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
3520: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
3530: 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
3540: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
3550: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3560: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Null);.  }.  if(
3570: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
3580: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
3590: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
35a0: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d  UpdateHook);.  }
35b0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c  .  if( pDb->pRol
35c0: 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20  lbackHook ){.   
35d0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
35e0: 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  t(pDb->pRollback
35f0: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3600: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
3610: 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f  eded ){.    Tcl_
3620: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
3630: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
3640: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65  );.  }.  Tcl_Fre
3650: 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d  e((char*)pDb);.}
3660: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3670: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3680: 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  hen a database f
3690: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68  ile is locked wh
36a0: 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
36b0: 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f   execute SQL..*/
36c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75  .static int DbBu
36d0: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
36e0: 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b  cd, int nTries){
36f0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3700: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
3710: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
3720: 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20  ar zVal[30];..  
3730: 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22 25  sprintf(zVal, "%
3740: 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72  d", nTries);.  r
3750: 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28  c = Tcl_VarEval(
3760: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
3770: 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56  ->zBusy, " ", zV
3780: 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  al, (char*)0);. 
3790: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
37a0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
37b0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
37c0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
37d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
37e0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
37f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3800: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74   is invoked as t
3810: 68 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c  he 'progress cal
3820: 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64  lback' for the d
3830: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
3840: 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73  ic int DbProgres
3850: 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  sHandler(void *c
3860: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
3870: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3880: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
3890: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a    assert( pDb->z
38a0: 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63  Progress );.  rc
38b0: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
38c0: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  >interp, pDb->zP
38d0: 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20  rogress);.  if( 
38e0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
38f0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
3900: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
3910: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
3920: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
3930: 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 0;.}..#ifndef
3940: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
3950: 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CE./*.** This ro
3960: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3970: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 74 72  by the SQLite tr
3980: 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  ace handler when
3990: 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c  ever a new.** bl
39a0: 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78  ock of SQL is ex
39b0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c  ecuted.  The TCL
39c0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
39d0: 7a 54 72 61 63 65 20 69 73 20 65 78 65 63 75 74  zTrace is execut
39e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
39f0: 69 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  id DbTraceHandle
3a00: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
3a10: 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
3a20: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
3a30: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
3a40: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
3a50: 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r;..  Tcl_DStrin
3a60: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
3a70: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
3a80: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61  (&str, pDb->zTra
3a90: 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  ce, -1);.  Tcl_D
3aa0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
3ab0: 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b  ent(&str, zSql);
3ac0: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
3ad0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
3ae0: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
3af0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
3b00: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
3b10: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
3b20: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  ->interp);.}.#en
3b30: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
3b40: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
3b50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3b60: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
3b70: 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c  he SQLite profil
3b80: 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20  e handler after 
3b90: 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53  a statement.** S
3ba0: 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64 2e  QL has executed.
3bb0: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
3bc0: 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c   in pDb->zProfil
3bd0: 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  e is evaluated..
3be0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
3bf0: 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28  bProfileHandler(
3c00: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
3c10: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69  char *zSql, sqli
3c20: 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20  te_uint64 tm){. 
3c30: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
3c40: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
3c50: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
3c60: 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30  r;.  char zTm[10
3c70: 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  0];..  sqlite3_s
3c80: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
3c90: 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c  Tm)-1, zTm, "%ll
3ca0: 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44  d", tm);.  Tcl_D
3cb0: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
3cc0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
3cd0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
3ce0: 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a  >zProfile, -1);.
3cf0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
3d00: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
3d10: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53   zSql);.  Tcl_DS
3d20: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
3d30: 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20  nt(&str, zTm);. 
3d40: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
3d50: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
3d60: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
3d70: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
3d80: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
3d90: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
3da0: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
3db0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
3dc0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3dd0: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
3de0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
3df0: 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72    The.** TCL scr
3e00: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d  ipt in pDb->zCom
3e10: 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  mit is executed.
3e20: 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20    If it returns 
3e30: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69  non-zero or.** i
3e40: 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65  f it throws an e
3e50: 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72  xception, the tr
3e60: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
3e70: 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64  led back instead
3e80: 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d  .** of being com
3e90: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mitted..*/.stati
3ea0: 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61  c int DbCommitHa
3eb0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
3ec0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
3ed0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
3ee0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
3ef0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
3f00: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
3f10: 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
3f20: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
3f30: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
3f40: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
3f50: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
3f60: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
3f70: 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n 0;.}..static v
3f80: 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61  oid DbRollbackHa
3f90: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65  ndler(void *clie
3fa0: 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74  ntData){.  Sqlit
3fb0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
3fc0: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
3fd0: 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e  ;.  assert(pDb->
3fe0: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
3ff0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
4000: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
4010: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52  >interp, pDb->pR
4020: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20  ollbackHook, 0) 
4030: 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67  ){.    Tcl_Backg
4040: 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e  roundError(pDb->
4050: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  interp);.  }.}..
4060: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70  static void DbUp
4070: 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76  dateHandler(.  v
4080: 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f  oid *p, .  int o
4090: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
40a0: 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *zDb, .  const c
40b0: 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71  har *zTbl, .  sq
40c0: 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64  lite_int64 rowid
40d0: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
40e0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
40f0: 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  *)p;.  Tcl_Obj *
4100: 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pCmd;..  assert(
4110: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
4120: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  k );.  assert( o
4130: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  p==SQLITE_INSERT
4140: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55   || op==SQLITE_U
4150: 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c  PDATE || op==SQL
4160: 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20  ITE_DELETE );.. 
4170: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c   pCmd = Tcl_Dupl
4180: 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55  icateObj(pDb->pU
4190: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63  pdateHook);.  Tc
41a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
41b0: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
41c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
41d0: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
41e0: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20  wStringObj(.    
41f0: 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  ( (op==SQLITE_IN
4200: 53 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28  SERT)?"INSERT":(
4210: 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54  op==SQLITE_UPDAT
4220: 45 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c  E)?"UPDATE":"DEL
4230: 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54  ETE"), -1));.  T
4240: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4250: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
4260: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4270: 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54  j(zDb, -1));.  T
4280: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4290: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
42a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
42b0: 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20  j(zTbl, -1));.  
42c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
42d0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
42e0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
42f0: 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54  Obj(rowid));.  T
4300: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
4310: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
4320: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
4330: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
4340: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
4350: 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  d(.  void *pCtx,
4360: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
4370: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e    int enc,.  con
4380: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
4390: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
43a0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
43b0: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
43c0: 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  *pScript = Tcl_D
43d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
43e0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
43f0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
4400: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
4410: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4420: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
4430: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
4440: 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31  ingObj(zName, -1
4450: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
4460: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
4470: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
4480: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4490: 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a  (pScript);.}../*
44a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
44b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
44c0: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f  aluate an SQL co
44d0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
44e0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
44f0: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
4500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4510: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20  tclSqlCollate(. 
4520: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
4530: 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nA,.  const v
4540: 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
4550: 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  B,.  const void 
4560: 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c  *zB.){.  SqlColl
4570: 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c  ate *p = (SqlCol
4580: 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54  late *)pCtx;.  T
4590: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
45a0: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53   pCmd = Tcl_NewS
45b0: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72  tringObj(p->zScr
45c0: 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ipt, -1);.  Tcl_
45d0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
45e0: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
45f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
4600: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
4610: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4620: 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c  (zA, nA));.  Tcl
4630: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4640: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
4650: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
4660: 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29  ringObj(zB, nB))
4670: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
4680: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
4690: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
46a0: 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
46b0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
46c0: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
46d0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
46e0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
46f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4700: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4710: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
4720: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
4730: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
4740: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
4750: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
4760: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
4770: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
4780: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
4790: 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b  e3_value**argv){
47a0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20  .  SqlFunc *p = 
47b0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
47c0: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63  a(context);.  Tc
47d0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69  l_Obj *pCmd;.  i
47e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
47f0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
4800: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
4810: 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e  e are no argumen
4820: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
4830: 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  on, call Tcl_Eva
4840: 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20  lObjEx on the.  
4850: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
4860: 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ct directly.  Th
4870: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43  is allows the TC
4880: 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65  L compiler to ge
4890: 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79  nerate.    ** by
48a0: 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63  tecode for the c
48b0: 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69  ommand on the fi
48c0: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
48d0: 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20  nd thus make.   
48e0: 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69   ** subsequent i
48f0: 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20  nvocations much 
4900: 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70  faster. */.    p
4910: 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74  Cmd = p->pScript
4920: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
4930: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4940: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
4950: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
4960: 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63  pCmd, 0);.    Tc
4970: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
4980: 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
4990: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
49a0: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  re arguments to 
49b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  the function, ma
49c0: 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70  ke a shallow cop
49d0: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
49e0: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c  script object, l
49f0: 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d  append the argum
4a00: 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75  ents, then evalu
4a10: 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ate the copy..  
4a20: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22    **.    ** By "
4a30: 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77  shallow" copy, w
4a40: 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68  e mean a only th
4a50: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
4a60: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
4a70: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
4a80: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
4a90: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
4aa0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
4ab0: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
4ac0: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
4ad0: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
4ae0: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
4af0: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
4b00: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
4b10: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
4b20: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
4b30: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
4b40: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
4b50: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
4b60: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
4b70: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
4b80: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
4b90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
4ba0: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
4bb0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
4bc0: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
4bd0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
4be0: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
4bf0: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
4c00: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
4c10: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
4c20: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
4c30: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
4c40: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
4c50: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
4c60: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
4c70: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
4c80: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
4c90: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4ca0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
4cb0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
4cc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
4cd0: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
4ce0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
4cf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
4d00: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
4d10: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
4d20: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
4d30: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
4d40: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
4d50: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
4d60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
4d70: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
4d80: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
4d90: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
4da0: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
4db0: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
4dc0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
4dd0: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
4de0: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
4df0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
4e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4e10: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
4e20: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
4e30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4e40: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
4e50: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
4e60: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
4e70: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
4e80: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
4e90: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
4ea0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
4eb0: 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  wIntObj(v);.    
4ec0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4ed0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
4ee0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
4ef0: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
4f00: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
4f10: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4f20: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
4f30: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
4f40: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
4f50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
4f60: 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  ble(pIn);.      
4f70: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
4f80: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a  ewDoubleObj(r);.
4f90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4fa0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4fb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
4fc0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
4fd0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
4fe0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b  tringObj("", 0);
4ff0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5000: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5010: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5020: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
5030: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
5040: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
5050: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
5060: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5070: 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  ((char *)sqlite3
5080: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29  _value_text(pIn)
5090: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
50a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
50b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
50c0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74     rc = Tcl_List
50d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
50e0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
50f0: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  , pVal);.      i
5100: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
5110: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5120: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20  t(pCmd);.       
5130: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5140: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
5150: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
5160: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
5170: 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74  1); .        ret
5180: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
5190: 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75   }.    if( !p->u
51a0: 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20  seEvalObjv ){.  
51b0: 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f      /* Tcl_EvalO
51c0: 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f  bjEx() will auto
51d0: 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54  matically call T
51e0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66  cl_EvalObjv() if
51f0: 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69   pCmd.      ** i
5200: 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74  s a list without
5210: 20 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73   a string repres
5220: 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72  entation.  To pr
5230: 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a  event this from.
5240: 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69        ** happeni
5250: 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43  ng, make sure pC
5260: 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73  md has a valid s
5270: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
5280: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63  tion */.      Tc
5290: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64  l_GetString(pCmd
52a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
52b0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
52c0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
52d0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
52e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
52f0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5300: 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20   }..  if( rc && 
5310: 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29  rc!=TCL_RETURN )
5320: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
5330: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5340: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
5350: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
5360: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73  p), -1); .  }els
5370: 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  e{.    Tcl_Obj *
5380: 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62  pVar = Tcl_GetOb
5390: 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  jResult(p->inter
53a0: 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  p);.    int n;. 
53b0: 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20     u8 *data;.   
53c0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70   char *zType = p
53d0: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
53e0: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
53f0: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61  me : "";.    cha
5400: 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a  r c = zType[0];.
5410: 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26      if( c=='b' &
5420: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
5430: 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26  bytearray")==0 &
5440: 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30  & pVar->bytes==0
5450: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   ){.      /* Onl
5460: 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20  y return a BLOB 
5470: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
5480: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
5490: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
54a0: 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69    ** has no stri
54b0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
54c0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61  n. */.      data
54d0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
54e0: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
54f0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
5500: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
5510: 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e  context, data, n
5520: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5530: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
5540: 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74  f( (c=='b' && st
5550: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
5560: 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  ean")==0) ||.   
5570: 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26         (c=='i' &
5580: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
5590: 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20  int")==0) ){.   
55a0: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
55b0: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e  mObj(0, pVar, &n
55c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
55d0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
55e0: 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  ext, n);.    }el
55f0: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
5600: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
5610: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
5620: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
5630: 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c      Tcl_GetDoubl
5640: 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72  eFromObj(0, pVar
5650: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &r);.      sql
5660: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
5670: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a  le(context, r);.
5680: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
5690: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
56a0: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
56b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
56c0: 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20  WideInt v;.     
56d0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
56e0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
56f0: 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &v);.      sqlit
5700: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
5710: 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20  context, v);.   
5720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61   }else{.      da
5730: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
5740: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
5750: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
5760: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
5770: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5780: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a  context, (char *
5790: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
57a0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
57b0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
57c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
57d0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  THORIZATION./*.*
57e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75  * This is the au
57f0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e  thentication fun
5800: 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e  ction.  It appen
5810: 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  ds the authentic
5820: 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f  ation.** type co
5830: 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61  de and the two a
5840: 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64  rguments to zCmd
5850: 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20  [] then invokes 
5860: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e  the result.** on
5870: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
5880: 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20  .  The reply is 
5890: 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65  examined to dete
58a0: 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20  rmine if the.** 
58b0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
58c0: 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73  ails or succeeds
58d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
58e0: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  auth_callback(. 
58f0: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
5900: 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74  nt code,.  const
5910: 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20   char *zArg1,.  
5920: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
5930: 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2,.  const char 
5940: 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20  *zArg3,.  const 
5950: 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20  char *zArg4.){. 
5960: 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20   char *zCode;.  
5970: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
5980: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
5990: 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b  st char *zReply;
59a0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
59b0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41   = (SqliteDb*)pA
59c0: 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63  rg;..  switch( c
59d0: 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
59e0: 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20  SQLITE_COPY     
59f0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
5a00: 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20  ="SQLITE_COPY"; 
5a10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5a20: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
5a30: 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  DEX      : zCode
5a40: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5a50: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
5a60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5a70: 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20  REATE_TABLE     
5a80: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5a90: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20  _CREATE_TABLE"; 
5aa0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5ab0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5ac0: 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65  MP_INDEX : zCode
5ad0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5ae0: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
5af0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5b00: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5b10: 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53  TABLE : zCode="S
5b20: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5b30: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
5b40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5b50: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
5b60: 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GGER: zCode="SQL
5b70: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5b80: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
5b90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ba0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5bb0: 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  W  : zCode="SQLI
5bc0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
5bd0: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
5be0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
5bf0: 41 54 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a  ATE_TRIGGER    :
5c00: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5c10: 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20  REATE_TRIGGER"; 
5c20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5c30: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
5c40: 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  EW       : zCode
5c50: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5c60: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
5c70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
5c80: 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20  LETE            
5c90: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5ca0: 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a  DELETE"; break;.
5cb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5cc0: 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20  DROP_INDEX      
5cd0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
5ce0: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62  E_DROP_INDEX"; b
5cf0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5d00: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
5d10: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
5d20: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42  "SQLITE_DROP_TAB
5d30: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
5d40: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5d50: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20  _TEMP_INDEX   : 
5d60: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5d70: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20  OP_TEMP_INDEX"; 
5d80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5d90: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
5da0: 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65  _TABLE   : zCode
5db0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
5dc0: 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  MP_TABLE"; break
5dd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5de0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
5df0: 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GER : zCode="SQL
5e00: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
5e10: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
5e20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
5e30: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20  ROP_TEMP_VIEW   
5e40: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5e50: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22  _DROP_TEMP_VIEW"
5e60: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5e70: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  e SQLITE_DROP_TR
5e80: 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f  IGGER      : zCo
5e90: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
5ea0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
5eb0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ec0: 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20  _DROP_VIEW      
5ed0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5ee0: 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62  TE_DROP_VIEW"; b
5ef0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5f00: 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20  QLITE_INSERT    
5f10: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
5f20: 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b  "SQLITE_INSERT";
5f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5f40: 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20   SQLITE_PRAGMA  
5f50: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
5f60: 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e="SQLITE_PRAGMA
5f70: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5f80: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20  se SQLITE_READ  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
5fa0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44  ode="SQLITE_READ
5fb0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5fc0: 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  se SQLITE_SELECT
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
5fe0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45  ode="SQLITE_SELE
5ff0: 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CT"; break;.    
6000: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e  case SQLITE_TRAN
6010: 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20  SACTION       : 
6020: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52  zCode="SQLITE_TR
6030: 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61  ANSACTION"; brea
6040: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6050: 54 45 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  TE_UPDATE       
6060: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6070: 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72  LITE_UPDATE"; br
6080: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6090: 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20 20 20  LITE_ATTACH     
60a0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
60b0: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20  SQLITE_ATTACH"; 
60c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
60d0: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20  SQLITE_DETACH   
60e0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
60f0: 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22  ="SQLITE_DETACH"
6100: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6110: 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  e SQLITE_ALTER_T
6120: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
6130: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52  de="SQLITE_ALTER
6140: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
6150: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6160: 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
6170: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6180: 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61  E_REINDEX"; brea
6190: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
61a0: 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20  TE_ANALYZE      
61b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
61c0: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62  LITE_ANALYZE"; b
61d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
61e0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41  QLITE_CREATE_VTA
61f0: 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  BLE     : zCode=
6200: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56  "SQLITE_CREATE_V
6210: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
6220: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6230: 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20  ROP_VTABLE      
6240: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6250: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62  _DROP_VTABLE"; b
6260: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6270: 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20  QLITE_FUNCTION  
6280: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6290: 22 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e  "SQLITE_FUNCTION
62a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  "; break;.    de
62b0: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  fault           
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
62d0: 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61  ode="????"; brea
62e0: 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74  k;.  }.  Tcl_DSt
62f0: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
6300: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
6310: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
6320: 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Auth, -1);.  Tcl
6330: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
6340: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64  ement(&str, zCod
6350: 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  e);.  Tcl_DStrin
6360: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
6370: 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72  str, zArg1 ? zAr
6380: 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g1 : "");.  Tcl_
6390: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
63a0: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32  ment(&str, zArg2
63b0: 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a   ? zArg2 : "");.
63c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
63d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
63e0: 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a   zArg3 ? zArg3 :
63f0: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
6400: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
6410: 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a  (&str, zArg4 ? z
6420: 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63  Arg4 : "");.  rc
6430: 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61   = Tcl_GlobalEva
6440: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
6450: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
6460: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
6470: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
6480: 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f  .  zReply = Tcl_
6490: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
64a0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  pDb->interp);.  
64b0: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
64c0: 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d  y,"SQLITE_OK")==
64d0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
64e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
64f0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
6500: 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22  ly,"SQLITE_DENY"
6510: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
6520: 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20   SQLITE_DENY;.  
6530: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6540: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
6550: 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20  IGNORE")==0 ){. 
6560: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
6570: 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  GNORE;.  }else{.
6580: 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20      rc = 999;.  
6590: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
65a0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
65b0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
65c0: 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a  TION */../*.** z
65d0: 54 65 78 74 20 69 73 20 61 20 70 6f 69 6e 74 65  Text is a pointe
65e0: 72 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  r to text obtain
65f0: 65 64 20 76 69 61 20 61 6e 20 73 71 6c 69 74 65  ed via an sqlite
6600: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 29 0a  3_result_text().
6610: 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e  ** or similar in
6620: 74 65 72 66 61 63 65 2e 20 54 68 69 73 20 72 6f  terface. This ro
6630: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20  utine returns a 
6640: 54 63 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65 63  Tcl string objec
6650: 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  t, .** reference
6660: 20 63 6f 75 6e 74 20 73 65 74 20 74 6f 20 30 2c   count set to 0,
6670: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6680: 74 65 78 74 2e 20 49 66 20 61 20 74 72 61 6e 73  text. If a trans
6690: 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65  lation.** betwee
66a0: 6e 20 69 73 6f 38 38 35 39 20 61 6e 64 20 55 54  n iso8859 and UT
66b0: 46 2d 38 20 69 73 20 72 65 71 75 69 72 65 64 2c  F-8 is required,
66c0: 20 69 74 20 69 73 20 70 72 65 66 6f 72 6d 65 64   it is preformed
66d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f  ..*/.static Tcl_
66e0: 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a  Obj *dbTextToObj
66f0: 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65  (char const *zTe
6700: 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  xt){.  Tcl_Obj *
6710: 70 56 61 6c 3b 0a 23 69 66 64 65 66 20 55 54 46  pVal;.#ifdef UTF
6720: 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45  _TRANSLATION_NEE
6730: 44 45 44 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  DED.  Tcl_DStrin
6740: 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53  g dCol;.  Tcl_DS
6750: 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29  tringInit(&dCol)
6760: 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c  ;.  Tcl_External
6770: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c  ToUtfDString(NUL
6780: 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64  L, zText, -1, &d
6790: 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54  Col);.  pVal = T
67a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
67b0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
67c0: 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20  (&dCol), -1);.  
67d0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
67e0: 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  &dCol);.#else.  
67f0: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
6800: 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d  ringObj(zText, -
6810: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  1);.#endif.  ret
6820: 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  urn pVal;.}../*.
6830: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6840: 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20  reads a line of 
6850: 74 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69  text from FILE i
6860: 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65  n, stores.** the
6870: 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20   text in memory 
6880: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
6890: 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72  lloc() and retur
68a0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
68b0: 74 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55  to the text.  NU
68c0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
68d0: 74 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f  t end of file, o
68e0: 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a  r if malloc().**
68f0: 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   fails..**.** Th
6900: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c  e interface is l
6910: 69 6b 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62  ike "readline" b
6920: 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69  ut no command-li
6930: 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73  ne editing.** is
6940: 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70   done..**.** cop
6950: 69 65 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63  ied from shell.c
6960: 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20   from '.import' 
6970: 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69  command.*/.stati
6980: 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65  c char *local_ge
6990: 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f  tline(char *zPro
69a0: 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a  mpt, FILE *in){.
69b0: 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20    char *zLine;. 
69c0: 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e   int nLine;.  in
69d0: 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a  t n;.  int eol;.
69e0: 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a  .  nLine = 100;.
69f0: 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63    zLine = malloc
6a00: 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28  ( nLine );.  if(
6a10: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
6a20: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  rn 0;.  n = 0;. 
6a30: 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c   eol = 0;.  whil
6a40: 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69  e( !eol ){.    i
6a50: 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29  f( n+100>nLine )
6a60: 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20  {.      nLine = 
6a70: 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20  nLine*2 + 100;. 
6a80: 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61       zLine = rea
6a90: 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e  lloc(zLine, nLin
6aa0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  e);.      if( zL
6ab0: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
6ac0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
6ad0: 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d   fgets(&zLine[n]
6ae0: 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29  , nLine - n, in)
6af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
6b00: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
6b10: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
6b20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
6b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c        }.      zL
6b40: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
6b50: 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20    eol = 1;.     
6b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6b70: 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e    while( zLine[n
6b80: 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ] ){ n++; }.    
6b90: 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65  if( n>0 && zLine
6ba0: 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  [n-1]=='\n' ){. 
6bb0: 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
6bc0: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
6bd0: 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20      eol = 1;.   
6be0: 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d   }.  }.  zLine =
6bf0: 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c   realloc( zLine,
6c00: 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e   n+1 );.  return
6c10: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zLine;.}../*.**
6c20: 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
6c30: 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61  mmand below crea
6c40: 74 65 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f  tes a new Tcl co
6c50: 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a  mmand for each.*
6c60: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20  * connection it 
6c70: 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69  opens to an SQLi
6c80: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  te database.  Th
6c90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
6ca0: 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65  voked.** wheneve
6cb0: 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63  r one of those c
6cc0: 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66  onnection-specif
6cd0: 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65  ic commands is e
6ce0: 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63  xecuted.** in Tc
6cf0: 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
6d00: 20 69 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20   if you run Tcl 
6d10: 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a  code like this:.
6d20: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69  **.**       sqli
6d30: 74 65 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74  te3 db1  "my_dat
6d40: 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20  abase".**       
6d50: 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20  db1 close.**.** 
6d60: 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e  The first comman
6d70: 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63  d opens a connec
6d80: 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f  tion to the "my_
6d90: 64 61 74 61 62 61 73 65 22 20 64 61 74 61 62 61  database" databa
6da0: 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20  se.** and calls 
6db0: 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  that connection 
6dc0: 22 64 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f  "db1".  The seco
6dd0: 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65  nd command cause
6de0: 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75  s this.** subrou
6df0: 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tine to be invok
6e00: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
6e10: 74 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20  t DbObjCmd(void 
6e20: 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  *cd, Tcl_Interp 
6e30: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
6e40: 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  c,Tcl_Obj *const
6e50: 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65  *objv){.  Sqlite
6e60: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
6e70: 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63  eDb*)cd;.  int c
6e80: 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20  hoice;.  int rc 
6e90: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74  = TCL_OK;.  stat
6ea0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44  ic const char *D
6eb0: 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  B_strs[] = {.   
6ec0: 20 22 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20   "authorizer",  
6ed0: 20 20 20 20 20 20 20 22 62 75 73 79 22 2c 20 20         "busy",  
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 63              "cac
6ef0: 68 65 22 2c 0a 20 20 20 20 22 63 68 61 6e 67 65  he",.    "change
6f00: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  s",            "
6f10: 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20  close",         
6f20: 20 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 0a 20      "collate",. 
6f30: 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65     "collation_ne
6f40: 65 64 65 64 22 2c 20 20 20 22 63 6f 6d 6d 69 74  eded",   "commit
6f50: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 63  _hook",       "c
6f60: 6f 6d 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 63  omplete",.    "c
6f70: 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  opy",           
6f80: 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64      "enable_load
6f90: 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 22 65 72 72  _extension","err
6fa0: 6f 72 63 6f 64 65 22 2c 0a 20 20 20 20 22 65 76  orcode",.    "ev
6fb0: 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  al",            
6fc0: 20 20 20 22 65 78 69 73 74 73 22 2c 20 20 20 20     "exists",    
6fd0: 20 20 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f          "functio
6fe0: 6e 22 2c 0a 20 20 20 20 22 69 6e 63 72 62 6c 6f  n",.    "incrblo
6ff0: 62 22 2c 0a 20 20 20 20 22 69 6e 74 65 72 72 75  b",.    "interru
7000: 70 74 22 2c 20 20 20 20 20 20 20 20 20 20 22 6c  pt",          "l
7010: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
7020: 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 0a  ", "nullvalue",.
7030: 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c      "onecolumn",
7040: 20 20 20 20 20 20 20 20 20 20 22 70 72 6f 66 69            "profi
7050: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  le",           "
7060: 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20 20 22  progress",.    "
7070: 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20  rekey",         
7080: 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68       "rollback_h
7090: 6f 6f 6b 22 2c 20 20 20 20 20 22 74 69 6d 65 6f  ook",     "timeo
70a0: 75 74 22 2c 0a 20 20 20 20 22 74 6f 74 61 6c 5f  ut",.    "total_
70b0: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 22  changes",      "
70c0: 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20  trace",         
70d0: 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e      "transaction
70e0: 22 2c 0a 20 20 20 20 22 75 70 64 61 74 65 5f 68  ",.    "update_h
70f0: 6f 6f 6b 22 2c 20 20 20 20 20 20 20 20 22 76 65  ook",        "ve
7100: 72 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20  rsion",         
7110: 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20    0.  };.  enum 
7120: 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42  DB_enum {.    DB
7130: 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20  _AUTHORIZER,    
7140: 20 20 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20      DB_BUSY,    
7150: 20 20 20 20 20 20 20 20 20 44 42 5f 43 41 43 48           DB_CACH
7160: 45 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45  E,.    DB_CHANGE
7170: 53 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  S,           DB_
7180: 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
7190: 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20    DB_COLLATE,.  
71a0: 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e    DB_COLLATION_N
71b0: 45 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49  EEDED,  DB_COMMI
71c0: 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f  T_HOOK,      DB_
71d0: 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42  COMPLETE,.    DB
71e0: 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20  _COPY,          
71f0: 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f      DB_ENABLE_LO
7200: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f  AD_EXTENSION,DB_
7210: 45 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44  ERRORCODE,.    D
7220: 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20  B_EVAL,         
7230: 20 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20       DB_EXISTS, 
7240: 20 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e            DB_FUN
7250: 43 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 49 4e  CTION,.    DB_IN
7260: 43 52 42 4c 4f 42 2c 0a 20 20 20 20 44 42 5f 49  CRBLOB,.    DB_I
7270: 4e 54 45 52 52 55 50 54 2c 20 20 20 20 20 20 20  NTERRUPT,       
7280: 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54    DB_LAST_INSERT
7290: 5f 52 4f 57 49 44 2c 44 42 5f 4e 55 4c 4c 56 41  _ROWID,DB_NULLVA
72a0: 4c 55 45 2c 0a 20 20 20 20 44 42 5f 4f 4e 45 43  LUE,.    DB_ONEC
72b0: 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20 20 20 44  OLUMN,         D
72c0: 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20  B_PROFILE,      
72d0: 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c      DB_PROGRESS,
72e0: 0a 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20 20  .    DB_REKEY,  
72f0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f             DB_RO
7300: 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20  LLBACK_HOOK,    
7310: 44 42 5f 54 49 4d 45 4f 55 54 2c 0a 20 20 20 20  DB_TIMEOUT,.    
7320: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
7330: 2c 20 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20  ,     DB_TRACE, 
7340: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 52             DB_TR
7350: 41 4e 53 41 43 54 49 4f 4e 2c 0a 20 20 20 20 44  ANSACTION,.    D
7360: 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 20  B_UPDATE_HOOK,  
7370: 20 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c       DB_VERSION,
7380: 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a            .  };.
7390: 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65    /* don't leave
73a0: 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73   trailing commas
73b0: 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20   on DB_enum, it 
73c0: 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58  confuses the AIX
73d0: 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f   xlc compiler */
73e0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
73f0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
7400: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
7410: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
7420: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
7430: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7440: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
7450: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
7460: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
7470: 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e  DB_strs, "option
7480: 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29  ", 0, &choice) )
7490: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
74a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
74b0: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f  witch( (enum DB_
74c0: 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a  enum)choice ){..
74d0: 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68    /*    $db auth
74e0: 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b  orizer ?CALLBACK
74f0: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
7500: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
7510: 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69  lback to authori
7520: 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72  ze each SQL oper
7530: 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20  ation as it is. 
7540: 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35   ** compiled.  5
7550: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
7560: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
7570: 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69  allback before i
7580: 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  t is.  ** invoke
7590: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  d:.  **.  **   (
75a0: 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  1) The authoriza
75b0: 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53  tion type (ex: S
75c0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
75d0: 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  LE, SQLITE_INSER
75e0: 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28  T, ...).  **   (
75f0: 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70  2) First descrip
7600: 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e  tive name (depen
7610: 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74  ds on authorizat
7620: 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20  ion type).  **  
7630: 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63   (3) Second desc
7640: 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a  riptive name.  *
7650: 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20  *   (4) Name of 
7660: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78  the database (ex
7670: 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22  : "main", "temp"
7680: 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d  ).  **   (5) Nam
7690: 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61  e of trigger tha
76a0: 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61  t is doing the a
76b0: 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccess.  **.  ** 
76c0: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f  The callback sho
76d0: 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66  uld return on of
76e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
76f0: 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f  trings: SQLITE_O
7700: 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49  K,.  ** SQLITE_I
7710: 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45  GNORE, or SQLITE
7720: 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65  _DENY.  Any othe
7730: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
7740: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a  s an error..  **
7750: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65  .  ** If this me
7760: 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  thod is invoked 
7770: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
7780: 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  s, the current a
7790: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a  uthorization.  *
77a0: 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e  * callback strin
77b0: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  g is returned.. 
77c0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55   */.  case DB_AU
77d0: 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64  THORIZER: {.#ifd
77e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
77f0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
7800: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7810: 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f  t(interp, "autho
7820: 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61  rization not ava
7830: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
7840: 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72  uild", 0);.    r
7850: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7860: 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
7870: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
7880: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
7890: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
78a0: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
78b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
78c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
78d0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
78e0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
78f0: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
7900: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7910: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
7920: 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20  Auth, 0);.      
7930: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
7940: 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a     char *zAuth;.
7950: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
7960: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
7970: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
7980: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
7990: 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
79a0: 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47     zAuth = Tcl_G
79b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
79c0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
79d0: 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20        if( zAuth 
79e0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
79f0: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
7a00: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
7a10: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
7a20: 74 72 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68  trcpy(pDb->zAuth
7a30: 2c 20 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20  , zAuth);.      
7a40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
7a50: 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20  Db->zAuth = 0;. 
7a60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7a70: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
7a80: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
7a90: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
7aa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
7ab0: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
7ac0: 3e 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61  >db, auth_callba
7ad0: 63 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  ck, pDb);.      
7ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
7af0: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
7b00: 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30  rizer(pDb->db, 0
7b10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
7b20: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
7b30: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
7b40: 20 20 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c     $db busy ?CAL
7b50: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
7b60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
7b70: 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e  n callback if an
7b80: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
7b90: 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a  ttempts to open.
7ba0: 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61    ** a locked da
7bb0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
7bc0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 55 53 59  /.  case DB_BUSY
7bd0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
7be0: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
7bf0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7c00: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43  erp, 2, objv, "C
7c10: 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20  ALLBACK");.     
7c20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7c30: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
7c40: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
7c50: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
7c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
7c70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7c80: 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c  erp, pDb->zBusy,
7c90: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
7ca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
7cb0: 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20  ar *zBusy;.     
7cc0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
7cd0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
7ce0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
7cf0: 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a  ee(pDb->zBusy);.
7d00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42        }.      zB
7d10: 75 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  usy = Tcl_GetStr
7d20: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
7d30: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
7d40: 20 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65   if( zBusy && le
7d50: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
7d60: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f  Db->zBusy = Tcl_
7d70: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
7d80: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
7d90: 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75  (pDb->zBusy, zBu
7da0: 73 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sy);.      }else
7db0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
7dc0: 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Busy = 0;.      
7dd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
7de0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
7df0: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
7e00: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
7e10: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
7e20: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62  dler(pDb->db, Db
7e30: 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62  BusyHandler, pDb
7e40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7e50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7e60: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62  busy_handler(pDb
7e70: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
7e80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
7e90: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
7ea0: 20 20 20 20 24 64 62 20 63 61 63 68 65 20 66 6c      $db cache fl
7eb0: 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62  ush.  **     $db
7ec0: 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20   cache size n.  
7ed0: 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68  **.  ** Flush th
7ee0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
7ef0: 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73  ment cache, or s
7f00: 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  et the maximum n
7f10: 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61  umber of.  ** ca
7f20: 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  ched statements.
7f30: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
7f40: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61  CACHE: {.    cha
7f50: 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69  r *subCmd;.    i
7f60: 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f  nt n;..    if( o
7f70: 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc<=2 ){.      
7f80: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
7f90: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
7fa0: 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20  , "cache option 
7fb0: 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72  ?arg?");.      r
7fc0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d  .    }.    subCm
7fe0: 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
7ff0: 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32  gFromObj( objv[2
8000: 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ], 0 );.    if( 
8010: 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20  *subCmd=='f' && 
8020: 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66  strcmp(subCmd,"f
8030: 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lush")==0 ){.   
8040: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
8050: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
8060: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
8070: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75  p, 2, objv, "flu
8080: 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  sh");.        re
8090: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
80a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
80b0: 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61       flushStmtCa
80c0: 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20  che( pDb );.    
80d0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
80e0: 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26  ( *subCmd=='s' &
80f0: 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c  & strcmp(subCmd,
8100: 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "size")==0 ){.  
8110: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
8120: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
8130: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8140: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69  rp, 2, objv, "si
8150: 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ze n");.        
8160: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8170: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8180: 20 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45         if( TCL_E
8190: 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74  RROR==Tcl_GetInt
81a0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
81b0: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a  objv[3], &n) ){.
81c0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
81d0: 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65  pendResult( inte
81e0: 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76  rp, "cannot conv
81f0: 65 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20  ert \"", .      
8200: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
8210: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
8220: 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f  jv[3],0), "\" to
8230: 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20   integer", 0);. 
8240: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
8250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
8260: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8270: 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20      if( n<0 ){. 
8280: 20 20 20 20 20 20 20 20 20 20 20 66 6c 75 73 68             flush
8290: 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
82a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  ;.            n 
82b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
82c0: 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50  else if( n>MAX_P
82d0: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b  REPARED_STMTS ){
82e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
82f0: 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54   MAX_PREPARED_ST
8300: 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MTS;.          }
8310: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
8320: 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20  maxStmt = n;.   
8330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8350: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8360: 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f  ( interp, "bad o
8370: 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20  ption \"", .    
8380: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
8390: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
83a0: 30 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74  0],0), "\": must
83b0: 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a   be flush or siz
83c0: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
83d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
83e0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
83f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24  .  }..  /*     $
8400: 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a  db changes.  **.
8410: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
8420: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
8430: 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65  hat were modifie
8440: 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20  d, inserted, or 
8450: 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20  deleted by.  ** 
8460: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
8470: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
8480: 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
8490: 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e  nt, not includin
84a0: 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e  g .  ** any chan
84b0: 67 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67  ges made by trig
84c0: 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20  ger programs..  
84d0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41  */.  case DB_CHA
84e0: 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  NGES: {.    Tcl_
84f0: 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
8500: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
8510: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
8520: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8530: 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
8540: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8550: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8560: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
8570: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
8580: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
8590: 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73  ntObj(pResult, s
85a0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70  qlite3_changes(p
85b0: 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
85c0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
85d0: 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a    $db close.  **
85e0: 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  .  ** Shutdown t
85f0: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f  he database.  */
8600: 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45  .  case DB_CLOSE
8610: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65  : {.    Tcl_Dele
8620: 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
8630: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
8640: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
8650: 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  0));.    break;.
8660: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
8670: 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e     $db collate N
8680: 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  AME SCRIPT.  **.
8690: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
86a0: 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
86b0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
86c0: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
86d0: 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
86e0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
86f0: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
8700: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
8710: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
8720: 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a  e DB_COLLATE: {.
8730: 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a      SqlCollate *
8740: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68  pCollate;.    ch
8750: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  ar *zName;.    c
8760: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20  har *zScript;.  
8770: 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20    int nScript;. 
8780: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
8790: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
87a0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
87b0: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
87c0: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
87d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
87e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
87f0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
8800: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
8810: 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70  , 0);.    zScrip
8820: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
8830: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
8840: 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20  , &nScript);.   
8850: 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c   pCollate = (Sql
8860: 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c  Collate*)Tcl_All
8870: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  oc( sizeof(*pCol
8880: 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20  late) + nScript 
8890: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
88a0: 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74  Collate==0 ) ret
88b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
88c0: 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74     pCollate->int
88d0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
88e0: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78    pCollate->pNex
88f0: 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  t = pDb->pCollat
8900: 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  e;.    pCollate-
8910: 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72  >zScript = (char
8920: 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a  *)&pCollate[1];.
8930: 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
8940: 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  e = pCollate;.  
8950: 20 20 73 74 72 63 70 79 28 70 43 6f 6c 6c 61 74    strcpy(pCollat
8960: 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72  e->zScript, zScr
8970: 69 70 74 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ipt);.    if( sq
8980: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
8990: 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  lation(pDb->db, 
89a0: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  zName, SQLITE_UT
89b0: 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f  F8, .        pCo
89c0: 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c  llate, tclSqlCol
89d0: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54  late) ){.      T
89e0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
89f0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
8a00: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
8a10: 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
8a20: 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LE);.      retur
8a30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8a40: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8a50: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
8a60: 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e   $db collation_n
8a70: 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a  eeded SCRIPT.  *
8a80: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
8a90: 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f  new SQL collatio
8aa0: 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  n function calle
8ab0: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
8ac0: 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63  r.  ** that func
8ad0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
8ae0: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
8af0: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
8b00: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
8b10: 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e  ase DB_COLLATION
8b20: 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69  _NEEDED: {.    i
8b30: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
8b40: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
8b50: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
8b60: 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b  objv, "SCRIPT");
8b70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8b80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8b90: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c     if( pDb->pCol
8ba0: 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20  lateNeeded ){.  
8bb0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
8bc0: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
8bd0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d  teNeeded);.    }
8be0: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
8bf0: 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44  teNeeded = Tcl_D
8c00: 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76  uplicateObj(objv
8c10: 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  [2]);.    Tcl_In
8c20: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
8c30: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
8c40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .    sqlite3_col
8c50: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44  lation_needed(pD
8c60: 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43  b->db, pDb, tclC
8c70: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
8c80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
8c90: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69   /*    $db commi
8ca0: 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b  t_hook ?CALLBACK
8cb0: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
8cc0: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
8cd0: 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72  lback just befor
8ce0: 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65  e committing eve
8cf0: 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69  ry SQL transacti
8d00: 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  on..  ** If the 
8d10: 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20  callback throws 
8d20: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20  an exception or 
8d30: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
8d40: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
8d50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
8d60: 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c  borted.  If CALL
8d70: 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79  BACK is an empty
8d80: 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c   string, the cal
8d90: 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69  lback.  ** is di
8da0: 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  sabled..  */.  c
8db0: 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f  ase DB_COMMIT_HO
8dc0: 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  OK: {.    if( ob
8dd0: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
8de0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8df0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
8e00: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
8e10: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8e20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
8e30: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
8e40: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
8e50: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
8e60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8e70: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
8e80: 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20  zCommit, 0);.   
8e90: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8ea0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d        char *zCom
8eb0: 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  mit;.      int l
8ec0: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
8ed0: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  b->zCommit ){.  
8ee0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
8ef0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20  Db->zCommit);.  
8f00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d      }.      zCom
8f10: 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  mit = Tcl_GetStr
8f20: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8f30: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
8f40: 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20   if( zCommit && 
8f50: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
8f60: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
8f70: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
8f80: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74   1 );.        st
8f90: 72 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  rcpy(pDb->zCommi
8fa0: 74 2c 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  t, zCommit);.   
8fb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8fc0: 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d    pDb->zCommit =
8fd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8fe0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
8ff0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  it ){.        pD
9000: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
9010: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
9020: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
9030: 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69  pDb->db, DbCommi
9040: 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  tHandler, pDb);.
9050: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9060: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d       sqlite3_com
9070: 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  mit_hook(pDb->db
9080: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
9090: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
90a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
90b0: 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a  db complete SQL.
90c0: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
90d0: 20 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20   TRUE if SQL is 
90e0: 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73  a complete SQL s
90f0: 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  tatement.  Retur
9100: 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20  n FALSE if.  ** 
9110: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73  additional lines
9120: 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65   of input are ne
9130: 65 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  eded.  This is s
9140: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
9150: 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66  ** built-in "inf
9160: 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d  o complete" comm
9170: 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f  and of Tcl..  */
9180: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c  .  case DB_COMPL
9190: 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  ETE: {.#ifndef S
91a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c  QLITE_OMIT_COMPL
91b0: 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ETE.    Tcl_Obj 
91c0: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e  *pResult;.    in
91d0: 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20  t isComplete;.  
91e0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
91f0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
9200: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9210: 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b  2, objv, "SQL");
9220: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9230: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9240: 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20     isComplete = 
9250: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
9260: 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ( Tcl_GetStringF
9270: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
9280: 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c  0) );.    pResul
9290: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
92a0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
92b0: 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e    Tcl_SetBoolean
92c0: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43  Obj(pResult, isC
92d0: 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66  omplete);.#endif
92e0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
92f0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70  .  /*    $db cop
9300: 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  y conflict-algor
9310: 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e  ithm table filen
9320: 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  ame ?SEPARATOR? 
9330: 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a  ?NULLINDICATOR?.
9340: 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64    **.  ** Copy d
9350: 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66  ata into table f
9360: 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70  rom filename, op
9370: 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53  tionally using S
9380: 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73  EPARATOR.  ** as
9390: 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
93a0: 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e  rs.  If a column
93b0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c   contains a null
93c0: 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a   string, or the.
93d0: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55    ** value of NU
93e0: 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e  LLINDICATOR, a N
93f0: 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20  ULL is inserted 
9400: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a  for the column..
9410: 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c    ** conflict-al
9420: 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f  gorithm is one o
9430: 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e  f the sqlite con
9440: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73  flict algorithms
9450: 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61  :.  **    rollba
9460: 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c  ck, abort, fail,
9470: 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65   ignore, replace
9480: 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  .  ** On success
9490: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  , return the num
94a0: 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f  ber of lines pro
94b0: 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65  cessed, not nece
94c0: 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a  ssarily same.  *
94d0: 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73  * as 'db changes
94e0: 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63  ' due to conflic
94f0: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65  t-algorithm sele
9500: 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cted..  **.  ** 
9510: 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73  This code is bas
9520: 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d  ically an implem
9530: 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65  entation/enhance
9540: 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ment of.  ** the
9550: 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63   sqlite3 shell.c
9560: 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61   ".import" comma
9570: 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  nd..  **.  ** Th
9580: 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65  is command usage
9590: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
95a0: 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20  o the sqlite2.x 
95b0: 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a  COPY statement,.
95c0: 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72    ** which impor
95d0: 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74  ts file data int
95e0: 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20  o a table using 
95f0: 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43  the PostgreSQL C
9600: 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a  OPY file format:
9610: 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79  .  **   $db copy
9620: 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24   $conflit_algo $
9630: 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65  table_name $file
9640: 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f  name \t \\N.  */
9650: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a  .  case DB_COPY:
9660: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61   {.    char *zTa
9670: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
9680: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
9690: 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c  a into this tabl
96a0: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
96b0: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
96c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
96d0: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65   from which to e
96e0: 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20  xtract data */. 
96f0: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69     char *zConfli
9700: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct;            /
9710: 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61  * The conflict a
9720: 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20  lgorithm to use 
9730: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
9740: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
9750: 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e     /* A statemen
9760: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b  t */.    int rc;
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
9790: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ode */.    int n
97a0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
97b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
97c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
97d0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
97e0: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9800: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
9810: 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20  n an SQL string 
9820: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  */.    int i, j;
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9850: 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ers */.    int n
9860: 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sep;            
9870: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9880: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65   of bytes in zSe
9890: 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  p[] */.    int n
98a0: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
98b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
98c0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75   of bytes in zNu
98d0: 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72  ll[] */.    char
98e0: 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51          /* An SQ
9900: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
9910: 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20     char *zLine; 
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9930: 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  * A single line 
9940: 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68  of input from th
9950: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68  e file */.    ch
9960: 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20  ar **azCol;     
9970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69            /* zLi
9980: 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69  ne[] broken up i
9990: 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nto columns */. 
99a0: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74     char *zCommit
99b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
99c0: 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20  * How to commit 
99d0: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46  changes */.    F
99e0: 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20  ILE *in;        
99f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9a00: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
9a10: 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d      int lineno =
9a20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9a30: 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f  /* Line number o
9a40: 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  f input file */.
9a50: 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75      char zLineNu
9a60: 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20  m[80];          
9a70: 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70  /* Line number p
9a80: 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  rint buffer */. 
9a90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
9aa0: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ult;           /
9ab0: 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20  * interp result 
9ac0: 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  */..    char *zS
9ad0: 65 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  ep;.    char *zN
9ae0: 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ull;.    if( obj
9af0: 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b  c<5 || objc>7 ){
9b00: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
9b10: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9b20: 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20  2, objv, .      
9b30: 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47     "CONFLICT-ALG
9b40: 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c  ORITHM TABLE FIL
9b50: 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52  ENAME ?SEPARATOR
9b60: 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52  ? ?NULLINDICATOR
9b70: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
9b80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9b90: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   }.    if( objc>
9ba0: 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70  =6 ){.      zSep
9bb0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
9bc0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c  FromObj(objv[5],
9bd0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
9be0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74        zSep = "\t
9bf0: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ";.    }.    if(
9c00: 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20   objc>=7 ){.    
9c10: 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65    zNull = Tcl_Ge
9c20: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9c30: 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[6], 0);.    
9c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75  }else{.      zNu
9c50: 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20  ll = "";.    }. 
9c60: 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54     zConflict = T
9c70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9c80: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
9c90: 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63  .    zTable = Tc
9ca0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9cb0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a  bj(objv[3], 0);.
9cc0: 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f      zFile = Tcl_
9cd0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9ce0: 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20  (objv[4], 0);.  
9cf0: 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28    nSep = strlen(
9d00: 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c  zSep);.    nNull
9d10: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29   = strlen(zNull)
9d20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
9d30: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
9d40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9d50: 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  rp,"Error: non-n
9d60: 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65  ull separator re
9d70: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22  quired for copy"
9d80: 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ,0);.      retur
9d90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9da0: 20 7d 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65   }.    if(sqlite
9db0: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
9dc0: 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20  ct, "rollback") 
9dd0: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
9de0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
9df0: 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
9e00: 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
9e10: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
9e20: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66  mp(zConflict, "f
9e30: 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26  ail"    ) != 0 &
9e40: 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  &.       sqlite3
9e50: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
9e60: 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
9e70: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
9e80: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
9e90: 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65  nflict, "replace
9ea0: 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20  " ) != 0 ) {.   
9eb0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9ec0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
9ed0: 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69  or: \"", zConfli
9ee0: 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ct, .           
9ef0: 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61   "\", conflict-a
9f00: 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65  lgorithm must be
9f10: 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63   one of: rollbac
9f20: 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  k, ".           
9f30: 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69   "abort, fail, i
9f40: 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63  gnore, or replac
9f50: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
9f60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9f70: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
9f80: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9f90: 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
9fa0: 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  '%q'", zTable);.
9fb0: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
9fc0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
9fd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9fe0: 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63  , "Error: no suc
9ff0: 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62  h table: ", zTab
a000: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  le, 0);.      re
a010: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a020: 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
a030: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
a040: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a050: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
a060: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
a070: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
a080: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
a090: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
a0a0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a0b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
a0c0: 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
a0d0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
a0e0: 20 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20   0);.      nCol 
a0f0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
a100: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
a110: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
a120: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
a130: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
a140: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
a150: 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b   if( nCol==0 ) {
a160: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
a170: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
a180: 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63     zSql = malloc
a190: 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e  ( nByte + 50 + n
a1a0: 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
a1b0: 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20   zSql==0 ) {.   
a1c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a1d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
a1e0: 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
a1f0: 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ()", 0);.      r
a200: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a210: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a220: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
a230: 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+50, zSql, "INS
a240: 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27  ERT OR %q INTO '
a250: 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20  %q' VALUES(?",. 
a260: 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63          zConflic
a270: 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, zTable);.    
a280: 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29  j = strlen(zSql)
a290: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
a2a0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
a2b0: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
a2c0: 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  ,';.      zSql[j
a2d0: 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d  ++] = '?';.    }
a2e0: 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d  .    zSql[j++] =
a2f0: 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a   ')';.    zSql[j
a300: 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  ] = 0;.    rc = 
a310: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
a320: 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  pDb->db, zSql, -
a330: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
a340: 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20     free(zSql);. 
a350: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
a360: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a370: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
a380: 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
a390: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
a3a0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
a3b0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
a3c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a3d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a3e0: 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  .    in = fopen(
a3f0: 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  zFile, "rb");.  
a400: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
a410: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
a420: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
a430: 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
a440: 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65  n file: ", zFile
a450: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  , NULL);.      s
a460: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
a470: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
a480: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a490: 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20      }.    azCol 
a4a0: 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  = malloc( sizeof
a4b0: 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c  (azCol[0])*(nCol
a4c0: 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61  +1) );.    if( a
a4d0: 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zCol==0 ) {.    
a4e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a4f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
a500: 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
a510: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63  )", 0);.      fc
a520: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
a530: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a540: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69  ;.    }.    (voi
a550: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
a560: 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c  Db->db, "BEGIN",
a570: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a   0, 0, 0);.    z
a580: 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54  Commit = "COMMIT
a590: 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  ";.    while( (z
a5a0: 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74  Line = local_get
a5b0: 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20  line(0, in))!=0 
a5c0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
a5d0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20  ;.      i = 0;. 
a5e0: 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
a5f0: 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20       azCol[0] = 
a600: 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72  zLine;.      for
a610: 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a  (i=0, z=zLine; *
a620: 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
a630: 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d   if( *z==zSep[0]
a640: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a   && strncmp(z, z
a650: 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b  Sep, nSep)==0 ){
a660: 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20  .          *z = 
a670: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  0;.          i++
a680: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
a690: 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  i<nCol ){.      
a6a0: 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d        azCol[i] =
a6b0: 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20   &z[nSep];.     
a6c0: 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70         z += nSep
a6d0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
a6e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a6f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21  }.      if( i+1!
a700: 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  =nCol ){.       
a710: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
a720: 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c       zErr = mall
a730: 6f 63 28 32 30 30 20 2b 20 73 74 72 6c 65 6e 28  oc(200 + strlen(
a740: 7a 46 69 6c 65 29 29 3b 0a 20 20 20 20 20 20 20  zFile));.       
a750: 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
a760: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
a770: 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Err,.           
a780: 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e    "Error: %s lin
a790: 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
a7a0: 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
a7b0: 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c  a but found %d",
a7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  .             zF
a7d0: 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f  ile, lineno, nCo
a7e0: 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
a7f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a800: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
a810: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
a820: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
a830: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43      }.        zC
a840: 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
a850: 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
a860: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
a870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
a880: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a890: 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c  /* check for nul
a8a0: 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62  l data, if so, b
a8b0: 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20  ind as null */. 
a8c0: 20 20 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c         if ((nNul
a8d0: 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a  l>0 && strcmp(az
a8e0: 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d  Col[i], zNull)==
a8f0: 30 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43  0) || strlen(azC
a900: 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20  ol[i])==0) {.   
a910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
a920: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
a930: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  i+1);.        }e
a940: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
a950: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
a960: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43  (pStmt, i+1, azC
a970: 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  ol[i], -1, SQLIT
a980: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
a990: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a9a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
a9b0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63  pStmt);.      rc
a9c0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
a9d0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66  (pStmt);.      f
a9e0: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
a9f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
aa00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
aa10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
aa20: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22  interp,"Error: "
aa30: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
aa40: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
aa50: 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
aa60: 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
aa70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
aa90: 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66  ee(azCol);.    f
aaa0: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73  close(in);.    s
aab0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
aac0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69  pStmt);.    (voi
aad0: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
aae0: 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c  Db->db, zCommit,
aaf0: 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20   0, 0, 0);..    
ab00: 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d  if( zCommit[0] =
ab10: 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f  = 'C' ){.      /
ab20: 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72  * success, set r
ab30: 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20  esult as number 
ab40: 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
ab50: 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ed */.      pRes
ab60: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
ab70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
ab80: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74        Tcl_SetInt
ab90: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e  Obj(pResult, lin
aba0: 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eno);.      rc =
abb0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
abc0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69  se{.      /* fai
abd0: 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e  lure, append lin
abe0: 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64  eno where failed
abf0: 20 2a 2f 0a 20 20 20 20 20 20 73 70 72 69 6e 74   */.      sprint
ac00: 66 28 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c  f(zLineNum,"%d",
ac10: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54  lineno);.      T
ac20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ac30: 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64  interp,", failed
ac40: 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
ac50: 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e  g line: ",zLineN
ac60: 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20  um,0);.      rc 
ac70: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
ac80: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
ac90: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
aca0: 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  $db enable_load_
acb0: 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41  extension BOOLEA
acc0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e  N.  **.  ** Turn
acd0: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c   the extension l
ace0: 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f  oading feature o
acf0: 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66  n or off.  It if
ad00: 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66   off by.  ** def
ad10: 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ault..  */.  cas
ad20: 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  e DB_ENABLE_LOAD
ad30: 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69  _EXTENSION: {.#i
ad40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ad50: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
ad60: 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a  .    int onoff;.
ad70: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
ad80: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
ad90: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ada0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c  , 2, objv, "BOOL
adb0: 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  EAN");.      ret
adc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
add0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
ade0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
adf0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
ae00: 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20  2], &onoff) ){. 
ae10: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ae20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ae30: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
ae40: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
ae50: 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  Db->db, onoff);.
ae60: 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65      break;.#else
ae70: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
ae80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65  esult(interp, "e
ae90: 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67  xtension loading
aea0: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61   is turned off a
aeb0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c  t compile-time",
aec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aed0: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 72 65        0);.    re
aee0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
aef0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
af00: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72  .  **    $db err
af10: 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a  orcode.  **.  **
af20: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65   Return the nume
af30: 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74  ric error code t
af40: 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64  hat was returned
af50: 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
af60: 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f  ent.  ** call to
af70: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
af80: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
af90: 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20  ERRORCODE: {.   
afa0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
afb0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
afc0: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
afd0: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
afe0: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
aff0: 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   }.   .  /*.  **
b000: 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73 71      $db eval $sq
b010: 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e  l ?array? ?{  ..
b020: 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a  .code... }?.  **
b030: 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d      $db onecolum
b040: 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a  n $sql.  **.  **
b050: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
b060: 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
b070: 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
b080: 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
b090: 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
b0a0: 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
b0b0: 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
b0c0: 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
b0d0: 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
b0e0: 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
b0f0: 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
b100: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
b110: 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
b120: 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
b130: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
b140: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
b150: 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
b160: 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
b170: 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
b180: 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
b190: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
b1a0: 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
b1b0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
b1c0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e    **.  ** The on
b1d0: 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69  ecolumn method i
b1e0: 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
b1f0: 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69   of:.  **     li
b200: 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24  ndex [$db eval $
b210: 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61  sql] 0.  */.  ca
b220: 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a  se DB_ONECOLUMN:
b230: 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a  .  case DB_EVAL:
b240: 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53 54  .  case DB_EXIST
b250: 53 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  S: {.    char co
b260: 6e 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  nst *zSql;      
b270: 2f 2a 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74  /* Next SQL stat
b280: 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
b290: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
b2a0: 73 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f  st *zLeft;     /
b2b0: 2a 20 57 68 61 74 20 69 73 20 6c 65 66 74 20 61  * What is left a
b2c0: 66 74 65 72 20 66 69 72 73 74 20 73 74 6d 74 20  fter first stmt 
b2d0: 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73  in zSql */.    s
b2e0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
b2f0: 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  mt;   /* Compile
b300: 64 20 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a  d SQL statment *
b310: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
b320: 41 72 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20  Array;       /* 
b330: 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e  Name of array in
b340: 74 6f 20 77 68 69 63 68 20 72 65 73 75 6c 74 73  to which results
b350: 20 61 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a   are written */.
b360: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
b370: 72 69 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63  ript;      /* Sc
b380: 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20  ript to run for 
b390: 65 61 63 68 20 72 65 73 75 6c 74 20 73 65 74 20  each result set 
b3a0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
b3b0: 2a 61 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a  *apParm;      /*
b3c0: 20 50 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   Parameters that
b3d0: 20 6e 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72   need a Tcl_Decr
b3e0: 52 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20  RefCount() */.  
b3f0: 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20    int nParm;    
b400: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b410: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73  er of entries us
b420: 65 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a  ed in apParm[] *
b430: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61  /.    Tcl_Obj *a
b440: 50 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20  Parm[10];    /* 
b450: 53 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  Static space for
b460: 20 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65   apParm[] in the
b470: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
b480: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
b490: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  t;         /* Va
b4a0: 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
b4b0: 65 64 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65  ed */.    SqlPre
b4c0: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
b4d0: 74 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  tmt;  /* Pointer
b4e0: 20 74 6f 20 61 20 70 72 65 70 61 72 65 64 20 73   to a prepared s
b4f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
b500: 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 69 66  int rc2;..    if
b510: 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41  ( choice==DB_EVA
b520: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  L ){.      if( o
b530: 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20  bjc<3 || objc>5 
b540: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
b550: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b560: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
b570: 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f  L ?ARRAY-NAME? ?
b580: 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
b590: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b5a0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
b5b0: 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
b5c0: 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
b5d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
b5e0: 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ret);.    }else{
b5f0: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
b600: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
b610: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b620: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
b630: 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  "SQL");.        
b640: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b660: 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45  if( choice==DB_E
b670: 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20  XISTS ){.       
b680: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42   pRet = Tcl_NewB
b690: 6f 6f 6c 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20  ooleanObj(0);.  
b6a0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
b6b0: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
b6c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b6d0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
b6e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b6f0: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
b700: 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 53 63      pArray = pSc
b710: 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ript = 0;.    }e
b720: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
b730: 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20  ){.      pArray 
b740: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69  = 0;.      pScri
b750: 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
b760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b770: 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b  Array = objv[3];
b780: 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
b790: 65 74 53 74 72 69 6e 67 28 70 41 72 72 61 79 29  etString(pArray)
b7a0: 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72 61 79 20  [0]==0 ) pArray 
b7b0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69  = 0;.      pScri
b7c0: 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20  pt = objv[4];.  
b7d0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63    }..    Tcl_Inc
b7e0: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32  rRefCount(objv[2
b7f0: 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54  ]);.    zSql = T
b800: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
b810: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
b820: 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
b830: 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30  TCL_OK && zSql[0
b840: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ] ){.      int i
b850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b860: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b870: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  unter */.      i
b880: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
b890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b8a0: 62 65 72 20 6f 66 20 62 69 6e 64 20 70 61 72 61  ber of bind para
b8b0: 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20 70 53  meters in the pS
b8c0: 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
b8d0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
b8e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b8f0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
b900: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
b910: 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  /.      Tcl_Obj 
b920: 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b  **apColName = 0;
b930: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
b940: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
b950: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20       int len;   
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67 74 68  /* String length
b980: 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20   of zSql */.  . 
b990: 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66       /* Try to f
b9a0: 69 6e 64 20 61 20 53 51 4c 20 73 74 61 74 65 6d  ind a SQL statem
b9b0: 65 6e 74 20 74 68 61 74 20 68 61 73 20 61 6c 72  ent that has alr
b9c0: 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c  eady been compil
b9d0: 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ed and.      ** 
b9e0: 77 68 69 63 68 20 6d 61 74 63 68 65 73 20 74 68  which matches th
b9f0: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 63 65 20  e next sequence 
ba00: 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f  of SQL..      */
ba10: 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30  .      pStmt = 0
ba20: 3b 0a 20 20 20 20 20 20 70 50 72 65 53 74 6d 74  ;.      pPreStmt
ba30: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
ba40: 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74  ;.      len = st
ba50: 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20  rlen(zSql);.    
ba60: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 26    if( pPreStmt &
ba70: 26 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65  & sqlite3_expire
ba80: 64 28 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  d(pPreStmt->pStm
ba90: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  t) ){.        fl
baa0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62  ushStmtCache(pDb
bab0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  );.        pPreS
bac0: 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
bad0: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 70 50 72  .      for(; pPr
bae0: 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d  eStmt; pPreStmt=
baf0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29  pPreStmt->pNext)
bb00: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
bb10: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  = pPreStmt->nSql
bb20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
bb30: 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20  n>=n .          
bb40: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65    && memcmp(pPre
bb50: 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c  Stmt->zSql, zSql
bb60: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  , n)==0.        
bb70: 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d      && (zSql[n]=
bb80: 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d  =0 || zSql[n-1]=
bb90: 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b  =';').        ){
bba0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 6d 74  .          pStmt
bbb0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74   = pPreStmt->pSt
bbc0: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c  mt;.          zL
bbd0: 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65  eft = &zSql[pPre
bbe0: 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20  Stmt->nSql];..  
bbf0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20          /* When 
bc00: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
bc10: 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75  ment is found, u
bc20: 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68  nlink it from th
bc30: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
bc40: 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77  ache list.  It w
bc50: 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64  ill later be add
bc60: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  ed back to the b
bc70: 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20  eginning.       
bc80: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63     ** of the cac
bc90: 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72  he list in order
bca0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52   to implement LR
bcb0: 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20  U replacement.. 
bcc0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
bcd0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
bce0: 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  mt->pPrev ){.   
bcf0: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
bd00: 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  t->pPrev->pNext 
bd10: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
bd20: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  t;.          }el
bd30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
bd40: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
bd50: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
bd60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
bd70: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
bd80: 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  tmt->pNext ){.  
bd90: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
bda0: 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  mt->pNext->pPrev
bdb0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
bdc0: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ev;.          }e
bdd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
bde0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
bdf0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
be00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
be10: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74          pDb->nSt
be20: 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  mt--;.          
be30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
be40: 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
be50: 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61    /* If no prepa
be60: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61  red statement wa
be70: 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c  s found.  Compil
be80: 65 20 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20  e the SQL text. 
be90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
bea0: 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( pStmt==0 ){.  
beb0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
bec0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65  _OK!=sqlite3_pre
bed0: 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
bee0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
bef0: 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20  &zLeft) ){.     
bf00: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
bf10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
bf20: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
bf30: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
bf40: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  )));.          r
bf50: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
bf60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bf70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bf80: 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29    if( pStmt==0 )
bf90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
bfa0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
bfb0: 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e  e3_errcode(pDb->
bfc0: 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  db) ){.         
bfd0: 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d     /* A compile-
bfe0: 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68  time error in th
bff0: 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  e statement.    
c000: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c010: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
c020: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c030: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
c040: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
c050: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  db)));.         
c060: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
c070: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  R;.            b
c080: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
c090: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c0a0: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d     /* The statem
c0b0: 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e  ent was a no-op.
c0c0: 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68    Continue to th
c0d0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
c0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
c0f0: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  in the SQL strin
c100: 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  g..            *
c110: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  /.            zS
c120: 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20  ql = zLeft;.    
c130: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
c140: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c160: 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74  assert( pPreStmt
c170: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ==0 );.      }..
c180: 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 76 61        /* Bind va
c190: 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65  lues to paramete
c1a0: 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  rs that begin wi
c1b0: 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20 20 20  th $ or :.      
c1c0: 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61 72 20  */  .      nVar 
c1d0: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
c1e0: 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
c1f0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50 61  Stmt);.      nPa
c200: 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  rm = 0;.      if
c210: 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61 50  ( nVar>sizeof(aP
c220: 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61 72  arm)/sizeof(aPar
c230: 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  m[0]) ){.       
c240: 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f   apParm = (Tcl_O
c250: 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e  bj**)Tcl_Alloc(n
c260: 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50 61 72  Var*sizeof(apPar
c270: 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  m[0]));.      }e
c280: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 50  lse{.        apP
c290: 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20  arm = aParm;.   
c2a0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
c2b0: 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
c2c0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
c2d0: 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71   char *zVar = sq
c2e0: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
c2f0: 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  eter_name(pStmt,
c300: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
c310: 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61   zVar!=0 && (zVa
c320: 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61  r[0]=='$' || zVa
c330: 72 5b 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20 20  r[0]==':') ){.  
c340: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
c350: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56  *pVar = Tcl_GetV
c360: 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a  ar2Ex(interp, &z
c370: 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20  Var[1], 0, 0);. 
c380: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 56 61           if( pVa
c390: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
c3a0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
c3b0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
c3c0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
c3d0: 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79  zType = pVar->ty
c3e0: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
c3f0: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
c400: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
c410: 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b  ar c = zType[0];
c420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
c430: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
c440: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
c450: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
c460: 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20  >bytes==0 ){.   
c470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
c480: 6c 79 20 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74  ly load a BLOB t
c490: 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76  ype if the Tcl v
c4a0: 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74  ariable is a byt
c4b0: 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20  earray and.     
c4c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
c4d0: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
c4e0: 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  entation. */.   
c4f0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
c500: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
c510: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
c520: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
c530: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
c540: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
c550: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
c560: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
c570: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
c580: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
c590: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
c5a0: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
c5b0: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
c5c0: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62  }else if( (c=='b
c5d0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
c5e0: 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29  e,"boolean")==0)
c5f0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
c600: 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26        (c=='i' &&
c610: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69   strcmp(zType,"i
c620: 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nt")==0) ){.    
c630: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
c640: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
c650: 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  rp, pVar, &n);. 
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
c670: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
c680: 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20  tmt, i, n);.    
c690: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c6a0: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
c6b0: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
c6c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
c6d0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b         double r;
c6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
c6f0: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
c700: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
c710: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20  , &r);.         
c720: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
c730: 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  d_double(pStmt, 
c740: 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20  i, r);.         
c750: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
c760: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
c770: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
c780: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
c790: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
c7a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
c7b0: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
c7c0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
c7d0: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
c7e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
c7f0: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
c800: 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20   i, v);.        
c810: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c820: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
c830: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
c840: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
c850: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
c860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
c870: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
c880: 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72  (pStmt, i, (char
c890: 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49   *)data, n, SQLI
c8a0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
c8b0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
c8c0: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
c8d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
c8e0: 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20  apParm[nParm++] 
c8f0: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
c900: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
c910: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c920: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
c930: 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29  null( pStmt, i )
c940: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c960: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  .      /* Comput
c970: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
c980: 2f 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73  /.      nCol = s
c990: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
c9a0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
c9b0: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
c9c0: 0a 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61  .        apColNa
c9d0: 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29  me = (Tcl_Obj**)
c9e0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
c9f0: 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c  f(Tcl_Obj*)*nCol
ca00: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ca10: 61 70 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62  apColName==0 ) b
ca20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f  reak;.        fo
ca30: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
ca40: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
ca50: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62  pColName[i] = db
ca60: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
ca70: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
ca80: 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20  tmt,i));.       
ca90: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
caa0: 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  unt(apColName[i]
cab0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cac0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
cad0: 66 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65  f results are be
cae0: 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e  ing stored in an
caf0: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c   array variable,
cb00: 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20   then create.   
cb10: 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28     ** the array(
cb20: 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61  *) entry for tha
cb30: 74 20 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2f  t array.      */
cb40: 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61  .      if( pArra
cb50: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
cb60: 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d  _Obj *pColList =
cb70: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
cb80: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
cb90: 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53  pStar = Tcl_NewS
cba0: 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31  tringObj("*", -1
cbb0: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  );.        Tcl_I
cbc0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c  ncrRefCount(pCol
cbd0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66  List);.        f
cbe0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
cbf0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
cc00: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
cc10: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
cc20: 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c   pColList, apCol
cc30: 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Name[i]);.      
cc40: 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f    }.        Tcl_
cc50: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
cc60: 70 2c 20 70 41 72 72 61 79 2c 20 70 53 74 61 72  p, pArray, pStar
cc70: 2c 20 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20  , pColList,0);. 
cc80: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
cc90: 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74  efCount(pColList
cca0: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  );.        Tcl_D
ccb0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61  ecrRefCount(pSta
ccc0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  r);.      }..   
ccd0: 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68     /* Execute th
cce0: 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20  e SQL.      */. 
ccf0: 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
cd00: 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20  TCL_OK && pStmt 
cd10: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
cd20: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
cd30: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  t) ){.        fo
cd40: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
cd50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
cd60: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20  cl_Obj *pVal;.  
cd70: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
cd80: 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74     /* Set pVal t
cd90: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27  o contain the i'
cda0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69  th column of thi
cdb0: 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  s row. */.      
cdc0: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
cdd0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
cde0: 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20  pStmt, i) ){.   
cdf0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
ce00: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
ce10: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62             int b
ce20: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63  ytes = sqlite3_c
ce30: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
ce40: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
ce50: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
ce60: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
ce70: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
ce80: 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 62  lob(pStmt, i), b
ce90: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
cea0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ceb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cec0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ced0: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
cee0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
cef0: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
cf00: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
cf10: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
cf20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
cf30: 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20  =-2147483647 && 
cf40: 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  v<=2147483647 ){
cf50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf60: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49   pVal = Tcl_NewI
cf70: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
cf80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
cfa0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Val = Tcl_NewWid
cfb0: 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  eIntObj(v);.    
cfc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
cfd0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
cfe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
cff0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
d000: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f                do
d020: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
d030: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
d040: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
d050: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
d060: 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
d070: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
d080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
d090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d0a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
d0b0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
d0c0: 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65       pVal = dbTe
d0d0: 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75  xtToObj(pDb->zNu
d0e0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
d0f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d110: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
d130: 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  l = dbTextToObj(
d140: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
d150: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
d160: 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20  t, i));.        
d170: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d180: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d190: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
d1a0: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
d1b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
d1c0: 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a  f( pArray==0 ){.
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
d1e0: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
d1f0: 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  erp, apColName[i
d200: 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a  ], 0, pVal, 0);.
d210: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
d220: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
d230: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
d240: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
d250: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56  apColName[i], pV
d260: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
d270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d280: 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65  }else if( choice
d290: 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
d2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
d2b0: 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 29 3b  sert( pRet==0 );
d2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
d2d0: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
d2e0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
d2f0: 20 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20   pVal;.         
d300: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
d310: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
d320: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d330: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
d340: 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20  BREAK;.         
d350: 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20     i = nCol;.   
d360: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
d370: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53   choice==DB_EXIS
d380: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
d390: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
d3a0: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
d3b0: 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c        pRet = Tcl
d3c0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31  _NewBooleanObj(1
d3d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
d3e0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
d3f0: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  pRet);.         
d400: 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41     rc = TCL_BREA
d410: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  K;.            i
d420: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = nCol;.       
d430: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d440: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
d450: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
d460: 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56 61  nterp, pRet, pVa
d470: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  l);.          }.
d480: 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
d490: 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74       if( pScript
d4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
d4b0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
d4c0: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
d4d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
d4e0: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54  if( rc==TCL_CONT
d4f0: 49 4e 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20  INUE ){.        
d500: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
d510: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d530: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
d540: 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20  _BREAK ){.      
d550: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
d560: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
d570: 20 46 72 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e   Free the column
d580: 20 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f   name objects */
d590: 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69  .      if( pScri
d5a0: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  pt ){.        fo
d5b0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
d5c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
d5d0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
d5e0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
d5f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d600: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
d610: 29 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  )apColName);.   
d620: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
d630: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
d640: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
d650: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
d660: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61    for(i=0; i<nPa
d670: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
d680: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
d690: 6e 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20  nt(apParm[i]);. 
d6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d6b0: 20 61 70 50 61 72 6d 21 3d 61 50 61 72 6d 20 29   apParm!=aParm )
d6c0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
d6d0: 65 65 28 28 63 68 61 72 2a 29 61 70 50 61 72 6d  ee((char*)apParm
d6e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
d6f0: 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 73    /* Reset the s
d700: 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 74 68  tatement.  If th
d710: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 69 73  e result code is
d720: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20   SQLITE_SCHEMA, 
d730: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c  then.      ** fl
d740: 75 73 68 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ush the statemen
d750: 74 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20  t cache and try 
d760: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 67  the statement ag
d770: 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ain..      */.  
d780: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
d790: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
d7a0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
d7b0: 5f 53 43 48 45 4d 41 3d 3d 72 63 32 20 29 7b 0a  _SCHEMA==rc2 ){.
d7c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72          /* After
d7d0: 20 61 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65   a schema change
d7e0: 2c 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  , flush the cach
d7f0: 65 20 61 6e 64 20 74 72 79 20 74 6f 20 72 75 6e  e and try to run
d800: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
d810: 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 0a  statement again.
d820: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
d830: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
d840: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
d850: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
d860: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
d870: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20     if( pPreStmt 
d880: 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72  ) Tcl_Free((char
d890: 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20  *)pPreStmt);.   
d8a0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
d8b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53       }else if( S
d8c0: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b  QLITE_OK!=rc2 ){
d8d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
d8e0: 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20   run-time error 
d8f0: 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74  occurs, report t
d900: 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f  he error and sto
d910: 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20  p reading.      
d920: 20 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20 20    ** the SQL.   
d930: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
d940: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
d950: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
d960: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  oObj(sqlite3_err
d970: 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  msg(pDb->db)));.
d980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d990: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
d9a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43  .        rc = TC
d9b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
d9c0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20   if( pPreStmt ) 
d9d0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
d9e0: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20  pPreStmt);.     
d9f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
da00: 7d 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e 6d  }else if( pDb->m
da10: 61 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20  axStmt<=0 ){.   
da20: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
da30: 61 63 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f  ache is turned o
da40: 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  ff, deallocated 
da50: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
da60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
da70: 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65  eStmt ) Tcl_Free
da80: 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74  ((char*)pPreStmt
da90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
daa0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
dab0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
dac0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 72  .        /* Ever
dad0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e  ything worked an
dae0: 64 20 74 68 65 20 63 61 63 68 65 20 69 73 20 6f  d the cache is o
daf0: 70 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20  perational..    
db00: 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20      ** Create a 
db10: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
db20: 74 6d 74 20 73 74 72 75 63 74 75 72 65 20 69 66  tmt structure if
db30: 20 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20   we need one..  
db40: 20 20 20 20 20 20 2a 2a 20 28 49 66 20 77 65 20        ** (If we 
db50: 61 6c 72 65 61 64 79 20 68 61 76 65 20 6f 6e 65  already have one
db60: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 72 65 75   we can just reu
db70: 73 65 20 69 74 2e 29 0a 20 20 20 20 20 20 20 20  se it.).        
db80: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
db90: 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  PreStmt==0 ){.  
dba0: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c          len = zL
dbb0: 65 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20  eft - zSql;.    
dbc0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d        pPreStmt =
dbd0: 20 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d   (SqlPreparedStm
dbe0: 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  t*)Tcl_Alloc( si
dbf0: 7a 65 6f 66 28 2a 70 50 72 65 53 74 6d 74 29 20  zeof(*pPreStmt) 
dc00: 2b 20 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  + len );.       
dc10: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d     if( pPreStmt=
dc20: 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
dc30: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
dc40: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
dc50: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20   = pStmt;.      
dc60: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53      pPreStmt->nS
dc70: 71 6c 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  ql = len;.      
dc80: 20 20 20 20 6d 65 6d 63 70 79 28 70 50 72 65 53      memcpy(pPreS
dc90: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
dca0: 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20   len);.         
dcb0: 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b   pPreStmt->zSql[
dcc0: 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  len] = 0;.      
dcd0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
dce0: 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64  Add the prepared
dcf0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
dd00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
dd10: 68 65 20 63 61 63 68 65 20 6c 69 73 74 0a 20 20  he cache list.  
dd20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
dd30: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
dd40: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
dd50: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74  ;.        pPreSt
dd60: 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  mt->pPrev = 0;. 
dd70: 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e         if( pDb->
dd80: 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20  stmtList ){.    
dd90: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
dda0: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  st->pPrev = pPre
ddb0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Stmt;.        }.
ddc0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
ddd0: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
dde0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  ;.        if( pD
ddf0: 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29  b->stmtLast==0 )
de00: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
de10: 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d  rt( pDb->nStmt==
de20: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
de30: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
de40: 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  PreStmt;.       
de50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
de60: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e    assert( pDb->n
de70: 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  Stmt>0 );.      
de80: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d    }.        pDb-
de90: 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20  >nStmt++;.   .  
dea0: 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68        /* If we h
deb0: 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61  ave too many sta
dec0: 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c  tement in cache,
ded0: 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70   remove the surp
dee0: 6c 75 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lus from the.   
def0: 20 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74       ** end of t
df00: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 0a 20  he cache list.. 
df10: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
df20: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53    while( pDb->nS
df30: 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74  tmt>pDb->maxStmt
df40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
df50: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
df60: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53  Db->stmtLast->pS
df70: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
df80: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
df90: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
dfa0: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
dfb0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
dfc0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
dfd0: 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Next);.         
dfe0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e   pDb->stmtLast->
dff0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
e000: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d       pDb->nStmt-
e010: 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
e020: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50     }..      /* P
e030: 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65  roceed to the ne
e040: 78 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  xt statement */.
e050: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
e060: 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ft;.    }.    Tc
e070: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_DecrRefCount(o
e080: 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66  bjv[2]);..    if
e090: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
e0a0: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
e0b0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
e0c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
e0d0: 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20  p, pRet);.      
e0e0: 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  }.      Tcl_Decr
e0f0: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
e100: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
e110: 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
e120: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
e130: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d  t(interp);.    }
e140: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
e150: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
e160: 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45  db function NAME
e170: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
e180: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
e190: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  QL function call
e1a0: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
e1b0: 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  er that function
e1c0: 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c   is.  ** called,
e1d0: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
e1e0: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
e1f0: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
e200: 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e  case DB_FUNCTION
e210: 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20  : {.    SqlFunc 
e220: 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f  *pFunc;.    Tcl_
e230: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20  Obj *pScript;.  
e240: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
e250: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
e260: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
e270: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
e280: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
e290: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
e2a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e2b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
e2c0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
e2d0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
e2e0: 2c 20 30 29 3b 0a 20 20 20 20 70 53 63 72 69 70  , 0);.    pScrip
e2f0: 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  t = objv[3];.   
e300: 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c   pFunc = findSql
e310: 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29  Func(pDb, zName)
e320: 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d  ;.    if( pFunc=
e330: 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
e340: 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70  ERROR;.    if( p
e350: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b  Func->pScript ){
e360: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
e370: 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70  efCount(pFunc->p
e380: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20  Script);.    }. 
e390: 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70     pFunc->pScrip
e3a0: 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20  t = pScript;.   
e3b0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
e3c0: 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  t(pScript);.    
e3d0: 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62  pFunc->useEvalOb
e3e0: 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76  jv = safeToUseEv
e3f0: 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70  alObjv(interp, p
e400: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20  Script);.    rc 
e410: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
e420: 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64  _function(pDb->d
e430: 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
e440: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
e450: 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c     pFunc, tclSql
e460: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Func, 0, 0);.   
e470: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e480: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
e490: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e4a0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
e4b0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
e4c0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
e4d0: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
e4e0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65 6c 73  ATILE);.    }els
e4f0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75 73 74  e{.      /* Must
e500: 20 66 6c 75 73 68 20 61 6e 79 20 63 61 63 68 65   flush any cache
e510: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  d statements */.
e520: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
e530: 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20  ache( pDb );.   
e540: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
e550: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
e560: 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d   $db incrblob ?-
e570: 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
e580: 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
e590: 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  D.  */.  case DB
e5a0: 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 20 20 20  _INCRBLOB: {.   
e5b0: 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
e5c0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
e5d0: 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e  har *zDb = "main
e5e0: 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ";.    const cha
e5f0: 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63  r *zTable;.    c
e600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
e610: 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 69  mn;.    sqlite_i
e620: 6e 74 36 34 20 69 52 6f 77 3b 0a 0a 20 20 20 20  nt64 iRow;..    
e630: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
e640: 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f   -readonly optio
e650: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a  n */.    if( obj
e660: 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63  c>3 && strcmp(Tc
e670: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e680: 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  [2]), "-readonly
e690: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
e6a0: 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
e6b0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
e6c0: 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(5+isReadonl
e6d0: 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69  y) && objc!=(6+i
e6e0: 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
e6f0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e700: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
e710: 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c  objv, "?-readonl
e720: 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
e730: 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20  LUMN ROWID");.  
e740: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e750: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
e760: 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73   if( objc==(6+is
e770: 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
e780: 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
e790: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
e7a0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c  .    }.    zTabl
e7b0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
e7c0: 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b  g(objv[objc-3]);
e7d0: 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54  .    zColumn = T
e7e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e7f0: 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20  v[objc-2]);.    
e800: 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  rc = Tcl_GetWide
e810: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
e820: 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c  p, objv[objc-1],
e830: 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66   &iRow);..    if
e840: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
e850: 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74        rc = creat
e860: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
e870: 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65  (.          inte
e880: 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54  rp, pDb, zDb, zT
e890: 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69  able, zColumn, i
e8a0: 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a  Row, isReadonly.
e8b0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
e8c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
e8d0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
e8e0: 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a   interrupt.  **.
e8f0: 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74    ** Interrupt t
e900: 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
e910: 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53  the inner-most S
e920: 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  QL interpreter. 
e930: 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65   This.  ** cause
e940: 73 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  s the SQL statem
e950: 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  ent to return an
e960: 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45   error of SQLITE
e970: 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f  _INTERRUPT..  */
e980: 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52  .  case DB_INTER
e990: 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69  RUPT: {.    sqli
e9a0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44  te3_interrupt(pD
e9b0: 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61  b->db);.    brea
e9c0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
e9d0: 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61  *     $db nullva
e9e0: 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a  lue ?STRING?.  *
e9f0: 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65  *.  ** Change te
ea00: 78 74 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e  xt used when a N
ea10: 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66  ULL comes back f
ea20: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
ea30: 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20  . If ?STRING?.  
ea40: 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  ** is not presen
ea50: 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72  t, then the curr
ea60: 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64 20  ent string used 
ea70: 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  for NULL is retu
ea80: 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54  rned..  ** If ST
ea90: 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c  RING is present,
eaa0: 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20   then STRING is 
eab0: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20  returned..  **. 
eac0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55   */.  case DB_NU
ead0: 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69  LLVALUE: {.    i
eae0: 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
eaf0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
eb00: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
eb10: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
eb20: 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20   "NULLVALUE");. 
eb30: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
eb40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
eb50: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
eb60: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
eb70: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c       char *zNull
eb80: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
eb90: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
eba0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
ebb0: 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a  ( pDb->zNull ){.
ebc0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
ebd0: 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20  (pDb->zNull);.  
ebe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
ebf0: 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29  zNull && len>0 )
ec00: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
ec10: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Null = Tcl_Alloc
ec20: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
ec30: 20 20 20 20 20 73 74 72 6e 63 70 79 28 70 44 62       strncpy(pDb
ec40: 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20  ->zNull, zNull, 
ec50: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44  len);.        pD
ec60: 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20  b->zNull[len] = 
ec70: 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\0';.      }els
ec80: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
ec90: 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  zNull = 0;.     
eca0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c   }.    }.    Tcl
ecb0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
ecc0: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
ecd0: 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a  j(pDb->zNull));.
ece0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ecf0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
ed00: 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  b last_insert_ro
ed10: 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  wid .  **.  ** R
ed20: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
ed30: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52 4f   which is the RO
ed40: 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  WID for the most
ed50: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a   recent insert..
ed60: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c    */.  case DB_L
ed70: 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
ed80: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
ed90: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63  *pResult;.    Tc
eda0: 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b  l_WideInt rowid;
edb0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
edc0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
edd0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ede0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
edf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ee00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ee10: 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74     rowid = sqlit
ee20: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
ee30: 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20  owid(pDb->db);. 
ee40: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
ee50: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
ee60: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
ee70: 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65  etWideIntObj(pRe
ee80: 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20  sult, rowid);.  
ee90: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
eea0: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f  /*.  ** The DB_O
eeb0: 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20  NECOLUMN method 
eec0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74  is implemented t
eed0: 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f  ogether with DB_
eee0: 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  EVAL..  */..  /*
eef0: 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73 73      $db progress
ef00: 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20   ?N CALLBACK?.  
ef10: 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  ** .  ** Invoke 
ef20: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
ef30: 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74 75  ck every N virtu
ef40: 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64  al machine opcod
ef50: 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74 69  es while executi
ef60: 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ng.  ** queries.
ef70: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
ef80: 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20  PROGRESS: {.    
ef90: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
efa0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
efb0: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
efc0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
efd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
efe0: 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a  >zProgress, 0);.
eff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
f000: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
f010: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
f020: 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e  ogress;.      in
f030: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74  t len;.      int
f040: 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43   N;.      if( TC
f050: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
f060: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f070: 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a  objv[2], &N) ){.
f080: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
f090: 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  R;.      };.    
f0a0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
f0b0: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
f0c0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
f0d0: 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20  rogress);.      
f0e0: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73  }.      zProgres
f0f0: 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
f100: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
f110: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
f120: 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20  f( zProgress && 
f130: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
f140: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
f150: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
f160: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
f170: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  strcpy(pDb->zPro
f180: 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73  gress, zProgress
f190: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f1a0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
f1b0: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
f1c0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
f1d0: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
f1e0: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20  _CALLBACK.      
f1f0: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
f200: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ss ){.        pD
f210: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
f220: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
f230: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
f240: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c  dler(pDb->db, N,
f250: 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
f260: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
f270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
f280: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
f290: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
f2a0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
f2b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
f2c0: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
f2d0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f2e0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20  rp, 2, objv, "N 
f2f0: 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
f300: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f310: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
f320: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
f330: 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43    $db profile ?C
f340: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
f350: 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
f360: 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
f370: 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
f380: 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53  ine after each S
f390: 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
f3a0: 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20  * that has run. 
f3b0: 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
f3c0: 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f   SQL and the amo
f3d0: 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69  unt of elapse ti
f3e0: 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65  me are.  ** appe
f3f0: 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
f400: 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69   before the scri
f410: 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a  pt is run..  */.
f420: 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c    case DB_PROFIL
f430: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
f440: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
f450: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f460: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
f470: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
f480: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f490: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
f4a0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
f4b0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
f4c0: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
f4d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f4e0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
f4f0: 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20  zProfile, 0);.  
f500: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
f510: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
f520: 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74  ofile;.      int
f530: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
f540: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
f550: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
f560: 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29  e(pDb->zProfile)
f570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f580: 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47  zProfile = Tcl_G
f590: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f5a0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
f5b0: 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69        if( zProfi
f5c0: 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  le && len>0 ){. 
f5d0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
f5e0: 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  file = Tcl_Alloc
f5f0: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
f600: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
f610: 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66  >zProfile, zProf
f620: 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ile);.      }els
f630: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
f640: 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  zProfile = 0;.  
f650: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
f660: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
f670: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f680: 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
f690: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
f6a0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
f6b0: 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
f6c0: 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66  (pDb->db, DbProf
f6d0: 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  ileHandler, pDb)
f6e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f6f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
f700: 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
f710: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
f720: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
f730: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
f740: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65  .  **     $db re
f750: 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a  key KEY.  **.  *
f760: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63  * Change the enc
f770: 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74  ryption key on t
f780: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
f790: 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  n database..  */
f7a0: 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59  .  case DB_REKEY
f7b0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  : {.    int nKey
f7c0: 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  ;.    void *pKey
f7d0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
f7e0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
f7f0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f800: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
f810: 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
f820: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f830: 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63   }.    pKey = Tc
f840: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
f850: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
f860: 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  nKey);.#ifdef SQ
f870: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
f880: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
f890: 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
f8a0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
f8b0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f8c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f8d0: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
f8e0: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
f8f0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
f900: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
f910: 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
f920: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
f930: 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c   $db timeout MIL
f940: 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20  LESECONDS.  **. 
f950: 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68   ** Delay for th
f960: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
f970: 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69  iseconds specifi
f980: 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69  ed when a file i
f990: 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20  s locked..  */. 
f9a0: 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54   case DB_TIMEOUT
f9b0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a  : {.    int ms;.
f9c0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
f9d0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
f9e0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f9f0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 2, objv, "MILL
fa00: 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
fa10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fa20: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
fa30: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
fa40: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
fa50: 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75  [2], &ms) ) retu
fa60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fa70: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
fa80: 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20  imeout(pDb->db, 
fa90: 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ms);.    break;.
faa0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a    }.  .  /*.  **
fab0: 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63       $db total_c
fac0: 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  hanges.  **.  **
fad0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
fae0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
faf0: 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  were modified, i
fb00: 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65  nserted, or dele
fb10: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
fb20: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
fb30: 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64 2e  dle was created.
fb40: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
fb50: 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b  TOTAL_CHANGES: {
fb60: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
fb70: 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f  esult;.    if( o
fb80: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc!=2 ){.      
fb90: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fba0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
fbb0: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
fbc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fbd0: 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74     }.    pResult
fbe0: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
fbf0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
fc00: 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70   Tcl_SetIntObj(p
fc10: 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f  Result, sqlite3_
fc20: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44  total_changes(pD
fc30: 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
fc40: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
fc50: 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c   $db trace ?CALL
fc60: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
fc70: 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74  Make arrangement
fc80: 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  s to invoke the 
fc90: 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65  CALLBACK routine
fca0: 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74   for each SQL st
fcb0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61  atement.  ** tha
fcc0: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
fcd0: 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
fce0: 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20  SQL is appended 
fcf0: 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f  to CALLBACK befo
fd00: 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78  re.  ** it is ex
fd10: 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  ecuted..  */.  c
fd20: 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a  ase DB_TRACE: {.
fd30: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
fd40: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
fd50: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fd60: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
fd70: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
fd80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fd90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
fda0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
fdb0: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
fdc0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
fdd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fde0: 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  rp, pDb->zTrace,
fdf0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
fe00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
fe10: 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20  ar *zTrace;.    
fe20: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
fe30: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
fe40: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
fe50: 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
fe60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
fe70: 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65   zTrace = Tcl_Ge
fe80: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
fe90: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
fea0: 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20       if( zTrace 
feb0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
fec0: 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
fed0: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
fee0: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
fef0: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 54 72 61  strcpy(pDb->zTra
ff00: 63 65 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 20  ce, zTrace);.   
ff10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ff20: 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20    pDb->zTrace = 
ff30: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
ff40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
ff50: 52 41 43 45 0a 20 20 20 20 20 20 69 66 28 20 70  RACE.      if( p
ff60: 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
ff70: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
ff80: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
ff90: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
ffa0: 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61  e(pDb->db, DbTra
ffb0: 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  ceHandler, pDb);
ffc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ffd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
ffe0: 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ace(pDb->db, 0, 
fff0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
10000 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
10010 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
10020 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e   $db transaction
10030 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d   [-deferred|-imm
10040 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69 76  ediate|-exclusiv
10050 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  e] SCRIPT.  **. 
10060 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20   ** Start a new 
10070 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66 20  transaction (if 
10080 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
10090 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74 20  dy in the midst 
100a0 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61  of a.  ** transa
100b0 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63 75  ction) and execu
100c0 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  te the TCL scrip
100d0 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65 72  t SCRIPT.  After
100e0 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d   SCRIPT.  ** com
100f0 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20 63  pletes, either c
10100 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
10110 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74  ction or roll it
10120 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54 0a   back if SCRIPT.
10130 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20 65    ** throws an e
10140 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66  xception.  Or if
10150 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74 69   no new transati
10160 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  on was started, 
10170 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a  do nothing..  **
10180 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70 74   pass the except
10190 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73 74  ion on up the st
101a0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
101b0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  his command was 
101c0 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76 65  inspired by Dave
101d0 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f   Thomas's talk o
101e0 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20 20  n Ruby at the.  
101f0 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c 79  ** 2005 O'Reilly
10200 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e   Open Source Con
10210 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e  vention (OSCON).
10220 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
10230 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20  TRANSACTION: {. 
10240 20 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 3b 0a     int inTrans;.
10250 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
10260 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ript;.    const 
10270 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22  char *zBegin = "
10280 42 45 47 49 4e 22 3b 0a 20 20 20 20 69 66 28 20  BEGIN";.    if( 
10290 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21  objc!=3 && objc!
102a0 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =4 ){.      Tcl_
102b0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
102c0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b  erp, 2, objv, "[
102d0 54 59 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a  TYPE] SCRIPT");.
102e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
102f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10300 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
10310 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
10320 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 7d 20   objv[2];.    } 
10330 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74 61  else {.      sta
10340 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
10350 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b  TTYPE_strs[] = {
10360 0a 20 20 20 20 20 20 20 20 22 64 65 66 65 72 72  .        "deferr
10370 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76  ed",   "exclusiv
10380 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22  e",  "immediate"
10390 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  , 0.      };.   
103a0 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e     enum TTYPE_en
103b0 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59  um {.        TTY
103c0 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59  PE_DEFERRED, TTY
103d0 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54  PE_EXCLUSIVE, TT
103e0 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20  YPE_IMMEDIATE.  
103f0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74      };.      int
10400 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66   ttype;.      if
10410 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
10420 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
10430 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72  jv[2], TTYPE_str
10440 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20  s, "transaction 
10450 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20  type",.         
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 20       0, &ttype) 
10480 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
10490 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
104a0 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63     }.      switc
104b0 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65  h( (enum TTYPE_e
104c0 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20  num)ttype ){.   
104d0 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
104e0 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20  DEFERRED:    /* 
104f0 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20  no-op */;       
10500 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10510 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54  .        case TT
10520 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20  YPE_EXCLUSIVE:  
10530 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e   zBegin = "BEGIN
10540 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72   EXCLUSIVE";  br
10550 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
10560 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54  e TTYPE_IMMEDIAT
10570 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42  E:   zBegin = "B
10580 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b  EGIN IMMEDIATE";
10590 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
105a0 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
105b0 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a   objv[3];.    }.
105c0 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 21 73      inTrans = !s
105d0 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
105e0 6f 6d 6d 69 74 28 70 44 62 2d 3e 64 62 29 3b 0a  ommit(pDb->db);.
105f0 20 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73      if( !inTrans
10600 20 29 7b 0a 20 20 20 20 20 20 28 76 6f 69 64 29   ){.      (void)
10610 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
10620 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c  ->db, zBegin, 0,
10630 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
10640 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
10650 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63  bjEx(interp, pSc
10660 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  ript, 0);.    if
10670 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20  ( !inTrans ){.  
10680 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10690 7a 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  zEnd;.      if( 
106a0 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b  rc==TCL_ERROR ){
106b0 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20  .        zEnd = 
106c0 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
106d0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
106e0 20 20 20 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d 49     zEnd = "COMMI
106f0 54 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T";.      }.    
10700 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
10710 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45  exec(pDb->db, zE
10720 6e 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nd, 0, 0, 0);.  
10730 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
10740 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
10750 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
10760 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
10770 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
10780 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
10790 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41  /.  case DB_UPDA
107a0 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65  TE_HOOK: .  case
107b0 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
107c0 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74  K: {..    /* set
107d0 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74   ppHook to point
107e0 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20   at pUpdateHook 
107f0 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  or pRollbackHook
10800 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a  , depending on .
10810 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b      ** whether [
10820 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d  $db update_hook]
10830 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63   or [$db rollbac
10840 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f  k_hook] was invo
10850 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
10860 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b  Tcl_Obj **ppHook
10870 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63  ; .    if( choic
10880 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f  e==DB_UPDATE_HOO
10890 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f  K ){.      ppHoo
108a0 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74  k = &pDb->pUpdat
108b0 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  eHook;.    }else
108c0 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d  {.      ppHook =
108d0 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   &pDb->pRollback
108e0 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hook;.    }..   
108f0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
10900 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
10910 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10920 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10930 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b  jv, "?SCRIPT?");
10940 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  .       return T
10950 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10960 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20      if( *ppHook 
10970 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
10980 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
10990 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  , *ppHook);.    
109a0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
109b0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
109c0 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
109d0 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 48  k);.        *ppH
109e0 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ook = 0;.      }
109f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
10a00 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
10a10 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f  assert( !(*ppHoo
10a20 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  k) );.      if( 
10a30 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74  Tcl_GetCharLengt
10a40 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a  h(objv[2])>0 ){.
10a50 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20          *ppHook 
10a60 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20  = objv[2];.     
10a70 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
10a80 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
10a90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10aa0 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f   sqlite3_update_
10ab0 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70  hook(pDb->db, (p
10ac0 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f  Db->pUpdateHook?
10ad0 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a  DbUpdateHandler:
10ae0 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20 73 71  0), pDb);.    sq
10af0 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
10b00 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44 62  ook(pDb->db,(pDb
10b10 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f  ->pRollbackHook?
10b20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65  DbRollbackHandle
10b30 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20  r:0),pDb);..    
10b40 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10b50 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a      $db version.
10b60 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
10b70 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72   the version str
10b80 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74  ing for this dat
10b90 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
10ba0 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b  se DB_VERSION: {
10bb0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
10bc0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
10bd0 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65   *)sqlite3_libve
10be0 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41  rsion(), TCL_STA
10bf0 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  TIC);.    break;
10c00 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e  .  }...  } /* En
10c10 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20  d of the SWITCH 
10c20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72  statement */.  r
10c30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10c40 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e  **   sqlite3 DBN
10c50 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f  AME FILENAME ?MO
10c60 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a 2a  DE? ?-key KEY?.*
10c70 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
10c80 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e   main Tcl comman
10c90 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71  d.  When the "sq
10ca0 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  lite" Tcl comman
10cb0 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c  d is.** invoked,
10cc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
10cd0 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ns to process th
10ce0 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  at command..**.*
10cf0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
10d00 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73  ment, DBNAME, is
10d10 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61   an arbitrary na
10d20 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20  me for a new.** 
10d30 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10d40 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ion.  This comma
10d50 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  nd creates a new
10d60 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a   command named.*
10d70 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73  * DBNAME that is
10d80 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c   used to control
10d90 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   that connection
10da0 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a  .  The database.
10db0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  ** connection is
10dc0 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
10dd0 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64  e DBNAME command
10de0 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
10df0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
10e00 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
10e10 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
10e20 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
10e30 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 20  s.** the sqlite 
10e40 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
10e50 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
10e60 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69  .**.** For testi
10e70 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65 20  ng purposes, we 
10e80 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74 68 65  also support the
10e90 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
10ea0 2a 20 20 73 71 6c 69 74 65 33 20 2d 65 6e 63 6f  *  sqlite3 -enco
10eb0 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ding.**.**      
10ec0 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e 63 6f   Return the enco
10ed0 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c 49 4b  ding used by LIK
10ee0 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61  E and GLOB opera
10ef0 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73 0a 2a  tors.  Choices.*
10f00 2a 20 20 20 20 20 20 20 61 72 65 20 55 54 46 2d  *       are UTF-
10f10 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e 0a 2a  8 and iso8859..*
10f20 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 76  *.**  sqlite3 -v
10f30 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  ersion.**.**    
10f40 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 65     Return the ve
10f50 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20  rsion number of 
10f60 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
10f70 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  ry..**.**  sqlit
10f80 65 33 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66  e3 -tcl-uses-utf
10f90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74  .**.**       Ret
10fa0 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d 70 69  urn "1" if compi
10fb0 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c 20 75  led with a Tcl u
10fc0 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65 74 75  ses UTF-8.  Retu
10fd0 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20 20 20  rn "0" if.**    
10fe0 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20 62 79     not.  Used by
10ff0 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65 20 73   tests to make s
11000 75 72 65 20 74 68 65 20 6c 69 62 72 61 72 79 20  ure the library 
11010 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a  was compiled .**
11020 20 20 20 20 20 20 20 63 6f 72 72 65 63 74 6c 79         correctly
11030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11040 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c  DbMain(void *cd,
11050 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
11060 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
11070 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
11080 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
11090 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  p;.  void *pKey 
110a0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  = 0;.  int nKey 
110b0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
110c0 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20  r *zArg;.  char 
110d0 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e 73  *zErrMsg;.  cons
110e0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
110f0 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61   Tcl_DString tra
11100 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b  nslatedFilename;
11110 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
11120 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
11130 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11140 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
11150 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
11160 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  rg,"-version")==
11170 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
11180 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11190 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rp,sqlite3_versi
111a0 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74  on,0);.      ret
111b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
111c0 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
111d0 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65  (zArg,"-has-code
111e0 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  c")==0 ){.#ifdef
111f0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
11200 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  C.      Tcl_Appe
11210 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11220 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20  "1",0);.#else.  
11230 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11240 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c  sult(interp,"0",
11250 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
11260 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11270 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
11280 72 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d  rcmp(zArg,"-tcl-
11290 75 73 65 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b  uses-utf")==0 ){
112a0 0a 23 69 66 64 65 66 20 54 43 4c 5f 55 54 46 5f  .#ifdef TCL_UTF_
112b0 4d 41 58 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  MAX.      Tcl_Ap
112c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
112d0 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a  p,"1",0);.#else.
112e0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
112f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30  Result(interp,"0
11300 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ",0);.#endif.   
11310 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
11320 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11330 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a  ( objc==5 || obj
11340 63 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==6 ){.    zArg
11350 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11360 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a  FromObj(objv[obj
11370 63 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  c-2], 0);.    if
11380 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
11390 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  key")==0 ){.    
113a0 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
113b0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
113c0 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26  (objv[objc-1], &
113d0 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a  nKey);.      obj
113e0 63 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  c -= 2;.    }.  
113f0 7d 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  }.  if( objc!=3 
11400 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
11410 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
11420 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
11430 6a 76 2c 20 0a 23 69 66 64 65 66 20 53 51 4c 49  jv, .#ifdef SQLI
11440 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
11450 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e     "HANDLE FILEN
11460 41 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d  AME ?-key CODEC-
11470 4b 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20  KEY?".#else.    
11480 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
11490 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69  ME ?MODE?".#endi
114a0 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74  f.    );.    ret
114b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
114c0 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30   }.  zErrMsg = 0
114d0 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44  ;.  p = (SqliteD
114e0 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  b*)Tcl_Alloc( si
114f0 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
11500 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  ( p==0 ){.    Tc
11510 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
11520 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  rp, "malloc fail
11530 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ed", TCL_STATIC)
11540 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
11550 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65  _ERROR;.  }.  me
11560 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
11570 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20  f(*p));.  zFile 
11580 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
11590 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
115a0 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  0);.  zFile = Tc
115b0 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e  l_TranslateFileN
115c0 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c  ame(interp, zFil
115d0 65 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69  e, &translatedFi
115e0 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  lename);.  sqlit
115f0 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 26  e3_open(zFile, &
11600 70 2d 3e 64 62 29 3b 0a 20 20 54 63 6c 5f 44 53  p->db);.  Tcl_DS
11610 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73  tringFree(&trans
11620 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
11630 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
11640 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  =sqlite3_errcode
11650 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a  (p->db) ){.    z
11660 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
11670 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
11680 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
11690 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  >db));.    sqlit
116a0 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b  e3_close(p->db);
116b0 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a  .    p->db = 0;.
116c0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
116d0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71  E_HAS_CODEC.  sq
116e0 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c  lite3_key(p->db,
116f0 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65   pKey, nKey);.#e
11700 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62  ndif.  if( p->db
11710 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
11720 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
11730 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f   zErrMsg, TCL_VO
11740 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c  LATILE);.    Tcl
11750 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b  _Free((char*)p);
11760 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
11770 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
11780 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11790 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74  ;.  }.  p->maxSt
117a0 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45  mt = NUM_PREPARE
117b0 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e  D_STMTS;.  p->in
117c0 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
117d0 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
117e0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
117f0 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  v[1], 0);.  Tcl_
11800 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
11810 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
11820 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
11830 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
11840 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c  ..  /* If compil
11850 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54  ed with SQLITE_T
11860 45 53 54 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74  EST turned on, t
11870 68 65 6e 20 72 65 67 69 73 74 65 72 20 74 68 65  hen register the
11880 20 22 6d 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53   "md5sum".  ** S
11890 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  QL function..  *
118a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
118b0 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74  TEST.  {.    ext
118c0 65 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67  ern void Md5_Reg
118d0 69 73 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b  ister(sqlite3*);
118e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
118f0 45 4d 44 45 42 55 47 0a 20 20 20 20 69 6e 74 20  EMDEBUG.    int 
11900 6d 61 6c 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c  mallocfail = sql
11910 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
11920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d  ;.    sqlite3_iM
11930 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23  allocFail = 0;.#
11940 65 6e 64 69 66 0a 20 20 20 20 4d 64 35 5f 52 65  endif.    Md5_Re
11950 67 69 73 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23  gister(p->db);.#
11960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
11970 44 45 42 55 47 0a 20 20 20 20 73 71 6c 69 74 65  DEBUG.    sqlite
11980 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20  3_iMallocFail = 
11990 6d 61 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64  mallocfail;.#end
119a0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a  if.  }.#endif  .
119b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
119c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  .}../*.** Provid
119d0 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e  e a dummy Tcl_In
119e0 69 74 53 74 75 62 73 20 69 66 20 77 65 20 61 72  itStubs if we ar
119f0 65 20 75 73 69 6e 67 20 74 68 69 73 20 61 73 20  e using this as 
11a00 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72  a static.** libr
11a10 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ary..*/.#ifndef 
11a20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20  USE_TCL_STUBS.# 
11a30 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53  undef  Tcl_InitS
11a40 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63  tubs.# define Tc
11a50 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c  l_InitStubs(a,b,
11a60 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
11a70 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
11a80 76 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52  ve a PACKAGE_VER
11a90 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e  SION macro defin
11aa0 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62  ed.  This will b
11ab0 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74  e.** defined aut
11ac0 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68  omatically by th
11ad0 65 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20  e TEA makefile. 
11ae0 20 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66   But other makef
11af0 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64  iles.** do not d
11b00 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66  efine it..*/.#if
11b10 6e 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52  ndef PACKAGE_VER
11b20 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41  SION.# define PA
11b30 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51  CKAGE_VERSION SQ
11b40 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e  LITE_VERSION.#en
11b50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  dif../*.** Initi
11b60 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
11b70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63  e..**.** This Tc
11b80 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e  l module contain
11b90 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
11ba0 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  new Tcl command 
11bb0 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a  named "sqlite"..
11bc0 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20  ** (Hence there 
11bd0 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e  is no namespace.
11be0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f    There is no po
11bf0 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e  int in using a n
11c00 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74  amespace.** if t
11c10 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c  he extension onl
11c20 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e  y supplies one n
11c30 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22  ew name!)  The "
11c40 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20  sqlite" command 
11c50 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70  is.** used to op
11c60 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20  en a new SQLite 
11c70 64 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74  database.  See t
11c80 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74  he DbMain() rout
11c90 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72  ine above.** for
11ca0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
11cb0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45 58 54 45  rmation..*/.EXTE
11cc0 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49  RN int Sqlite3_I
11cd0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
11ce0 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49  interp){.  Tcl_I
11cf0 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
11d00 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63   "8.4", 0);.  Tc
11d10 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
11d20 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
11d30 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d  te3", (Tcl_ObjCm
11d40 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30  dProc*)DbMain, 0
11d50 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50  , 0);.  Tcl_PkgP
11d60 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
11d70 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47  sqlite3", PACKAG
11d80 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 54 63  E_VERSION);.  Tc
11d90 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
11da0 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
11db0 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64  te", (Tcl_ObjCmd
11dc0 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c  Proc*)DbMain, 0,
11dd0 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72   0);.  Tcl_PkgPr
11de0 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73  ovide(interp, "s
11df0 71 6c 69 74 65 22 2c 20 50 41 43 4b 41 47 45 5f  qlite", PACKAGE_
11e00 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72 65 74 75  VERSION);.  retu
11e10 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54  rn TCL_OK;.}.EXT
11e20 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74  ERN int Tclsqlit
11e30 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  e3_Init(Tcl_Inte
11e40 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
11e50 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  urn Sqlite3_Init
11e60 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45  (interp); }.EXTE
11e70 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53  RN int Sqlite3_S
11e80 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
11e90 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
11ea0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
11eb0 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
11ec0 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  te3_SafeInit(Tcl
11ed0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
11ee0 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
11ef0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
11f00 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59  TE_3_SUFFIX_ONLY
11f10 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
11f20 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  te_Init(Tcl_Inte
11f30 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
11f40 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  urn Sqlite3_Init
11f50 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45  (interp); }.EXTE
11f60 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
11f70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
11f80 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
11f90 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
11fa0 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e  nterp); }.EXTERN
11fb0 20 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65   int Sqlite_Safe
11fc0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
11fd0 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
11fe0 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
11ff0 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  N int Tclsqlite_
12000 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
12010 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
12020 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23  turn TCL_OK; }.#
12030 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43  endif..#ifdef TC
12040 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LSH./***********
12050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12090 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
120a0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75  hat follows is u
120b0 73 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61  sed to build sta
120c0 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65  ndalone TCL inte
120d0 72 70 72 65 74 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a  rpreters.*/../*.
120e0 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
120f0 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68  TCLSH is one, th
12100 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74  en put in code t
12110 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22  his for the.** "
12120 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68  main" routine th
12130 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69  at will initiali
12140 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20  ze Tcl and take 
12150 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74  input from.** st
12160 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f  andard input..*/
12170 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74  .#if TCLSH==1.st
12180 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
12190 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c  oop[] =.  "set l
121a0 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69  ine {}\n".  "whi
121b0 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d  le {![eof stdin]
121c0 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b  } {\n".    "if {
121d0 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  $line!=\"\"} {\n
121e0 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
121f0 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c  onewline \"> \"\
12200 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  n".    "} else {
12210 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20  \n".      "puts 
12220 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c  -nonewline \"% \
12230 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  "\n".    "}\n". 
12240 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74     "flush stdout
12250 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20  \n".    "append 
12260 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e  line [gets stdin
12270 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69  ]\n".    "if {[i
12280 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69  nfo complete $li
12290 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  ne]} {\n".      
122a0 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c  "if {[catch {upl
122b0 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72  evel #0 $line} r
122c0 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20  esult]} {\n".   
122d0 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72       "puts stder
122e0 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75  r \"Error: $resu
122f0 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d  lt\"\n".      "}
12300 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
12310 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
12320 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75       "puts $resu
12330 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e  lt\n".      "}\n
12340 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e  ".      "set lin
12350 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65  e {}\n".    "} e
12360 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
12370 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c  append line \\n\
12380 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22  n".    "}\n".  "
12390 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f  }\n".;.#endif../
123a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
123b0 6f 20 54 43 4c 53 48 20 69 73 20 74 77 6f 2c 20  o TCLSH is two, 
123c0 74 68 65 6e 20 67 65 74 20 74 68 65 20 6d 61 69  then get the mai
123d0 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20  n loop code out 
123e0 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61  of.** the separa
123f0 74 65 20 66 69 6c 65 20 22 73 70 61 63 65 61 6e  te file "spacean
12400 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69  al_tcl.h"..*/.#i
12410 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69  f TCLSH==2.stati
12420 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
12430 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22  [] = .#include "
12440 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22  spaceanal_tcl.h"
12450 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .;.#endif..#defi
12460 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
12470 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
12480 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
12490 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
124a0 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
124b0 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
124c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
124d0 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  rp;.  Tcl_FindEx
124e0 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
124f0 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63  );.  interp = Tc
12500 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
12510 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  ;.  Sqlite3_Init
12520 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66  (interp);.#ifdef
12530 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
12540 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
12550 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
12560 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
12570 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
12580 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54  litetest2_Init(T
12590 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
125a0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
125b0 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c  tetest3_Init(Tcl
125c0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
125d0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
125e0 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49  test4_Init(Tcl_I
125f0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
12600 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
12610 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st5_Init(Tcl_Int
12620 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
12630 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
12640 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  6_Init(Tcl_Inter
12650 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
12660 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f  int Sqlitetest7_
12670 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
12680 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
12690 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e  t Sqlitetest8_In
126a0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
126b0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
126c0 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
126d0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
126e0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64     extern int Md
126f0 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  5_Init(Tcl_Inter
12700 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
12710 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 73  int Sqlitetestss
12720 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
12730 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
12740 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73  int Sqlitetestas
12750 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ync_Init(Tcl_Int
12760 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
12770 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
12780 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f  tclvar_Init(Tcl_
12790 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
127a0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
127b0 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54  estschema_Init(T
127c0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
127d0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
127e0 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
127f0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
12800 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
12810 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69   Sqlitetest_hexi
12820 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  o_Init(Tcl_Inter
12830 70 2a 29 3b 0a 0a 20 20 20 20 53 71 6c 69 74 65  p*);..    Sqlite
12840 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72  test1_Init(inter
12850 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
12860 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st2_Init(interp)
12870 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
12880 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
12890 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f      Sqlitetest4_
128a0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
128b0 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e    Sqlitetest5_In
128c0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
128d0 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74  Sqlitetest6_Init
128e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
128f0 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 69  litetest7_Init(i
12900 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
12910 74 65 74 65 73 74 38 5f 49 6e 69 74 28 69 6e 74  tetest8_Init(int
12920 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
12930 74 65 73 74 39 5f 49 6e 69 74 28 69 6e 74 65 72  test9_Init(inter
12940 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
12950 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74  stasync_Init(int
12960 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
12970 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
12980 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
12990 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
129a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
129b0 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65  Sqlitetest_autoe
129c0 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  xt_Init(interp);
129d0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
129e0 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72  hexio_Init(inter
129f0 70 29 3b 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74  p);.    Md5_Init
12a00 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66  (interp);.#ifdef
12a10 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20   SQLITE_SSE.    
12a20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e  Sqlitetestsse_In
12a30 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
12a40 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
12a50 69 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54  if( argc>=2 || T
12a60 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69  CLSH==2 ){.    i
12a70 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a  nt i;.    char z
12a80 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71  Argc[32];.    sq
12a90 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
12aa0 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41  izeof(zArgc), zA
12ab0 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d  rgc, "%d", argc-
12ac0 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20 20  (3-TCLSH));.    
12ad0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
12ae0 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67 63 2c  p,"argc", zArgc,
12af0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
12b00 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
12b10 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22  r(interp,"argv0"
12b20 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f  ,argv[1],TCL_GLO
12b30 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
12b40 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
12b50 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c  ,"argv", "", TCL
12b60 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
12b70 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48     for(i=3-TCLSH
12b80 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
12b90 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
12ba0 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
12bb0 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
12bc0 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
12bd0 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
12be0 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
12bf0 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
12c00 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d  }.    if( TCLSH=
12c10 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69  =1 && Tcl_EvalFi
12c20 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
12c30 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  1])!=TCL_OK ){. 
12c40 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
12c50 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74  *zInfo = Tcl_Get
12c60 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72  Var(interp, "err
12c70 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f  orInfo", TCL_GLO
12c80 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BAL_ONLY);.     
12c90 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20   if( zInfo==0 ) 
12ca0 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e  zInfo = interp->
12cb0 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70  result;.      fp
12cc0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
12cd0 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20  : %s\n", *argv, 
12ce0 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65  zInfo);.      re
12cf0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
12d00 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d 31 20  }.  if( argc<=1 
12d10 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20  || TCLSH==2 ){. 
12d20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61     Tcl_GlobalEva
12d30 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c  l(interp, zMainl
12d40 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  oop);.  }.  retu
12d50 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
12d60 2a 20 54 43 4c 53 48 20 2a 2f 0a                 * TCLSH */.