/ Hex Artifact Content
Login

Artifact 075616e270b5e9986f09eac28914b8261ea312e8:


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 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 74  ite.**.** $Id: t
01a0: 63 6c 73 71 6c 69 74 65 2e 63 2c 76 20 31 2e 31  clsqlite.c,v 1.1
01b0: 36 38 20 32 30 30 36 2f 30 38 2f 32 34 20 30 32  68 2006/08/24 02
01c0: 3a 34 32 3a 32 38 20 64 72 68 20 45 78 70 20 24  :42:28 drh Exp $
01d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54  .*/.#ifndef NO_T
01e0: 43 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74  CL     /* Omit t
01f0: 68 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69  his whole file i
0200: 66 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c  f TCL is unavail
0210: 61 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  able */..#includ
0220: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0230: 23 69 6e 63 6c 75 64 65 20 22 68 61 73 68 2e 68  #include "hash.h
0240: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
0250: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0260: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0270: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0280: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0290: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
02a0: 3e 0a 0a 2f 2a 0a 20 2a 20 57 69 6e 64 6f 77 73  >../*. * Windows
02b0: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
02c0: 68 69 63 68 20 73 79 6d 62 6f 6c 73 20 74 6f 20  hich symbols to 
02d0: 65 78 70 6f 72 74 2e 20 20 55 6e 69 78 20 64 6f  export.  Unix do
02e0: 65 73 20 6e 6f 74 2e 0a 20 2a 20 42 55 49 4c 44  es not.. * BUILD
02f0: 5f 73 71 6c 69 74 65 20 73 68 6f 75 6c 64 20 62  _sqlite should b
0300: 65 20 75 6e 64 65 66 69 6e 65 64 20 66 6f 72 20  e undefined for 
0310: 55 6e 69 78 2e 0a 20 2a 2f 0a 23 69 66 64 65 66  Unix.. */.#ifdef
0320: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 0a 23 75   BUILD_sqlite.#u
0330: 6e 64 65 66 20 54 43 4c 5f 53 54 4f 52 41 47 45  ndef TCL_STORAGE
0340: 5f 43 4c 41 53 53 0a 23 64 65 66 69 6e 65 20 54  _CLASS.#define T
0350: 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53  CL_STORAGE_CLASS
0360: 20 44 4c 4c 45 58 50 4f 52 54 0a 23 65 6e 64 69   DLLEXPORT.#endi
0370: 66 20 2f 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74  f /* BUILD_sqlit
0380: 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4e 55  e */..#define NU
0390: 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  M_PREPARED_STMTS
03a0: 20 31 30 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f   10.#define MAX_
03b0: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31  PREPARED_STMTS 1
03c0: 30 30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c  00../*.** If TCL
03d0: 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e 64 20   uses UTF-8 and 
03e0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66 69 67  SQLite is config
03f0: 75 72 65 64 20 74 6f 20 75 73 65 20 69 73 6f 38  ured to use iso8
0400: 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20  859, then we.** 
0410: 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74 72 61  have to do a tra
0420: 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f  nslation when go
0430: 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20  ing between the 
0440: 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20 0a 2a  two.  Set the .*
0450: 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f  * UTF_TRANSLATIO
0460: 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f 20 74  N_NEEDED macro t
0470: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
0480: 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a  we need to do.**
0490: 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f   this translatio
04a0: 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  n.  .*/.#if defi
04b0: 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29  ned(TCL_UTF_MAX)
04c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
04d0: 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65 66 69  ITE_UTF8).# defi
04e0: 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ne UTF_TRANSLATI
04f0: 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e 64  ON_NEEDED 1.#end
0500: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51  if../*.** New SQ
0510: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  L functions can 
0520: 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43  be created as TC
0530: 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68  L scripts.  Each
0540: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a   such function.*
0550: 2a 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62  * is described b
0560: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  y an instance of
0570: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0580: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
0590: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 46  edef struct SqlF
05a0: 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72  unc SqlFunc;.str
05b0: 75 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20  uct SqlFunc {.  
05c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
05d0: 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  rp;   /* The TCL
05e0: 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78   interpret to ex
05f0: 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69  ecute the functi
0600: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  on */.  Tcl_Obj 
0610: 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20 2f 2a  *pScript;     /*
0620: 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70   The Tcl_Obj rep
0630: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
0640: 68 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69  he script */.  i
0650: 6e 74 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20  nt useEvalObjv; 
0660: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0670: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
0680: 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a  e Tcl_EvalObjv *
0690: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
06a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
06b0: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
06c0: 6f 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20  on */.  SqlFunc 
06d0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a  *pNext;       /*
06e0: 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f   Next function o
06f0: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68  n the list of th
0700: 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  em all */.};../*
0710: 0a 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f  .** New collatio
0720: 6e 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63  n sequences func
0730: 74 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61  tion can be crea
0740: 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70  ted as TCL scrip
0750: 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a  ts.  Each such.*
0760: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65  * function is de
0770: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0780: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0790: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
07a0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
07b0: 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20  ruct SqlCollate 
07c0: 53 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75  SqlCollate;.stru
07d0: 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a  ct SqlCollate {.
07e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
07f0: 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54  terp;   /* The T
0800: 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20  CL interpret to 
0810: 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63  execute the func
0820: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
0830: 7a 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20  zScript;        
0840: 2f 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f  /* The script to
0850: 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c   be run */.  Sql
0860: 43 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20  Collate *pNext; 
0870: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
0880: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
0890: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
08a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  ;../*.** Prepare
08b0: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  d statements are
08c0: 20 63 61 63 68 65 64 20 66 6f 72 20 66 61 73 74   cached for fast
08d0: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45  er execution.  E
08e0: 61 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  ach prepared.** 
08f0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73  statement is des
0900: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
0910: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0920: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0930: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0940: 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  uct SqlPreparedS
0950: 74 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  tmt SqlPreparedS
0960: 74 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50  tmt;.struct SqlP
0970: 72 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20  reparedStmt {.  
0980: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
0990: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
09a0: 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20   in linked list 
09b0: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
09c0: 53 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a  Stmt *pPrev;  /*
09d0: 20 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65   Previous on the
09e0: 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
09f0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
0a00: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
0a10: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
0a20: 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20  .  int nSql;    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
0a40: 68 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a  hars in zSql[] *
0a50: 2f 0a 20 20 63 68 61 72 20 7a 53 71 6c 5b 31 5d  /.  char zSql[1]
0a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0a70: 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  Text of the SQL 
0a80: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a  statement */.};.
0a90: 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  ./*.** There is 
0aa0: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
0ab0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
0ac0: 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20 64  or each SQLite d
0ad0: 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20  atabase.** that 
0ae0: 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  has been opened 
0af0: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54 43  by the SQLite TC
0b00: 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  L interface..*/.
0b10: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0b20: 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44 62  qliteDb SqliteDb
0b30: 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ;.struct SqliteD
0b40: 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b {.  sqlite3 *d
0b50: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0b60: 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64   /* The "real" d
0b70: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
0b80: 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52 53 54  e. MUST BE FIRST
0b90: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
0ba0: 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20   *interp;       
0bb0: 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65   /* The interpre
0bc0: 74 65 72 20 75 73 65 64 20 66 6f 72 20 74 68 69  ter used for thi
0bd0: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
0be0: 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20  char *zBusy;    
0bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0c00: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
0c10: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0c20: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20  r *zCommit;     
0c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
0c40: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62  ommit hook callb
0c50: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
0c60: 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20   char *zTrace;  
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0c80: 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63  he trace callbac
0c90: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0ca0: 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20  har *zProfile;  
0cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0cc0: 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63   profile callbac
0cd0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0ce0: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20  har *zProgress; 
0cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0d00: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
0d10: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0d20: 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20  char *zAuth;    
0d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0d40: 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  e authorization 
0d50: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0d60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c   */.  char *zNul
0d70: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0d80: 20 2f 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73   /* Text to subs
0d90: 74 69 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51  titute for an SQ
0da0: 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  L NULL value */.
0db0: 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
0dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0dd0: 4c 69 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63  List of SQL func
0de0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  tions */.  Tcl_O
0df0: 62 6a 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b  bj *pUpdateHook;
0e00: 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
0e10: 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20  hook script (if 
0e20: 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  any) */.  Tcl_Ob
0e30: 6a 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  j *pRollbackHook
0e40: 3b 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  ;    /* Rollback
0e50: 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66   hook script (if
0e60: 20 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f   any) */.  SqlCo
0e70: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
0e80: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
0e90: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
0ea0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
0eb0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
0ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
0ed0: 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20  rn code of most 
0ee0: 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  recent sqlite3_e
0ef0: 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f  xec() */.  Tcl_O
0f00: 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64  bj *pCollateNeed
0f10: 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  ed;   /* Collati
0f20: 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70 74  on needed script
0f30: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
0f40: 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b  dStmt *stmtList;
0f50: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70   /* List of prep
0f60: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a  ared statements*
0f70: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
0f80: 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f  tmt *stmtLast; /
0f90: 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74  * Last statement
0fa0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
0fb0: 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20    int maxStmt;  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0fd0: 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d  The next maximum
0fe0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c   number of stmtL
0ff0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74  ist */.  int nSt
1000: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
1010: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1020: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73   statements in s
1030: 74 6d 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f  tmtList */.};../
1040: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65  *.** Look at the
1050: 20 73 63 72 69 70 74 20 70 72 65 66 69 78 20 69   script prefix i
1060: 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c  n pCmd.  We will
1070: 20 62 65 20 65 78 65 63 75 74 69 6e 67 20 74 68   be executing th
1080: 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74  is script.** aft
1090: 65 72 20 66 69 72 73 74 20 61 70 70 65 6e 64 69  er first appendi
10a0: 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61  ng one or more a
10b0: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20  rguments.  This 
10c0: 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
10d0: 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20 74  .** the script t
10e0: 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20 73  o see if it is s
10f0: 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45  afe to use Tcl_E
1100: 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65  valObjv() on the
1110: 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65   script.** rathe
1120: 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20  r than the more 
1130: 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c  general Tcl_Eval
1140: 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f  Ex().  Tcl_EvalO
1150: 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a  bjv() is much.**
1160: 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53   faster..**.** S
1170: 63 72 69 70 74 73 20 74 68 61 74 20 61 72 65 20  cripts that are 
1180: 73 61 66 65 20 74 6f 20 75 73 65 20 77 69 74 68  safe to use with
1190: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
11a0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
11b0: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f   command name fo
11c0: 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f  llowed by zero o
11d0: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
11e0: 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f   with no [...] o
11f0: 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20  r $.** or {...} 
1200: 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20  or ; to be seen 
1210: 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20  anywhere.  Most 
1220: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73  callback scripts
1230: 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a   consist.** of j
1240: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  ust a single pro
1250: 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20  cedure name and 
1260: 74 68 65 79 20 6d 65 65 74 20 74 68 69 73 20 72  they meet this r
1270: 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  equirement..*/.s
1280: 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f  tatic int safeTo
1290: 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f  UseEvalObjv(Tcl_
12a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
12b0: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a  Tcl_Obj *pCmd){.
12c0: 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72    /* We could tr
12d0: 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  y to do somethin
12e0: 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65  g with Tcl_Parse
12f0: 28 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  ().  But we will
1300: 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75   instead.  ** ju
1310: 73 74 20 64 6f 20 61 20 73 65 61 72 63 68 20 66  st do a search f
1320: 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61  or forbidden cha
1330: 72 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79  racters.  If any
1340: 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64 65   of the forbidde
1350: 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72  n.  ** character
1360: 73 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64  s appear in pCmd
1370: 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74  , we will report
1380: 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 75   the string as u
1390: 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f  nsafe..  */.  co
13a0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
13b0: 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f  nt n;.  z = Tcl_
13c0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
13d0: 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68  (pCmd, &n);.  wh
13e0: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
13f0: 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b      int c = *(z+
1400: 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  +);.    if( c=='
1410: 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20  $' || c=='[' || 
1420: 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20  c==';' ) return 
1430: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1440: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  1;.}../*.** Find
1450: 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75   an SqlFunc stru
1460: 63 74 75 72 65 20 77 69 74 68 20 74 68 65 20 67  cture with the g
1470: 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63  iven name.  Or c
1480: 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f  reate a new.** o
1490: 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ne if an existin
14a0: 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20  g one cannot be 
14b0: 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61  found.  Return a
14c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
14d0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
14e0: 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20  .static SqlFunc 
14f0: 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c  *findSqlFunc(Sql
1500: 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73  iteDb *pDb, cons
1510: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1520: 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70    SqlFunc *p, *p
1530: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
1540: 70 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a  pNew = (SqlFunc*
1550: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
1560: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c  of(*pNew) + strl
1570: 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b  en(zName) + 1 );
1580: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d  .  pNew->zName =
1590: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
15a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
15b0: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65  me[i]; i++){ pNe
15c0: 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f  w->zName[i] = to
15d0: 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b  lower(zName[i]);
15e0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65   }.  pNew->zName
15f0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  [i] = 0;.  for(p
1600: 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20  =pDb->pFunc; p; 
1610: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20  p=p->pNext){ .  
1620: 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e    if( strcmp(p->
1630: 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61  zName, pNew->zNa
1640: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
1650: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
1660: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74  pNew);.      ret
1670: 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn p;.    }.  }
1680: 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20  .  pNew->interp 
1690: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  = pDb->interp;. 
16a0: 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d   pNew->pScript =
16b0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   0;.  pNew->pNex
16c0: 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  t = pDb->pFunc;.
16d0: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
16e0: 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  New;.  return pN
16f0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  ew;.}../*.** Fin
1700: 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61  alize and free a
1710: 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65   list of prepare
1720: 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a  d statements.*/.
1730: 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73  static void flus
1740: 68 53 74 6d 74 43 61 63 68 65 28 20 53 71 6c 69  hStmtCache( Sqli
1750: 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20 20 53  teDb *pDb ){.  S
1760: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
1770: 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69  pPreStmt;..  whi
1780: 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69  le(  pDb->stmtLi
1790: 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
17a0: 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d  3_finalize( pDb-
17b0: 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74  >stmtList->pStmt
17c0: 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74   );.    pPreStmt
17d0: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
17e0: 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c  ;.    pDb->stmtL
17f0: 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ist = pDb->stmtL
1800: 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
1810: 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61 72 2a  Tcl_Free( (char*
1820: 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d  )pPreStmt );.  }
1830: 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20  .  pDb->nStmt = 
1840: 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61  0;.  pDb->stmtLa
1850: 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  st = 0;.}../*.**
1860: 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20   TCL calls this 
1870: 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61  procedure when a
1880: 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62 61  n sqlite3 databa
1890: 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  se command is.**
18a0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
18b0: 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74  tic void DbDelet
18c0: 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a  eCmd(void *db){.
18d0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
18e0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b  = (SqliteDb*)db;
18f0: 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68  .  flushStmtCach
1900: 65 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  e(pDb);.  sqlite
1910: 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29  3_close(pDb->db)
1920: 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e  ;.  while( pDb->
1930: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c  pFunc ){.    Sql
1940: 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44  Func *pFunc = pD
1950: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44  b->pFunc;.    pD
1960: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  b->pFunc = pFunc
1970: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
1980: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46  _DecrRefCount(pF
1990: 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20  unc->pScript);. 
19a0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
19b0: 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20  r*)pFunc);.  }. 
19c0: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f   while( pDb->pCo
19d0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c  llate ){.    Sql
19e0: 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74  Collate *pCollat
19f0: 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  e = pDb->pCollat
1a00: 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c  e;.    pDb->pCol
1a10: 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d  late = pCollate-
1a20: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f  >pNext;.    Tcl_
1a30: 46 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c  Free((char*)pCol
1a40: 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  late);.  }.  if(
1a50: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
1a60: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
1a70: 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69  >zBusy);.  }.  i
1a80: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
1a90: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
1aa0: 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d  Db->zTrace);.  }
1ab0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f  .  if( pDb->zPro
1ac0: 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f  file ){.    Tcl_
1ad0: 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69  Free(pDb->zProfi
1ae0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  le);.  }.  if( p
1af0: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
1b00: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1b10: 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Auth);.  }.  if(
1b20: 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20   pDb->zNull ){. 
1b30: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
1b40: 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69  >zNull);.  }.  i
1b50: 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48  f( pDb->pUpdateH
1b60: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
1b70: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
1b80: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  >pUpdateHook);. 
1b90: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52   }.  if( pDb->pR
1ba0: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20  ollbackHook ){. 
1bb0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1bc0: 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  unt(pDb->pRollba
1bd0: 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  ckHook);.  }.  i
1be0: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
1bf0: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63  Needed ){.    Tc
1c00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
1c10: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
1c20: 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46  ed);.  }.  Tcl_F
1c30: 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b  ree((char*)pDb);
1c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1c50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1c60: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
1c70: 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20   file is locked 
1c80: 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
1c90: 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a  to execute SQL..
1ca0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
1cb0: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
1cc0: 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73   *cd, int nTries
1cd0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
1ce0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1cf0: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  cd;.  int rc;.  
1d00: 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a  char zVal[30];..
1d10: 20 20 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c 20    sprintf(zVal, 
1d20: 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20  "%d", nTries);. 
1d30: 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61   rc = Tcl_VarEva
1d40: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
1d50: 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20  Db->zBusy, " ", 
1d60: 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zVal, (char*)0);
1d70: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
1d80: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
1d90: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
1da0: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
1db0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1dc0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1dd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1de0: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73  ne is invoked as
1df0: 20 74 68 65 20 27 70 72 6f 67 72 65 73 73 20 63   the 'progress c
1e00: 61 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65  allback' for the
1e10: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1e20: 61 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72  atic int DbProgr
1e30: 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  essHandler(void 
1e40: 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *cd){.  SqliteDb
1e50: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
1e60: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b  b*)cd;.  int rc;
1e70: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
1e80: 3e 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20  >zProgress );.  
1e90: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
1ea0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
1eb0: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66  zProgress);.  if
1ec0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc!=TCL_OK || 
1ed0: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
1ee0: 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  ngResult(pDb->in
1ef0: 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65  terp)) ){.    re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
1f10: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
1f20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1f30: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RACE./*.** This 
1f40: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f50: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
1f60: 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68  trace handler wh
1f70: 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20  enever a new.** 
1f80: 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20  block of SQL is 
1f90: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54  executed.  The T
1fa0: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
1fb0: 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63  ->zTrace is exec
1fc0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
1fd0: 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64  void DbTraceHand
1fe0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
1ff0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
2000: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
2010: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
2020: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2030: 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72  str;..  Tcl_DStr
2040: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2050: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2060: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54  nd(&str, pDb->zT
2070: 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  race, -1);.  Tcl
2080: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
2090: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
20a0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
20b0: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
20c0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
20d0: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
20e0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
20f0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
2100: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23  Db->interp);.}.#
2110: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
2120: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
2130: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2140: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
2150: 20 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66   the SQLite prof
2160: 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65  ile handler afte
2170: 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  r a statement.**
2180: 20 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65   SQL has execute
2190: 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69  d.  The TCL scri
21a0: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66  pt in pDb->zProf
21b0: 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64  ile is evaluated
21c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21d0: 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65   DbProfileHandle
21e0: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
21f0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71  t char *zSql, sq
2200: 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b  lite_uint64 tm){
2210: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
2220: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
2230: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2240: 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b  str;.  char zTm[
2250: 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  100];..  sqlite3
2260: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2270: 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25  (zTm)-1, zTm, "%
2280: 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c  lld", tm);.  Tcl
2290: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
22a0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
22b0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
22c0: 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29  b->zProfile, -1)
22d0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
22e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
22f0: 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f  r, zSql);.  Tcl_
2300: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
2310: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b  ment(&str, zTm);
2320: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
2330: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
2340: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
2350: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2360: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
2370: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
2380: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  ->interp);.}.#en
2390: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
23a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
23b0: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
23c0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
23d0: 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73  d.  The.** TCL s
23e0: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43  cript in pDb->zC
23f0: 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65  ommit is execute
2400: 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e  d.  If it return
2410: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a  s non-zero or.**
2420: 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e   if it throws an
2430: 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20   exception, the 
2440: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
2450: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65  olled back inste
2460: 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63  ad.** of being c
2470: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61  ommitted..*/.sta
2480: 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74  tic int DbCommit
2490: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
24a0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
24b0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
24c0: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
24d0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
24e0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
24f0: 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  >zCommit);.  if(
2500: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
2510: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
2520: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
2530: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
2540: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2550: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
2560: 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b   void DbRollback
2570: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c  Handler(void *cl
2580: 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c  ientData){.  Sql
2590: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
25a0: 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61  liteDb*)clientDa
25b0: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62  ta;.  assert(pDb
25c0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
25d0: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
25e0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
25f0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
2600: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30  pRollbackHook, 0
2610: 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63  ) ){.    Tcl_Bac
2620: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62  kgroundError(pDb
2630: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d  ->interp);.  }.}
2640: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  ..static void Db
2650: 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20  UpdateHandler(. 
2660: 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74   void *p, .  int
2670: 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   op,.  const cha
2680: 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74  r *zDb, .  const
2690: 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20   char *zTbl, .  
26a0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77  sqlite_int64 row
26b0: 69 64 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  id.){.  SqliteDb
26c0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
26d0: 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  b *)p;.  Tcl_Obj
26e0: 20 2a 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72   *pCmd;..  asser
26f0: 74 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48  t( pDb->pUpdateH
2700: 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ook );.  assert(
2710: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45   op==SQLITE_INSE
2720: 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45  RT || op==SQLITE
2730: 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53  _UPDATE || op==S
2740: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a  QLITE_DELETE );.
2750: 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75  .  pCmd = Tcl_Du
2760: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
2770: 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20  pUpdateHook);.  
2780: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2790: 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pCmd);.  Tcl_Li
27a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
27b0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
27c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20  NewStringObj(.  
27d0: 20 20 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f    ( (op==SQLITE_
27e0: 49 4e 53 45 52 54 29 3f 22 49 4e 53 45 52 54 22  INSERT)?"INSERT"
27f0: 3a 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44  :(op==SQLITE_UPD
2800: 41 54 45 29 3f 22 55 50 44 41 54 45 22 3a 22 44  ATE)?"UPDATE":"D
2810: 45 4c 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20  ELETE"), -1));. 
2820: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2830: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
2840: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
2850: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
2860: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2870: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
2880: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
2890: 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a  Obj(zTbl, -1));.
28a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
28b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
28c0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
28d0: 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20  ntObj(rowid));. 
28e0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
28f0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
2900: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
2910: 54 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  T);.}..static vo
2920: 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65  id tclCollateNee
2930: 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  ded(.  void *pCt
2940: 78 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  x,.  sqlite3 *db
2950: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63  ,.  int enc,.  c
2960: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2970: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
2980: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
2990: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
29a0: 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c  j *pScript = Tcl
29b0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44  _DuplicateObj(pD
29c0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
29d0: 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  d);.  Tcl_IncrRe
29e0: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
29f0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
2a00: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
2a10: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
2a20: 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20  tringObj(zName, 
2a30: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
2a40: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
2a50: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
2a60: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2a70: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a  nt(pScript);.}..
2a80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2a90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
2aa0: 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20  evaluate an SQL 
2ab0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
2ac0: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
2ad0: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
2ae0: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
2af0: 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28  t tclSqlCollate(
2b00: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
2b10: 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74   int nA,.  const
2b20: 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74   void *zA,.  int
2b30: 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nB,.  const voi
2b40: 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f  d *zB.){.  SqlCo
2b50: 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43  llate *p = (SqlC
2b60: 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20  ollate *)pCtx;. 
2b70: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
2b80: 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65  .  pCmd = Tcl_Ne
2b90: 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53  wStringObj(p->zS
2ba0: 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63  cript, -1);.  Tc
2bb0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
2bc0: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
2bd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2be0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
2bf0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2c00: 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54  bj(zA, nA));.  T
2c10: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c20: 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72  Element(p->inter
2c30: 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  p, pCmd, Tcl_New
2c40: 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42  StringObj(zB, nB
2c50: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
2c60: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
2c70: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
2c80: 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63  RECT);.  Tcl_Dec
2c90: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
2ca0: 0a 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28  .  return (atoi(
2cb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
2cc0: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29  ult(p->interp)))
2cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2ce0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2cf0: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
2d00: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d   SQL function im
2d10: 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69  plemented.** usi
2d20: 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a  ng TCL script..*
2d30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63  /.static void tc
2d40: 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33  lSqlFunc(sqlite3
2d50: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
2d60: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
2d70: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76  ite3_value**argv
2d80: 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20  ){.  SqlFunc *p 
2d90: 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
2da0: 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ata(context);.  
2db0: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20  Tcl_Obj *pCmd;. 
2dc0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
2dd0: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30  ;..  if( argc==0
2de0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2df0: 65 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d  ere are no argum
2e00: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
2e10: 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45  tion, call Tcl_E
2e20: 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a  valObjEx on the.
2e30: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62      ** script ob
2e40: 6a 65 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20  ject directly.  
2e50: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
2e60: 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  TCL compiler to 
2e70: 67 65 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20  generate.    ** 
2e80: 62 79 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65  bytecode for the
2e90: 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20   command on the 
2ea0: 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e  first invocation
2eb0: 20 61 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20   and thus make. 
2ec0: 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
2ed0: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63   invocations muc
2ee0: 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20  h faster. */.   
2ef0: 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69   pCmd = p->pScri
2f00: 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  pt;.    Tcl_Incr
2f10: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
2f20: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
2f30: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
2f40: 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20  , pCmd, 0);.    
2f50: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2f60: 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCmd);.  }else{
2f70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2f80: 20 61 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74   are arguments t
2f90: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20  o the function, 
2fa0: 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63  make a shallow c
2fb0: 6f 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  opy of the.    *
2fc0: 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c  * script object,
2fd0: 20 6c 61 70 70 65 6e 64 20 74 68 65 20 61 72 67   lappend the arg
2fe0: 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61  uments, then eva
2ff0: 6c 75 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a  luate the copy..
3000: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79      **.    ** By
3010: 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c   "shallow" copy,
3020: 20 77 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20   we mean a only 
3030: 74 68 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54  the outer list T
3040: 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63  cl_Obj is duplic
3050: 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ated..    ** The
3060: 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e   new Tcl_Obj con
3070: 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
3080: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c  o the original l
3090: 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20  ist elements. . 
30a0: 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
30b0: 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  when Tcl_EvalObj
30c0: 76 28 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73  v() is run and s
30d0: 68 69 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73  himmers the firs
30e0: 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  t element.    **
30f0: 20 6f 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20   of the list to 
3100: 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20  tclCmdNameType, 
3110: 74 68 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72  that alternate r
3120: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69  epresentation wi
3130: 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65  ll.    ** be pre
3140: 73 65 72 76 65 64 20 61 6e 64 20 72 65 75 73 65  served and reuse
3150: 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e  d on the next in
3160: 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  vocation..    */
3170: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
3180: 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  Arg;.    int nAr
3190: 67 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c  g;.    if( Tcl_L
31a0: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
31b0: 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  s(p->interp, p->
31c0: 70 53 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20  pScript, &nArg, 
31d0: 26 61 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20  &aArg) ){.      
31e0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
31f0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
3200: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3210: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
3220: 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ); .      return
3230: 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20  ;.    }     .   
3240: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c   pCmd = Tcl_NewL
3250: 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72  istObj(nArg, aAr
3260: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  g);.    Tcl_Incr
3270: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
3280: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
3290: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
32a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
32b0: 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20  pIn = argv[i];. 
32c0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
32d0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
32e0: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56  .      /* Set pV
32f0: 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  al to contain th
3300: 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i'th column of
3310: 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20   this row. */.  
3320: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
3330: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
3340: 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  In) ){.        c
3350: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
3360: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
3370: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
3380: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e  _value_bytes(pIn
3390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
33a0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
33b0: 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f  rrayObj(sqlite3_
33c0: 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c  value_blob(pIn),
33d0: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
33e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
33f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
3400: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
3410: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
3420: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
3430: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
3440: 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  4(pIn);.        
3450: 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38    if( v>=-214748
3460: 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34  3647 && v<=21474
3470: 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20  83647 ){.       
3480: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
3490: 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  NewIntObj(v);.  
34a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
34b0: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
34c0: 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  = Tcl_NewWideInt
34d0: 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Obj(v);.        
34e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
34f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
3500: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
3510: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
3520: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
3530: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
3540: 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20  ouble(pIn);.    
3550: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
3560: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29  _NewDoubleObj(r)
3570: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
3580: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
3590: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
35a0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20  _NULL: {.       
35b0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
35c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30  wStringObj("", 0
35d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
35e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
35f0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
3600: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
3610: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
3620: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
3630: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
3640: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
3650: 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74  bj((char *)sqlit
3660: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49  e3_value_text(pI
3670: 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  n), bytes);.    
3680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36a0: 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69       rc = Tcl_Li
36b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
36c0: 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  nt(p->interp, pC
36d0: 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20  md, pVal);.     
36e0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
36f0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3700: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20  unt(pCmd);.     
3710: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3720: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
3730: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
3740: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
3750: 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72   -1); .        r
3760: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
3770: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d     }.    if( !p-
3780: 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a  >useEvalObjv ){.
3790: 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61        /* Tcl_Eva
37a0: 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75  lObjEx() will au
37b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c  tomatically call
37c0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
37d0: 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a  if pCmd.      **
37e0: 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f   is a list witho
37f0: 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70 72  ut a string repr
3800: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20  esentation.  To 
3810: 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f  prevent this fro
3820: 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65  m.      ** happe
3830: 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20  ning, make sure 
3840: 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64  pCmd has a valid
3850: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
3860: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3870: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43  Tcl_GetString(pC
3880: 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  md);.    }.    r
3890: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
38a0: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
38b0: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
38c0: 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  CT);.    Tcl_Dec
38d0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
38e0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26  .  }..  if( rc &
38f0: 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e  & rc!=TCL_RETURN
3900: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
3910: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
3920: 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72  text, Tcl_GetStr
3930: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
3940: 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65  erp), -1); .  }e
3950: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  lse{.    Tcl_Obj
3960: 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74   *pVar = Tcl_Get
3970: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
3980: 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  erp);.    int n;
3990: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20  .    u8 *data;. 
39a0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d     char *zType =
39b0: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f   pVar->typePtr ?
39c0: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e   pVar->typePtr->
39d0: 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 63  name : "";.    c
39e0: 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d  har c = zType[0]
39f0: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27  ;.    if( c=='b'
3a00: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
3a10: 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30  ,"bytearray")==0
3a20: 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d   && pVar->bytes=
3a30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  =0 ){.      /* O
3a40: 6e 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f  nly return a BLO
3a50: 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63  B type if the Tc
3a60: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20  l variable is a 
3a70: 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20  bytearray and.  
3a80: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74      ** has no st
3a90: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
3aa0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61  ion. */.      da
3ab0: 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ta = Tcl_GetByte
3ac0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61  ArrayFromObj(pVa
3ad0: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71  r, &n);.      sq
3ae0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
3af0: 62 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c  b(context, data,
3b00: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
3b10: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
3b20: 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20   if( (c=='b' && 
3b30: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
3b40: 6f 6c 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20  olean")==0) ||. 
3b50: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27           (c=='i'
3b60: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
3b70: 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20  ,"int")==0) ){. 
3b80: 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46       Tcl_GetIntF
3b90: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
3ba0: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
3bb0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
3bc0: 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d  ntext, n);.    }
3bd0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20  else if( c=='d' 
3be0: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
3bf0: 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "double")==0 ){.
3c00: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a        double r;.
3c10: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
3c20: 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56  bleFromObj(0, pV
3c30: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73  ar, &r);.      s
3c40: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
3c50: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29  uble(context, r)
3c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3c70: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
3c80: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
3c90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
3ca0: 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20  l_WideInt v;.   
3cb0: 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e     Tcl_GetWideIn
3cc0: 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72  tFromObj(0, pVar
3cd0: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &v);.      sql
3ce0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
3cf0: 34 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20  4(context, v);. 
3d00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3d10: 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  data = (unsigned
3d20: 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53   char *)Tcl_GetS
3d30: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61  tringFromObj(pVa
3d40: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71  r, &n);.      sq
3d50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
3d60: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
3d70: 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49   *)data, n, SQLI
3d80: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
3d90: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
3da0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3db0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a  AUTHORIZATION./*
3dc0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
3dd0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
3de0: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70  unction.  It app
3df0: 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e 74  ends the authent
3e00: 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20  ication.** type 
3e10: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f  code and the two
3e20: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43   arguments to zC
3e30: 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65  md[] then invoke
3e40: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
3e50: 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  on the interpret
3e60: 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69  er.  The reply i
3e70: 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65  s examined to de
3e80: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a  termine if the.*
3e90: 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  * authentication
3ea0: 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65   fails or succee
3eb0: 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
3ec0: 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28  t auth_callback(
3ed0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20  .  void *pArg,. 
3ee0: 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e   int code,.  con
3ef0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a  st char *zArg1,.
3f00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
3f10: 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg2,.  const cha
3f20: 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73  r *zArg3,.  cons
3f30: 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b  t char *zArg4.){
3f40: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a  .  char *zCode;.
3f50: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
3f60: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  r;.  int rc;.  c
3f70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c  onst char *zRepl
3f80: 79 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  y;.  SqliteDb *p
3f90: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3fa0: 70 41 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28  pArg;..  switch(
3fb0: 20 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73   code ){.    cas
3fc0: 65 20 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20  e SQLITE_COPY   
3fd0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
3fe0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22  de="SQLITE_COPY"
3ff0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4000: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
4010: 49 4e 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f  INDEX      : zCo
4020: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
4030: 45 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  E_INDEX"; break;
4040: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4050: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20  _CREATE_TABLE   
4060: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4070: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22  TE_CREATE_TABLE"
4080: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4090: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
40a0: 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f  TEMP_INDEX : zCo
40b0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
40c0: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62  E_TEMP_INDEX"; b
40d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
40e0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
40f0: 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d  P_TABLE : zCode=
4100: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
4110: 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  EMP_TABLE"; brea
4120: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4130: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
4140: 52 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53  RIGGER: zCode="S
4150: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
4160: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
4170: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4180: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
4190: 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  IEW  : zCode="SQ
41a0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
41b0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
41c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
41d0: 52 45 41 54 45 5f 54 52 49 47 47 45 52 20 20 20  REATE_TRIGGER   
41e0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
41f0: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 22  _CREATE_TRIGGER"
4200: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4210: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
4220: 56 49 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f  VIEW       : zCo
4230: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
4240: 45 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  E_VIEW"; break;.
4250: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4260: 44 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20  DELETE          
4270: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
4280: 45 5f 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b  E_DELETE"; break
4290: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
42a0: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20  E_DROP_INDEX    
42b0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
42c0: 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b  ITE_DROP_INDEX";
42d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
42e0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
42f0: 4c 45 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  LE        : zCod
4300: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
4310: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
4320: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
4330: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  OP_TEMP_INDEX   
4340: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4350: 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22  DROP_TEMP_INDEX"
4360: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4370: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
4380: 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f  MP_TABLE   : zCo
4390: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
43a0: 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  TEMP_TABLE"; bre
43b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
43c0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
43d0: 49 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53  IGGER : zCode="S
43e0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
43f0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
4400: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4410: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20  _DROP_TEMP_VIEW 
4420: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4430: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
4440: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
4450: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
4460: 54 52 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a  TRIGGER      : z
4470: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
4480: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
4490: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
44a0: 54 45 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20  TE_DROP_VIEW    
44b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
44c0: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b  LITE_DROP_VIEW";
44d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
44e0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20   SQLITE_INSERT  
44f0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4500: 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e="SQLITE_INSERT
4510: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4520: 73 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  se SQLITE_PRAGMA
4530: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
4540: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47  ode="SQLITE_PRAG
4550: 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  MA"; break;.    
4560: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
4580: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
4590: 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  AD"; break;.    
45a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45  case SQLITE_SELE
45b0: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CT            : 
45c0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45  zCode="SQLITE_SE
45d0: 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LECT"; break;.  
45e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
45f0: 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20  ANSACTION       
4600: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4610: 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72  TRANSACTION"; br
4620: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4630: 4c 49 54 45 5f 55 50 44 41 54 45 20 20 20 20 20  LITE_UPDATE     
4640: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
4650: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20  SQLITE_UPDATE"; 
4660: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4670: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20  SQLITE_ATTACH   
4680: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
4690: 3d 22 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22  ="SQLITE_ATTACH"
46a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
46b0: 65 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20  e SQLITE_DETACH 
46c0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
46d0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43  de="SQLITE_DETAC
46e0: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  H"; break;.    c
46f0: 61 73 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52  ase SQLITE_ALTER
4700: 5f 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a  _TABLE       : z
4710: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54  Code="SQLITE_ALT
4720: 45 52 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  ER_TABLE"; break
4730: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
4740: 45 5f 52 45 49 4e 44 45 58 20 20 20 20 20 20 20  E_REINDEX       
4750: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
4760: 49 54 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72  ITE_REINDEX"; br
4770: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4780: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20  LITE_ANALYZE    
4790: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
47a0: 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b  SQLITE_ANALYZE";
47b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
47c0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
47d0: 54 41 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64  TABLE     : zCod
47e0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
47f0: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
4800: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4810: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20  _DROP_VTABLE    
4820: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4830: 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b  TE_DROP_VTABLE";
4840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
4850: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
4860: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4870: 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b  e="????"; break;
4880: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69  .  }.  Tcl_DStri
4890: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
48a0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
48b0: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75  d(&str, pDb->zAu
48c0: 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  th, -1);.  Tcl_D
48d0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
48e0: 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29  ent(&str, zCode)
48f0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
4900: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
4910: 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31  r, zArg1 ? zArg1
4920: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
4930: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
4940: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f  nt(&str, zArg2 ?
4950: 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20   zArg2 : "");.  
4960: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
4970: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
4980: 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22  Arg3 ? zArg3 : "
4990: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
49a0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
49b0: 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72  str, zArg4 ? zAr
49c0: 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d  g4 : "");.  rc =
49d0: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
49e0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
49f0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
4a00: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
4a10: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
4a20: 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65   zReply = Tcl_Ge
4a30: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
4a40: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  b->interp);.  if
4a50: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
4a60: 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20  "SQLITE_OK")==0 
4a70: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
4a80: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
4a90: 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79  f( strcmp(zReply
4aa0: 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d  ,"SQLITE_DENY")=
4ab0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
4ac0: 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65  QLITE_DENY;.  }e
4ad0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
4ae0: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47  Reply,"SQLITE_IG
4af0: 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20  NORE")==0 ){.   
4b00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e   rc = SQLITE_IGN
4b10: 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ORE;.  }else{.  
4b20: 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a    rc = 999;.  }.
4b30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
4b40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4b50: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
4b60: 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65  ON */../*.** zTe
4b70: 78 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  xt is a pointer 
4b80: 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
4b90: 20 76 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f   via an sqlite3_
4ba0: 72 65 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a  result_text().**
4bb0: 20 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65   or similar inte
4bc0: 72 66 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74  rface. This rout
4bd0: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 54 63  ine returns a Tc
4be0: 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c  l string object,
4bf0: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63   .** reference c
4c00: 6f 75 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63  ount set to 0, c
4c10: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
4c20: 78 74 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61  xt. If a transla
4c30: 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20  tion.** between 
4c40: 69 73 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d  iso8859 and UTF-
4c50: 38 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69  8 is required, i
4c60: 74 20 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a  t is preformed..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  */.static Tcl_Ob
4c80: 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63  j *dbTextToObj(c
4c90: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
4ca0: 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
4cb0: 61 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54  al;.#ifdef UTF_T
4cc0: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
4cd0: 44 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  D.  Tcl_DString 
4ce0: 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72  dCol;.  Tcl_DStr
4cf0: 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a  ingInit(&dCol);.
4d00: 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f    Tcl_ExternalTo
4d10: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c  UtfDString(NULL,
4d20: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f   zText, -1, &dCo
4d30: 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c  l);.  pVal = Tcl
4d40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
4d50: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
4d60: 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63  dCol), -1);.  Tc
4d70: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
4d80: 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56  Col);.#else.  pV
4d90: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
4da0: 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29  ngObj(zText, -1)
4db0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4dc0: 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pVal;.}../*.**
4dd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
4de0: 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65  ads a line of te
4df0: 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c  xt from FILE in,
4e00: 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74   stores.** the t
4e10: 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ext in memory ob
4e20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
4e30: 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73  oc() and returns
4e40: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
4e50: 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c   the text.  NULL
4e60: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20   is returned at 
4e70: 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20  end of file, or 
4e80: 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66  if malloc().** f
4e90: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails..**.** The 
4ea0: 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b  interface is lik
4eb0: 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74  e "readline" but
4ec0: 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   no command-line
4ed0: 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64   editing.** is d
4ee0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65  one..**.** copie
4ef0: 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66  d from shell.c f
4f00: 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f  rom '.import' co
4f10: 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20  mmand.*/.static 
4f20: 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c  char *local_getl
4f30: 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70  ine(char *zPromp
4f40: 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  t, FILE *in){.  
4f50: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69  char *zLine;.  i
4f60: 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  nt nLine;.  int 
4f70: 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20  n;.  int eol;.. 
4f80: 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20   nLine = 100;.  
4f90: 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  zLine = malloc( 
4fa0: 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a  nLine );.  if( z
4fb0: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
4fc0: 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65   0;.  n = 0;.  e
4fd0: 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ol = 0;.  while(
4fe0: 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28   !eol ){.    if(
4ff0: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
5000: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
5010: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
5020: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
5030: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
5040: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
5050: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
5060: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
5070: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
5080: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
5090: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
50a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
50b0: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
50c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
50d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
50e0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
50f0: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  eol = 1;.      b
5100: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5110: 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20  while( zLine[n] 
5120: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ n++; }.    if
5130: 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e  ( n>0 && zLine[n
5140: 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  -1]=='\n' ){.   
5150: 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c     n--;.      zL
5160: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
5170: 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d    eol = 1;.    }
5180: 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72  .  }.  zLine = r
5190: 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e  ealloc( zLine, n
51a0: 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  +1 );.  return z
51b0: 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Line;.}../*.** T
51c0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
51d0: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
51e0: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
51f0: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
5200: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
5210: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
5220: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
5230: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
5240: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
5250: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
5260: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
5270: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
5280: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
5290: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
52a0: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
52b0: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
52c0: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
52d0: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
52e0: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
52f0: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
5300: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
5310: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
5320: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
5330: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
5340: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
5350: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
5360: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
5370: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
5380: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
5390: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
53a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
53b0: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
53c0: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
53d0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
53e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
53f0: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
5400: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5410: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
5420: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
5430: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
5440: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
5450: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
5460: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
5470: 20 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 20       "busy",    
5480: 20 20 20 20 20 20 20 20 20 20 22 63 61 63 68 65            "cache
5490: 22 2c 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22  ",.    "changes"
54a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6c  ,            "cl
54b0: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
54c0: 20 20 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20    "collate",.   
54d0: 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64   "collation_need
54e0: 65 64 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68  ed",   "commit_h
54f0: 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d  ook",       "com
5500: 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70  plete",.    "cop
5510: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
5520: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
5530: 78 74 65 6e 73 69 6f 6e 22 2c 22 65 72 72 6f 72  xtension","error
5540: 63 6f 64 65 22 2c 0a 20 20 20 20 22 65 76 61 6c  code",.    "eval
5550: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5560: 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20 20   "exists",      
5570: 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22        "function"
5580: 2c 0a 20 20 20 20 22 69 6e 74 65 72 72 75 70 74  ,.    "interrupt
5590: 22 2c 20 20 20 20 20 20 20 20 20 20 22 6c 61 73  ",          "las
55a0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
55b0: 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 0a 20 20   "nullvalue",.  
55c0: 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20 20    "onecolumn",  
55d0: 20 20 20 20 20 20 20 20 22 70 72 6f 66 69 6c 65          "profile
55e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 70 72  ",           "pr
55f0: 6f 67 72 65 73 73 22 2c 0a 20 20 20 20 22 72 65  ogress",.    "re
5600: 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  key",           
5610: 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f     "rollback_hoo
5620: 6b 22 2c 20 20 20 20 20 22 74 69 6d 65 6f 75 74  k",     "timeout
5630: 22 2c 0a 20 20 20 20 22 74 6f 74 61 6c 5f 63 68  ",.    "total_ch
5640: 61 6e 67 65 73 22 2c 20 20 20 20 20 20 22 74 72  anges",      "tr
5650: 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ace",           
5660: 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c    "transaction",
5670: 0a 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f  .    "update_hoo
5680: 6b 22 2c 20 20 20 20 20 20 20 20 22 76 65 72 73  k",        "vers
5690: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  ion",           
56a0: 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42  0.  };.  enum DB
56b0: 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41  _enum {.    DB_A
56c0: 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20  UTHORIZER,      
56d0: 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20    DB_BUSY,      
56e0: 20 20 20 20 20 20 20 44 42 5f 43 41 43 48 45 2c         DB_CACHE,
56f0: 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c  .    DB_CHANGES,
5700: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c             DB_CL
5710: 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
5720: 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20 20  DB_COLLATE,.    
5730: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
5740: 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54 5f  DED,  DB_COMMIT_
5750: 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43 4f  HOOK,      DB_CO
5760: 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f 43  MPLETE,.    DB_C
5770: 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  OPY,            
5780: 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44    DB_ENABLE_LOAD
5790: 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f 45 52  _EXTENSION,DB_ER
57a0: 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44 42 5f  RORCODE,.    DB_
57b0: 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20  EVAL,           
57c0: 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20 20 20     DB_EXISTS,   
57d0: 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43 54          DB_FUNCT
57e0: 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 49 4e 54 45  ION,.    DB_INTE
57f0: 52 52 55 50 54 2c 20 20 20 20 20 20 20 20 20 44  RRUPT,         D
5800: 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
5810: 57 49 44 2c 44 42 5f 4e 55 4c 4c 56 41 4c 55 45  WID,DB_NULLVALUE
5820: 2c 0a 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55  ,.    DB_ONECOLU
5830: 4d 4e 2c 20 20 20 20 20 20 20 20 20 44 42 5f 50  MN,         DB_P
5840: 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20  ROFILE,         
5850: 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 0a 20 20   DB_PROGRESS,.  
5860: 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20    DB_REKEY,     
5870: 20 20 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42          DB_ROLLB
5880: 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20 44 42 5f  ACK_HOOK,    DB_
5890: 54 49 4d 45 4f 55 54 2c 0a 20 20 20 20 44 42 5f  TIMEOUT,.    DB_
58a0: 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20  TOTAL_CHANGES,  
58b0: 20 20 20 44 42 5f 54 52 41 43 45 2c 20 20 20 20     DB_TRACE,    
58c0: 20 20 20 20 20 20 20 20 44 42 5f 54 52 41 4e 53          DB_TRANS
58d0: 41 43 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 55  ACTION,.    DB_U
58e0: 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20  PDATE_HOOK,     
58f0: 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c 20 20 20    DB_VERSION,   
5900: 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 2f         .  };.  /
5910: 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72  * don't leave tr
5920: 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e  ailing commas on
5930: 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e   DB_enum, it con
5940: 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78 6c  fuses the AIX xl
5950: 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20  c compiler */.. 
5960: 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
5970: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
5980: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
5990: 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44  bjv, "SUBCOMMAND
59a0: 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
59b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
59c0: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
59d0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
59e0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f  rp, objv[1], DB_
59f0: 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20  strs, "option", 
5a00: 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20  0, &choice) ){. 
5a10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5a20: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ROR;.  }..  swit
5a30: 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75  ch( (enum DB_enu
5a40: 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f  m)choice ){..  /
5a50: 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72 69  *    $db authori
5a60: 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  zer ?CALLBACK?. 
5a70: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
5a80: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
5a90: 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20  ck to authorize 
5aa0: 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69  each SQL operati
5ab0: 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a  on as it is.  **
5ac0: 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72   compiled.  5 ar
5ad0: 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65  guments are appe
5ae0: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  nded to the call
5af0: 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69  back before it i
5b00: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a  s.  ** invoked:.
5b10: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20    **.  **   (1) 
5b20: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
5b30: 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49  n type (ex: SQLI
5b40: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c  TE_CREATE_TABLE,
5b50: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
5b60: 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20  ...).  **   (2) 
5b70: 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69 76  First descriptiv
5b80: 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20  e name (depends 
5b90: 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  on authorization
5ba0: 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33   type).  **   (3
5bb0: 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70  ) Second descrip
5bc0: 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20  tive name.  **  
5bd0: 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65   (4) Name of the
5be0: 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20 22   database (ex: "
5bf0: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20  main", "temp"). 
5c00: 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f   **   (5) Name o
5c10: 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20 69  f trigger that i
5c20: 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65  s doing the acce
5c30: 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ss.  **.  ** The
5c40: 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64   callback should
5c50: 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68   return on of th
5c60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69  e following stri
5c70: 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a  ngs: SQLITE_OK,.
5c80: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f    ** SQLITE_IGNO
5c90: 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  RE, or SQLITE_DE
5ca0: 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  NY.  Any other r
5cb0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
5cc0: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20  n error..  **.  
5cd0: 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f  ** If this metho
5ce0: 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74  d is invoked wit
5cf0: 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20  h no arguments, 
5d00: 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74 68  the current auth
5d10: 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63  orization.  ** c
5d20: 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69  allback string i
5d30: 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  s returned..  */
5d40: 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f  .  case DB_AUTHO
5d50: 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20  RIZER: {.#ifdef 
5d60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5d70: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63  ORIZATION.    Tc
5d80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
5d90: 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a  nterp, "authoriz
5da0: 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61  ation not availa
5db0: 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
5dc0: 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  d", 0);.    retu
5dd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
5de0: 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lse.    if( objc
5df0: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
5e00: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
5e10: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
5e20: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
5e30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5e40: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
5e50: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
5e60: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
5e70: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
5e80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
5e90: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74  nterp, pDb->zAut
5ea0: 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  h, 0);.      }. 
5eb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5ec0: 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20  char *zAuth;.   
5ed0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
5ee0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
5ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5f00: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
5f10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5f20: 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53  zAuth = Tcl_GetS
5f30: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
5f40: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
5f50: 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26 20     if( zAuth && 
5f60: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
5f70: 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63   pDb->zAuth = Tc
5f80: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
5f90: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
5fa0: 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a  py(pDb->zAuth, z
5fb0: 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Auth);.      }el
5fc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
5fd0: 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >zAuth = 0;.    
5fe0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
5ff0: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
6000: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
6010: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
6020: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
6030: 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62  thorizer(pDb->db
6040: 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c  , auth_callback,
6050: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
6060: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6070: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
6080: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
6090: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
60a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
60b0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
60c0: 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41  $db busy ?CALLBA
60d0: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
60e0: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
60f0: 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51  allback if an SQ
6100: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65  L statement atte
6110: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  mpts to open.  *
6120: 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62  * a locked datab
6130: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
6140: 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b   case DB_BUSY: {
6150: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
6160: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
6170: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6180: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c  , 2, objv, "CALL
6190: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
61a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
61b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
61c0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
61d0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
61e0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
61f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6200: 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29  , pDb->zBusy, 0)
6210: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6220: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
6230: 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e  *zBusy;.      in
6240: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
6250: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
6260: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
6270: 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20  pDb->zBusy);.   
6280: 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79     }.      zBusy
6290: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
62a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
62b0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
62c0: 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30  ( zBusy && len>0
62d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
62e0: 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c  >zBusy = Tcl_All
62f0: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
6300: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44         strcpy(pD
6310: 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 29  b->zBusy, zBusy)
6320: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6330: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
6340: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
6350: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
6360: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  usy ){.        p
6370: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
6380: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
6390: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
63a0: 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73  r(pDb->db, DbBus
63b0: 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  yHandler, pDb);.
63c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
63d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
63e0: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
63f0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
6400: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
6410: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
6420: 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68   $db cache flush
6430: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61  .  **     $db ca
6440: 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a  che size n.  **.
6450: 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70    ** Flush the p
6460: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6470: 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20  t cache, or set 
6480: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
6490: 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65  er of.  ** cache
64a0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
64b0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43  */.  case DB_CAC
64c0: 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  HE: {.    char *
64d0: 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20  subCmd;.    int 
64e0: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n;..    if( objc
64f0: 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  <=2 ){.      Tcl
6500: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6510: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
6520: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72  cache option ?ar
6530: 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  g?");.      retu
6540: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6550: 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d    }.    subCmd =
6560: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
6570: 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20  omObj( objv[2], 
6580: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75  0 );.    if( *su
6590: 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72  bCmd=='f' && str
65a0: 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73  cmp(subCmd,"flus
65b0: 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
65c0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
65d0: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
65e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
65f0: 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22  2, objv, "flush"
6600: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
6610: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6630: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
6640: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d  ( pDb );.      }
6650: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  .    }else if( *
6660: 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73  subCmd=='s' && s
6670: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69  trcmp(subCmd,"si
6680: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
6690: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
66a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
66b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
66c0: 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20   2, objv, "size 
66d0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
66e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
66f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6700: 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f      if( TCL_ERRO
6710: 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  R==Tcl_GetIntFro
6720: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
6730: 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20  v[3], &n) ){.   
6740: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
6750: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
6760: 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74   "cannot convert
6770: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20   \"", .         
6780: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
6790: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
67a0: 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e  3],0), "\" to in
67b0: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
67c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
67d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
67e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
67f0: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
6800: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
6810: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
6820: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30             n = 0
6830: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
6840: 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50  e if( n>MAX_PREP
6850: 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20  ARED_STMTS ){.  
6860: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41            n = MA
6870: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
6880: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6890: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78          pDb->max
68a0: 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Stmt = n;.      
68b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
68c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
68d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
68e0: 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69  nterp, "bad opti
68f0: 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  on \"", .       
6900: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
6910: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
6920: 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65  0), "\": must be
6930: 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c   flush or size",
6940: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
6950: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6960: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
6970: 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20  }..  /*     $db 
6980: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
6990: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
69a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
69b0: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
69c0: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
69d0: 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  eted by.  ** the
69e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53   most recent INS
69f0: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
6a00: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
6a10: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a   not including .
6a20: 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73    ** any changes
6a30: 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72   made by trigger
6a40: 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a   programs..  */.
6a50: 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45    case DB_CHANGE
6a60: 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
6a70: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
6a80: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
6a90: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
6aa0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
6ab0: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
6ac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6ad0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
6ae0: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
6af0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
6b00: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
6b10: 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
6b20: 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  te3_changes(pDb-
6b30: 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
6b40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
6b50: 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20  db close.  **.  
6b60: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
6b70: 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
6b80: 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b  case DB_CLOSE: {
6b90: 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43  .    Tcl_DeleteC
6ba0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54  ommand(interp, T
6bb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
6bc0: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29  Obj(objv[0], 0))
6bd0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
6be0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
6bf0: 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45  $db collate NAME
6c00: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
6c10: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
6c20: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
6c30: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
6c40: 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a  E.  Whenever.  *
6c50: 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
6c60: 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  is called, invok
6c70: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
6c80: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
6c90: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
6ca0: 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  B_COLLATE: {.   
6cb0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
6cc0: 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20  llate;.    char 
6cd0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
6ce0: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
6cf0: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
6d00: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
6d10: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
6d20: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
6d30: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
6d40: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
6d50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6d60: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
6d70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
6d80: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
6d90: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
6da0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
6db0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
6dc0: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43  nScript);.    pC
6dd0: 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c  ollate = (SqlCol
6de0: 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  late*)Tcl_Alloc(
6df0: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74   sizeof(*pCollat
6e00: 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31  e) + nScript + 1
6e10: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
6e20: 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  late==0 ) return
6e30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6e40: 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70  pCollate->interp
6e50: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70   = interp;.    p
6e60: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d  Collate->pNext =
6e70: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
6e80: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53      pCollate->zS
6e90: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
6ea0: 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20  pCollate[1];.   
6eb0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
6ec0: 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 73   pCollate;.    s
6ed0: 74 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e  trcpy(pCollate->
6ee0: 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74  zScript, zScript
6ef0: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
6f00: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
6f10: 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
6f20: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  me, SQLITE_UTF8,
6f30: 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61   .        pColla
6f40: 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74  te, tclSqlCollat
6f50: 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  e) ){.      Tcl_
6f60: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
6f70: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
6f80: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
6f90: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
6fa0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
6fb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6fd0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
6fe0: 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  b collation_need
6ff0: 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ed SCRIPT.  **. 
7000: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
7010: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
7020: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
7030: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
7040: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
7050: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
7060: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
7070: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
7080: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
7090: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
70a0: 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20  EDED: {.    if( 
70b0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
70c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
70d0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
70e0: 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20  v, "SCRIPT");.  
70f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7100: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7110: 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  if( pDb->pCollat
7120: 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20  eNeeded ){.     
7130: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
7140: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
7150: 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  eeded);.    }.  
7160: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e    pDb->pCollateN
7170: 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c  eeded = Tcl_Dupl
7180: 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d  icateObj(objv[2]
7190: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
71a0: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
71b0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
71c0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74    sqlite3_collat
71d0: 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e  ion_needed(pDb->
71e0: 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c  db, pDb, tclColl
71f0: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
7200: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
7210: 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68      $db commit_h
7220: 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ook ?CALLBACK?. 
7230: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
7240: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
7250: 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ck just before c
7260: 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20  ommitting every 
7270: 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  SQL transaction.
7280: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  .  ** If the cal
7290: 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20  lback throws an 
72a0: 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74  exception or ret
72b0: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
72c0: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  hen the.  ** tra
72d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72  nsaction is abor
72e0: 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43  ted.  If CALLBAC
72f0: 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  K is an empty st
7300: 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61  ring, the callba
7310: 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  ck.  ** is disab
7320: 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  led..  */.  case
7330: 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a   DB_COMMIT_HOOK:
7340: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
7350: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
7360: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
7370: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
7380: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
7390: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
73a0: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
73b0: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
73c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
73d0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54  mit ){.        T
73e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
73f0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
7400: 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  mmit, 0);.      
7410: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
7420: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74     char *zCommit
7430: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
7440: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
7450: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
7460: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
7470: 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20  >zCommit);.     
7480: 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74   }.      zCommit
7490: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
74a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
74b0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
74c0: 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e  ( zCommit && len
74d0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
74e0: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c  b->zCommit = Tcl
74f0: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
7500: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  );.        strcp
7510: 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20  y(pDb->zCommit, 
7520: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  zCommit);.      
7530: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
7540: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b  Db->zCommit = 0;
7550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7560: 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
7570: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
7580: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
7590: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
75a0: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62  _commit_hook(pDb
75b0: 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61  ->db, DbCommitHa
75c0: 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
75d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
75e0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74    sqlite3_commit
75f0: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30  _hook(pDb->db, 0
7600: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
7610: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
7620: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
7630: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a  complete SQL.  *
7640: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52  *.  ** Return TR
7650: 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63  UE if SQL is a c
7660: 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74  omplete SQL stat
7670: 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46  ement.  Return F
7680: 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64  ALSE if.  ** add
7690: 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66  itional lines of
76a0: 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65   input are neede
76b0: 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  d.  This is simi
76c0: 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  lar to the.  ** 
76d0: 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63  built-in "info c
76e0: 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64  omplete" command
76f0: 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20   of Tcl..  */.  
7700: 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45  case DB_COMPLETE
7710: 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
7720: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
7730: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
7740: 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69  esult;.    int i
7750: 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69  sComplete;.    i
7760: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
7770: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
7780: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
7790: 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20  objv, "SQL");.  
77a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
77b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
77c0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c  isComplete = sql
77d0: 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54  ite3_complete( T
77e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
77f0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20  Obj(objv[2], 0) 
7800: 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
7810: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
7820: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
7830: 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_SetBooleanObj
7840: 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70  (pResult, isComp
7850: 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  lete);.#endif.  
7860: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
7870: 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20 63  /*    $db copy c
7880: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
7890: 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65  m table filename
78a0: 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55   ?SEPARATOR? ?NU
78b0: 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a  LLINDICATOR?.  *
78c0: 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61  *.  ** Copy data
78d0: 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d   into table from
78e0: 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f   filename, optio
78f0: 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41  nally using SEPA
7900: 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f  RATOR.  ** as co
7910: 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e  lumn separators.
7920: 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f    If a column co
7930: 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74  ntains a null st
7940: 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a  ring, or the.  *
7950: 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49  * value of NULLI
7960: 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c  NDICATOR, a NULL
7970: 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72   is inserted for
7980: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a   the column..  *
7990: 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  * conflict-algor
79a0: 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74  ithm is one of t
79b0: 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69  he sqlite confli
79c0: 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20  ct algorithms:. 
79d0: 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c   **    rollback,
79e0: 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67   abort, fail, ig
79f0: 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20  nore, replace.  
7a00: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
7a10: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
7a20: 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
7a30: 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61  sed, not necessa
7a40: 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61  rily same.  ** a
7a50: 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20 64  s 'db changes' d
7a60: 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61  ue to conflict-a
7a70: 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65  lgorithm selecte
7a80: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
7a90: 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63 61  s code is basica
7aa0: 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  lly an implement
7ab0: 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e  ation/enhancemen
7ac0: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
7ad0: 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e  lite3 shell.c ".
7ae0: 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e  import" command.
7af0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
7b00: 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73  command usage is
7b10: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
7b20: 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50  he sqlite2.x COP
7b30: 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a  Y statement,.  *
7b40: 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20  * which imports 
7b50: 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61  file data into a
7b60: 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65   table using the
7b70: 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59   PostgreSQL COPY
7b80: 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20   file format:.  
7b90: 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24 63  **   $db copy $c
7ba0: 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62  onflit_algo $tab
7bb0: 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d  le_name $filenam
7bc0: 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20  e \t \\N.  */.  
7bd0: 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a  case DB_COPY: {.
7be0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65      char *zTable
7bf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c00: 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
7c10: 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a  nto this table *
7c20: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c  /.    char *zFil
7c30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7c40: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
7c50: 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72  om which to extr
7c60: 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  act data */.    
7c70: 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b  char *zConflict;
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7c90: 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  he conflict algo
7ca0: 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  rithm to use */.
7cb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
7cc0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
7cd0: 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a  /* A statement *
7ce0: 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  /.    int rc;   
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
7d10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d40: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
7d50: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
7d60: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
7d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7d80: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
7d90: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
7da0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
7dd0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
7de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7df0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7e00: 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d   bytes in zSep[]
7e10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c   */.    int nNul
7e20: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7e30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7e40: 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b   bytes in zNull[
7e50: 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
7e60: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
7e70: 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
7e80: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
7e90: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20  char *zLine;    
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7eb0: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
7ec0: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66  input from the f
7ed0: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
7ee0: 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20  **azCol;        
7ef0: 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b         /* zLine[
7f00: 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f  ] broken up into
7f10: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
7f20: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
7f40: 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61  ow to commit cha
7f50: 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45  nges */.    FILE
7f60: 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
7f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
7f80: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
7f90: 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b   int lineno = 0;
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7fb0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69  Line number of i
7fc0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
7fd0: 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38   char zLineNum[8
7fe0: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
7ff0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e  Line number prin
8000: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
8010: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
8020: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
8030: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a  nterp result */.
8040: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b  .    char *zSep;
8050: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  .    char *zNull
8060: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
8070: 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
8080: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
8090: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
80a0: 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
80b0: 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
80c0: 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
80d0: 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
80e0: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
80f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8100: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8110: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
8120: 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
8130: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8140: 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
8150: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8160: 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
8170: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
8180: 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
8190: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
81a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
81b0: 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
81c0: 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
81d0: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
81e0: 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
81f0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8200: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
8210: 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
8220: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
8230: 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
8240: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
8250: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
8260: 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
8270: 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65  Sep = strlen(zSe
8280: 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20  p);.    nNull = 
8290: 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20  strlen(zNull);. 
82a0: 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29     if( nSep==0 )
82b0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
82c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
82d0: 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
82e0: 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
82f0: 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30 29  red for copy",0)
8300: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8310: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8320: 20 20 20 20 69 66 28 73 71 6c 69 74 65 33 53 74      if(sqlite3St
8330: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
8340: 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20   "rollback") != 
8350: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
8360: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
8370: 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20  lict, "abort"   
8380: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
8390: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
83a0: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c  zConflict, "fail
83b0: 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20  "    ) != 0 &&. 
83c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
83d0: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
83e0: 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30  "ignore"  ) != 0
83f0: 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74   &&.       sqlit
8400: 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c  e3StrICmp(zConfl
8410: 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29  ict, "replace" )
8420: 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20   != 0 ) {.      
8430: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8440: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
8450: 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c   \"", zConflict,
8460: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c   .            "\
8470: 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ", conflict-algo
8480: 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e  rithm must be on
8490: 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20  e of: rollback, 
84a0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ".            "a
84b0: 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f  bort, fail, igno
84c0: 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c  re, or replace",
84d0: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
84e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
84f0: 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71   }.    zSql = sq
8500: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
8510: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71  ELECT * FROM '%q
8520: 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  '", zTable);.   
8530: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
8540: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
8550: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8560: 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74  Error: no such t
8570: 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c  able: ", zTable,
8580: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
8590: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
85a0: 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73   }.    nByte = s
85b0: 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20  trlen(zSql);.   
85c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
85d0: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
85e0: 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20  Sql, 0, &pStmt, 
85f0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
8600: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
8610: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
8620: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8630: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
8640: 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
8650: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
8660: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  .      nCol = 0;
8670: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8680: 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
8690: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
86a0: 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tmt);.    }.    
86b0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
86c0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
86d0: 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20   nCol==0 ) {.   
86e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
86f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
8700: 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42  Sql = malloc( nB
8710: 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a  yte + 50 + nCol*
8720: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  2 );.    if( zSq
8730: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54  l==0 ) {.      T
8740: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8750: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
8760: 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c  can't malloc()",
8770: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
8780: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8790: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
87a0: 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30  nprintf(nByte+50
87b0: 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20  , zSql, "INSERT 
87c0: 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20  OR %q INTO '%q' 
87d0: 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20  VALUES(?",.     
87e0: 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a      zConflict, z
87f0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20  Table);.    j = 
8800: 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20  strlen(zSql);.  
8810: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
8820: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
8830: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
8840: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
8850: 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
8860: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
8870: 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
8880: 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
8890: 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
88a0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70  >db, zSql, 0, &p
88b0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72  Stmt, 0);.    fr
88c0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
88d0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
88e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
88f0: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22  nterp, "Error: "
8900: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
8910: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
8920: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
8930: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
8940: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8950: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8960: 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  in = fopen(zFile
8970: 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  , "rb");.    if(
8980: 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   in==0 ){.      
8990: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
89a0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
89b0: 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c   cannot open fil
89c0: 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c  e: ", zFile, NUL
89d0: 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
89e0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
89f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8a00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8a10: 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c  .    azCol = mal
8a20: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f  loc( sizeof(azCo
8a30: 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29  l[0])*(nCol+1) )
8a40: 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d  ;.    if( azCol=
8a50: 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
8a60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8a70: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
8a80: 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30  n't malloc()", 0
8a90: 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  );.      fclose(
8aa0: 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
8ab0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8ac0: 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c   }.    (void)sql
8ad0: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
8ae0: 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  b, "BEGIN", 0, 0
8af0: 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69  , 0);.    zCommi
8b00: 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20  t = "COMMIT";.  
8b10: 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20    while( (zLine 
8b20: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
8b30: 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20  0, in))!=0 ){.  
8b40: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
8b50: 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20     i = 0;.      
8b60: 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
8b70: 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65  azCol[0] = zLine
8b80: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
8b90: 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b   z=zLine; *z; z+
8ba0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
8bb0: 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73  *z==zSep[0] && s
8bc0: 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20  trncmp(z, zSep, 
8bd0: 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nSep)==0 ){.    
8be0: 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20        *z = 0;.  
8bf0: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
8c00: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f         if( i<nCo
8c10: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
8c20: 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e   azCol[i] = &z[n
8c30: 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Sep];.          
8c40: 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20    z += nSep-1;. 
8c50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8c60: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8c70: 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c     if( i+1!=nCol
8c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
8c90: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20   *zErr;.        
8ca0: 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 32 30  zErr = malloc(20
8cb0: 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  0 + strlen(zFile
8cc0: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
8cd0: 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zErr ){.        
8ce0: 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72 2c 0a    sprintf(zErr,.
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72               "Er
8d00: 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a  ror: %s line %d:
8d10: 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
8d20: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74  umns of data but
8d30: 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20   found %d",.    
8d40: 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20           zFile, 
8d50: 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b  lineno, nCol, i+
8d60: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  1);.          Tc
8d70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8d80: 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b  nterp, zErr, 0);
8d90: 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28  .          free(
8da0: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  zErr);.        }
8db0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74  .        zCommit
8dc0: 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   = "ROLLBACK";. 
8dd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8de0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8df0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
8e00: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68  ){.        /* ch
8e10: 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74  eck for null dat
8e20: 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61  a, if so, bind a
8e30: 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  s null */.      
8e40: 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e 30 20 26    if ((nNull>0 &
8e50: 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69  & strcmp(azCol[i
8e60: 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20 7c 7c  ], zNull)==0) ||
8e70: 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d   strlen(azCol[i]
8e80: 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20 20 20  )==0) {.        
8e90: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
8ea0: 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b  ull(pStmt, i+1);
8eb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8ec0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8ed0: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
8ee0: 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d  t, i+1, azCol[i]
8ef0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
8f00: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
8f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8f20: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
8f30: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
8f40: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
8f50: 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  t);.      free(z
8f60: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
8f70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8f80: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
8f90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8fa0: 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  p,"Error: ", sql
8fb0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
8fc0: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
8fd0: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c    zCommit = "ROL
8fe0: 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20  LBACK";.        
8ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9000: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a     }.    free(az
9010: 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65  Col);.    fclose
9020: 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (in);.    sqlite
9030: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
9040: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
9050: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
9060: 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  b, zCommit, 0, 0
9070: 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a  , 0);..    if( z
9080: 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27  Commit[0] == 'C'
9090: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63   ){.      /* suc
90a0: 63 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74  cess, set result
90b0: 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69   as number of li
90c0: 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  nes processed */
90d0: 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d  .      pResult =
90e0: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
90f0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
9100: 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70   Tcl_SetIntObj(p
9110: 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b  Result, lineno);
9120: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
9130: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
9140: 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c       /* failure,
9150: 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77   append lineno w
9160: 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  here failed */. 
9170: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69       sprintf(zLi
9180: 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e  neNum,"%d",linen
9190: 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  o);.      Tcl_Ap
91a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
91b0: 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c  p,", failed whil
91c0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e  e processing lin
91d0: 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29  e: ",zLineNum,0)
91e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
91f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9200: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
9210: 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
9220: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
9230: 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a  sion BOOLEAN.  *
9240: 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20  *.  ** Turn the 
9250: 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e  extension loadin
9260: 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20  g feature on or 
9270: 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20  off.  It if off 
9280: 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e  by.  ** default.
9290: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
92a0: 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
92b0: 4e 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74  NSION: {.    int
92c0: 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28 20   onoff;.    if( 
92d0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
92e0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
92f0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
9300: 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  v, "BOOLEAN");. 
9310: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9320: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9330: 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
9340: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
9350: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f  p, objv[2], &ono
9360: 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ff) ){.      ret
9370: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9380: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9390: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
93a0: 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  ension(pDb->db, 
93b0: 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65 61  onoff);.    brea
93c0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
93d0: 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f  *    $db errorco
93e0: 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  de.  **.  ** Ret
93f0: 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
9400: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20  error code that 
9410: 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  was returned by 
9420: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
9430: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
9440: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a  ite3_exec()..  *
9450: 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f  /.  case DB_ERRO
9460: 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c  RCODE: {.    Tcl
9470: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
9480: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
9490: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63  Obj(sqlite3_errc
94a0: 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  ode(pDb->db)));.
94b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
94c0: 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20    .  /*.  **    
94d0: 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61  $db eval $sql ?a
94e0: 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64  rray? ?{  ...cod
94f0: 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20  e... }?.  **    
9500: 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73  $db onecolumn $s
9510: 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ql.  **.  ** The
9520: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
9530: 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61  n $sql is evalua
9540: 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72  ted.  For each r
9550: 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61  ow, the values a
9560: 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69  re.  ** placed i
9570: 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  n elements of th
9580: 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61  e array named "a
9590: 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64  rray" and ...cod
95a0: 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64  e... is executed
95b0: 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
95c0: 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65  " and "code" are
95d0: 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e   omitted, then n
95e0: 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76  o callback is ev
95f0: 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a  ery invoked..  *
9600: 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20  * If "array" is 
9610: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
9620: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
9630: 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76   are placed in v
9640: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68  ariables.  ** th
9650: 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  at have the same
9660: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65   name as the fie
9670: 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79  lds extracted by
9680: 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a   the query..  **
9690: 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c  .  ** The onecol
96a0: 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68  umn method is th
96b0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a  e equivalent of:
96c0: 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78  .  **     lindex
96d0: 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d   [$db eval $sql]
96e0: 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44   0.  */.  case D
96f0: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63  B_ONECOLUMN:.  c
9700: 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20 63  ase DB_EVAL:.  c
9710: 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20 7b  ase DB_EXISTS: {
9720: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
9730: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e  *zSql;      /* N
9740: 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ext SQL statemen
9750: 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  t to execute */.
9760: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
9770: 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57 68  zLeft;     /* Wh
9780: 61 74 20 69 73 20 6c 65 66 74 20 61 66 74 65 72  at is left after
9790: 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20 7a   first stmt in z
97a0: 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  Sql */.    sqlit
97b0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
97c0: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51    /* Compiled SQ
97d0: 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20  L statment */.  
97e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61    Tcl_Obj *pArra
97f0: 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  y;       /* Name
9800: 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20 77   of array into w
9810: 68 69 63 68 20 72 65 73 75 6c 74 73 20 61 72 65  hich results are
9820: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
9830: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
9840: 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74  ;      /* Script
9850: 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68   to run for each
9860: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
9870: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50     Tcl_Obj **apP
9880: 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61 72  arm;      /* Par
9890: 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65 65  ameters that nee
98a0: 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66 43  d a Tcl_DecrRefC
98b0: 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e  ount() */.    in
98c0: 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20  t nParm;        
98d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
98e0: 66 20 65 6e 74 72 69 65 73 20 75 73 65 64 20 69  f entries used i
98f0: 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20  n apParm[] */.  
9900: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d    Tcl_Obj *aParm
9910: 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74  [10];    /* Stat
9920: 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 70 50  ic space for apP
9930: 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d  arm[] in the com
9940: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
9950: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20  Tcl_Obj *pRet;  
9960: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
9970: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a  to be returned *
9980: 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72 65  /.    SqlPrepare
9990: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b  dStmt *pPreStmt;
99a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
99b0: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
99c0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
99d0: 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63 68  rc2;..    if( ch
99e0: 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29 7b  oice==DB_EVAL ){
99f0: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  .      if( objc<
9a00: 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20  3 || objc>5 ){. 
9a10: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
9a20: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9a30: 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41  2, objv, "SQL ?A
9a40: 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49  RRAY-NAME? ?SCRI
9a50: 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72  PT?");.        r
9a60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9a70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
9a80: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
9a90: 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  ();.      Tcl_In
9aa0: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
9ab0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9ac0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
9ad0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
9ae0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9af0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
9b00: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
9b10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9b20: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9b30: 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54  choice==DB_EXIST
9b40: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65  S ){.        pRe
9b50: 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  t = Tcl_NewBoole
9b60: 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20 20  anObj(0);.      
9b70: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9b80: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
9b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
9ba0: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Ret = 0;.      }
9bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
9bc0: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
9bd0: 70 41 72 72 61 79 20 3d 20 70 53 63 72 69 70 74  pArray = pScript
9be0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
9bf0: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
9c00: 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 30 3b       pArray = 0;
9c10: 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
9c20: 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 65   objv[3];.    }e
9c30: 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72 61  lse{.      pArra
9c40: 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  y = objv[3];.   
9c50: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53 74     if( Tcl_GetSt
9c60: 72 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d 3d  ring(pArray)[0]=
9c70: 3d 30 20 29 20 70 41 72 72 61 79 20 3d 20 30 3b  =0 ) pArray = 0;
9c80: 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
9c90: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a   objv[4];.    }.
9ca0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
9cb0: 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a  Count(objv[2]);.
9cc0: 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47      zSql = Tcl_G
9cd0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9ce0: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
9cf0: 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f   while( rc==TCL_
9d00: 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b  OK && zSql[0] ){
9d10: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9d40: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  r */.      int n
9d50: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
9d60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9d70: 6f 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65  of bind paramete
9d80: 72 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74 20  rs in the pStmt 
9d90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  */.      int nCo
9da0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9db0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9dc0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
9dd0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
9de0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70      Tcl_Obj **ap
9df0: 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 2f  ColName = 0;   /
9e00: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  * Array of colum
9e10: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20  n names */.     
9e20: 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20   int len;       
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9e40: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66 20  tring length of 
9e50: 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20 20  zSql */.  .     
9e60: 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
9e70: 61 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  a SQL statement 
9e80: 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
9e90: 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61   been compiled a
9ea0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63  nd.      ** whic
9eb0: 68 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 65  h matches the ne
9ec0: 78 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20 53  xt sequence of S
9ed0: 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  QL..      */.   
9ee0: 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
9ef0: 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70      pPreStmt = p
9f00: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20  Db->stmtList;.  
9f10: 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
9f20: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 66  (zSql);.      if
9f30: 28 20 70 50 72 65 53 74 6d 74 20 26 26 20 73 71  ( pPreStmt && sq
9f40: 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70 50  lite3_expired(pP
9f50: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 20 29  reStmt->pStmt) )
9f60: 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53  {.        flushS
9f70: 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a 20  tmtCache(pDb);. 
9f80: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20         pPreStmt 
9f90: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9fa0: 20 20 20 66 6f 72 28 3b 20 70 50 72 65 53 74 6d     for(; pPreStm
9fb0: 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65  t; pPreStmt=pPre
9fc0: 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Stmt->pNext){.  
9fd0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50        int n = pP
9fe0: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20  reStmt->nSql;.  
9ff0: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 3d 6e        if( len>=n
a000: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
a010: 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74   memcmp(pPreStmt
a020: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29  ->zSql, zSql, n)
a030: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
a040: 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c  && (zSql[n]==0 |
a050: 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27  | zSql[n-1]==';'
a060: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
a070: 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70         pStmt = p
a080: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
a090: 20 20 20 20 20 20 20 20 20 20 7a 4c 65 66 74 20            zLeft 
a0a0: 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d 74  = &zSql[pPreStmt
a0b0: 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20 20  ->nSql];..      
a0c0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72      /* When a pr
a0d0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a0e0: 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e   is found, unlin
a0f0: 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20  k it from the.  
a100: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65          ** cache
a110: 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
a120: 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20 62  later be added b
a130: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
a140: 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  ning.          *
a150: 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  * of the cache l
a160: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ist in order to 
a170: 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65  implement LRU re
a180: 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20  placement..     
a190: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a1a0: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e    if( pPreStmt->
a1b0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
a1c0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
a1d0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50  Prev->pNext = pP
a1e0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
a1f0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
a200: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d              pDb-
a210: 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65  >stmtList = pPre
a220: 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Stmt->pNext;.   
a230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a240: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
a250: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
a260: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
a270: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
a280: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
a290: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
a2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62  .            pDb
a2b0: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72  ->stmtLast = pPr
a2c0: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
a2d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a2e0: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
a2f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
a300: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
a310: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
a320: 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20   If no prepared 
a330: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f  statement was fo
a340: 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20 74 68  und.  Compile th
a350: 65 20 53 51 4c 20 74 65 78 74 0a 20 20 20 20 20  e SQL text.     
a360: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53   */.      if( pS
a370: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt==0 ){.      
a380: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
a390: 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  =sqlite3_prepare
a3a0: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
a3b0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65  -1, &pStmt, &zLe
a3c0: 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ft) ){.         
a3d0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
a3e0: 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74  t(interp, dbText
a3f0: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ToObj(sqlite3_er
a400: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b  rmsg(pDb->db)));
a410: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
a420: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
a430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a440: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
a450: 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( pStmt==0 ){.  
a460: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
a470: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
a480: 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20  rrcode(pDb->db) 
a490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
a4a0: 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  * A compile-time
a4b0: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73 74   error in the st
a4c0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
a4d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
a4e0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
a4f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
a500: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
a510: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29  errmsg(pDb->db))
a520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
a530: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
a540: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a550: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
a560: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
a570: 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * The statement 
a580: 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f  was a no-op.  Co
a590: 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65  ntinue to the ne
a5a0: 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  xt statement.   
a5b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74           ** in t
a5c0: 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20  he SQL string.. 
a5d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
a5e0: 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d            zSql =
a5f0: 20 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20   zLeft;.        
a600: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
a610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a620: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
a630: 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  rt( pPreStmt==0 
a640: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
a650: 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73    /* Bind values
a660: 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74   to parameters t
a670: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24  hat begin with $
a680: 20 6f 72 20 3a 0a 20 20 20 20 20 20 2a 2f 20 20   or :.      */  
a690: 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71  .      nVar = sq
a6a0: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
a6b0: 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74  eter_count(pStmt
a6c0: 29 3b 0a 20 20 20 20 20 20 6e 50 61 72 6d 20 3d  );.      nParm =
a6d0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 56   0;.      if( nV
a6e0: 61 72 3e 73 69 7a 65 6f 66 28 61 50 61 72 6d 29  ar>sizeof(aParm)
a6f0: 2f 73 69 7a 65 6f 66 28 61 50 61 72 6d 5b 30 5d  /sizeof(aParm[0]
a700: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 50  ) ){.        apP
a710: 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a  arm = (Tcl_Obj**
a720: 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a  )Tcl_Alloc(nVar*
a730: 73 69 7a 65 6f 66 28 61 70 50 61 72 6d 5b 30 5d  sizeof(apParm[0]
a740: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
a750: 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 20  .        apParm 
a760: 3d 20 61 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = aParm;.      }
a770: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
a780: 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  i<=nVar; i++){. 
a790: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
a7a0: 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65  r *zVar = sqlite
a7b0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
a7c0: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b  _name(pStmt, i);
a7d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 56 61  .        if( zVa
a7e0: 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d  r!=0 && (zVar[0]
a7f0: 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d  =='$' || zVar[0]
a800: 3d 3d 27 3a 27 29 20 29 7b 0a 20 20 20 20 20 20  ==':') ){.      
a810: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
a820: 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45  r = Tcl_GetVar2E
a830: 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b  x(interp, &zVar[
a840: 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  1], 0, 0);.     
a850: 20 20 20 20 20 69 66 28 20 70 56 61 72 20 29 7b       if( pVar ){
a860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
a870: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
a880: 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20  u8 *data;.      
a890: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70        char *zTyp
a8a0: 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65 50 74  e = pVar->typePt
a8b0: 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74  r ? pVar->typePt
a8c0: 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20  r->name : "";.  
a8d0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63            char c
a8e0: 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20   = zType[0];.   
a8f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
a900: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
a910: 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29  ype,"bytearray")
a920: 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74  ==0 && pVar->byt
a930: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
a940: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6c         /* Only l
a950: 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65 20  oad a BLOB type 
a960: 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61  if the Tcl varia
a970: 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72  ble is a bytearr
a980: 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ay and.         
a990: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73       ** has no s
a9a0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
a9b0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
a9c0: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63         data = Tc
a9d0: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
a9e0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
a9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
aa00: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
aa10: 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c  (pStmt, i, data,
aa20: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
aa30: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
aa40: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
aa50: 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20  nt(pVar);.      
aa60: 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b 6e          apParm[n
aa70: 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a  Parm++] = pVar;.
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
aa90: 65 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26  e if( (c=='b' &&
aaa0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62   strcmp(zType,"b
aab0: 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a  oolean")==0) ||.
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72    (c=='i' && str
aae0: 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29  cmp(zType,"int")
aaf0: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
ab00: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74        Tcl_GetInt
ab10: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ab20: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
ab30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ab40: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
ab50: 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   i, n);.        
ab60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
ab70: 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='d' && strcmp(z
ab80: 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Type,"double")==
ab90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
aba0: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
abb0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
abc0: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
abd0: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 72  interp, pVar, &r
abe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
abf0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
ac00: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20 72  uble(pStmt, i, r
ac10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
ac20: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 77 27 20  else if( c=='w' 
ac30: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
ac40: 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 20 29 7b  "wideInt")==0 ){
ac50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
ac60: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
ac80: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
ac90: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
aca0: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &v);.           
acb0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
acc0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20  int64(pStmt, i, 
acd0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
ace0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
acf0: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
ad00: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
ad10: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
ad20: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
ad30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ad40: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
ad50: 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29 64  mt, i, (char *)d
ad60: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
ad70: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
ad80: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
ad90: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
adb0: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
adc0: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
add0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
ade0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
adf0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
ae00: 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a 20 20  ( pStmt, i );.  
ae10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
ae30: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f     /* Compute co
ae40: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
ae50: 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
ae60: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
ae70: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  pStmt);.      if
ae80: 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20  ( pScript ){.   
ae90: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d       apColName =
aea0: 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f   (Tcl_Obj**)Tcl_
aeb0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63  Alloc( sizeof(Tc
aec0: 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a  l_Obj*)*nCol );.
aed0: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 43 6f          if( apCo
aee0: 6c 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  lName==0 ) break
aef0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
af00: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
af10: 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 6f 6c  .          apCol
af20: 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78 74  Name[i] = dbText
af30: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ToObj(sqlite3_co
af40: 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
af50: 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  i));.          T
af60: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
af70: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
af80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
af90: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  ..      /* If re
afa0: 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20  sults are being 
afb0: 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72  stored in an arr
afc0: 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65  ay variable, the
afd0: 6e 20 63 72 65 61 74 65 0a 20 20 20 20 20 20 2a  n create.      *
afe0: 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65  * the array(*) e
aff0: 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72  ntry for that ar
b000: 72 61 79 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ray.      */.   
b010: 20 20 20 69 66 28 20 70 41 72 72 61 79 20 29 7b     if( pArray ){
b020: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
b030: 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c   *pColList = Tcl
b040: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
b050: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61     Tcl_Obj *pSta
b060: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
b070: 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 20  gObj("*", -1);. 
b080: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
b090: 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74  efCount(pColList
b0a0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
b0b0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
b0c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
b0d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b0e0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f  ment(interp, pCo
b0f0: 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65  lList, apColName
b100: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
b110: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53          Tcl_ObjS
b120: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
b130: 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43  Array, pStar, pC
b140: 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20  olList,0);.     
b150: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
b160: 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20  unt(pColList);. 
b170: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
b180: 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a  efCount(pStar);.
b190: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
b1a0: 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 53 51  * Execute the SQ
b1b0: 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  L.      */.     
b1c0: 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f   while( rc==TCL_
b1d0: 4f 4b 20 26 26 20 70 53 74 6d 74 20 26 26 20 53  OK && pStmt && S
b1e0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
b1f0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
b200: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
b210: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
b220: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  .          Tcl_O
b230: 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20  bj *pVal;.      
b240: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 2f      .          /
b250: 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f  * Set pVal to co
b260: 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63  ntain the i'th c
b270: 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f  olumn of this ro
b280: 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  w. */.          
b290: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
b2a0: 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
b2b0: 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  t, i) ){.       
b2c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b2d0: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20  _BLOB: {.       
b2e0: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
b2f0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
b300: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
b310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b320: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42   pVal = Tcl_NewB
b330: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69  yteArrayObj(sqli
b340: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
b350: 70 53 74 6d 74 2c 20 69 29 2c 20 62 79 74 65 73  pStmt, i), bytes
b360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b380: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b390: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
b3a0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20  TEGER: {.       
b3b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e         sqlite_in
b3c0: 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  t64 v = sqlite3_
b3d0: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
b3e0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
b3f0: 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31        if( v>=-21
b400: 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32  47483647 && v<=2
b410: 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20  147483647 ){.   
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
b430: 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  l = Tcl_NewIntOb
b440: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
b450: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b460: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
b470: 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  = Tcl_NewWideInt
b480: 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Obj(v);.        
b490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b4a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b4b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b4c0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
b4d0: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
b4e0: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
b4f0: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   r = sqlite3_col
b500: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
b510: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
b520: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
b530: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a  ewDoubleObj(r);.
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
b550: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
b560: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
b570: 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
b580: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
b590: 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f   pVal = dbTextTo
b5a0: 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  Obj(pDb->zNull);
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
b5c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b5d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b5e0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
b5f0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
b600: 64 62 54 65 78 74 54 6f 4f 62 6a 28 28 63 68 61  dbTextToObj((cha
b610: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
b620: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
b630: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
b640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b660: 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
b670: 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20  if( pScript ){. 
b680: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
b690: 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20  Array==0 ){.    
b6a0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
b6b0: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
b6c0: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30   apColName[i], 0
b6d0: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
b6e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
b700: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
b710: 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43 6f  rp, pArray, apCo
b720: 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20  lName[i], pVal, 
b730: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
b740: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
b750: 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42  e if( choice==DB
b760: 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  _ONECOLUMN ){.  
b770: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
b780: 28 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20 20 20  ( pRet==0 );.   
b790: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
b7a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
b7b0: 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 56 61        pRet = pVa
b7c0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
b7d0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
b7e0: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  t(pRet);.       
b7f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b800: 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41     rc = TCL_BREA
b810: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  K;.            i
b820: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = nCol;.       
b830: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f     }else if( cho
b840: 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20 29  ice==DB_EXISTS )
b850: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  {.            Tc
b860: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
b870: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ret);.          
b880: 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
b890: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 3b 0a 20  BooleanObj(1);. 
b8a0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
b8b0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
b8c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
b8d0: 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20  c = TCL_BREAK;. 
b8e0: 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e             i = n
b8f0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Col;.          }
b900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b910: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b920: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
b930: 70 2c 20 70 52 65 74 2c 20 70 56 61 6c 29 3b 0a  p, pRet, pVal);.
b940: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b950: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
b960: 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a   if( pScript ){.
b970: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
b980: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
b990: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
b9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
b9b0: 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45  rc==TCL_CONTINUE
b9c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b9d0: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
b9e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b9f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
ba00: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
ba10: 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  AK ){.        rc
ba20: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20   = TCL_OK;.     
ba30: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   }..      /* Fre
ba40: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
ba50: 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20  e objects */.   
ba60: 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29     if( pScript )
ba70: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
ba80: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
ba90: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44  .          Tcl_D
baa0: 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f  ecrRefCount(apCo
bab0: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
bac0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c     }.        Tcl
bad0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70 43  _Free((char*)apC
bae0: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  olName);.      }
baf0: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  ..      /* Free 
bb00: 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67  the bound string
bb10: 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65   and blob parame
bb20: 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f  ters */.      fo
bb30: 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b 20  r(i=0; i<nParm; 
bb40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63  i++){.        Tc
bb50: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61  l_DecrRefCount(a
bb60: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20 20  pParm[i]);.     
bb70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70 50   }.      if( apP
bb80: 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20 20  arm!=aParm ){.  
bb90: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
bba0: 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a 20  char*)apParm);. 
bbb0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
bbc0: 20 52 65 73 65 74 20 74 68 65 20 73 74 61 74 65   Reset the state
bbd0: 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72 65  ment.  If the re
bbe0: 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53 51 4c  sult code is SQL
bbf0: 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68 65 6e  ITE_SCHEMA, then
bc00: 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
bc10: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61  the statement ca
bc20: 63 68 65 20 61 6e 64 20 74 72 79 20 74 68 65 20  che and try the 
bc30: 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 2e  statement again.
bc40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
bc50: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
bc60: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
bc70: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 53 43 48    if( SQLITE_SCH
bc80: 45 4d 41 3d 3d 72 63 32 20 29 7b 0a 20 20 20 20  EMA==rc2 ){.    
bc90: 20 20 20 20 2f 2a 20 41 66 74 65 72 20 61 20 73      /* After a s
bca0: 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 66 6c  chema change, fl
bcb0: 75 73 68 20 74 68 65 20 63 61 63 68 65 20 61 6e  ush the cache an
bcc0: 64 20 74 72 79 20 74 6f 20 72 75 6e 20 74 68 65  d try to run the
bcd0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74  .        ** stat
bce0: 65 6d 65 6e 74 20 61 67 61 69 6e 0a 20 20 20 20  ement again.    
bcf0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
bd00: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
bd10: 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Db );.        sq
bd20: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
bd30: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Stmt);.        i
bd40: 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63  f( pPreStmt ) Tc
bd50: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50  l_Free((char*)pP
bd60: 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  reStmt);.       
bd70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
bd80: 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
bd90: 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20 20  E_OK!=rc2 ){.   
bda0: 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75 6e       /* If a run
bdb0: 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63 75  -time error occu
bdc0: 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65  rs, report the e
bdd0: 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72 65  rror and stop re
bde0: 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  ading.        **
bdf0: 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20 20   the SQL.       
be00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   */.        Tcl_
be10: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
be20: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
be30: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
be40: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
be50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
be60: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
be70: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
be80: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ROR;.        if(
be90: 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f   pPreStmt ) Tcl_
bea0: 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65  Free((char*)pPre
beb0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Stmt);.        b
bec0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
bed0: 65 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74  e if( pDb->maxSt
bee0: 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt<=0 ){.       
bef0: 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
bf00: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20   is turned off, 
bf10: 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20  deallocated the 
bf20: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
bf30: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
bf40: 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68  t ) Tcl_Free((ch
bf50: 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20  ar*)pPreStmt);. 
bf60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
bf70: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
bf80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bf90: 20 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68 69       /* Everythi
bfa0: 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74 68  ng worked and th
bfb0: 65 20 63 61 63 68 65 20 69 73 20 6f 70 65 72 61  e cache is opera
bfc0: 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20 20  tional..        
bfd0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
bfe0: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
bff0: 73 74 72 75 63 74 75 72 65 20 69 66 20 77 65 20  structure if we 
c000: 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20 20  need one..      
c010: 20 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72 65    ** (If we alre
c020: 61 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65 20  ady have one we 
c030: 63 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20 69  can just reuse i
c040: 74 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  t.).        */. 
c050: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
c060: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt==0 ){.      
c070: 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74 20      len = zLeft 
c080: 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  - zSql;.        
c090: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71    pPreStmt = (Sq
c0a0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54  lPreparedStmt*)T
c0b0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
c0c0: 28 2a 70 50 72 65 53 74 6d 74 29 20 2b 20 6c 65  (*pPreStmt) + le
c0d0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  n );.          i
c0e0: 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  f( pPreStmt==0 )
c0f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c100: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  R;.          pPr
c110: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70  eStmt->pStmt = p
c120: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
c130: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d  pPreStmt->nSql =
c140: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   len;.          
c150: 6d 65 6d 63 70 79 28 70 50 72 65 53 74 6d 74 2d  memcpy(pPreStmt-
c160: 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e  >zSql, zSql, len
c170: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  );.          pPr
c180: 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65 6e 5d  eStmt->zSql[len]
c190: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
c1a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  .        /* Add 
c1b0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
c1c0: 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65  tement to the be
c1d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
c1e0: 61 63 68 65 20 6c 69 73 74 0a 20 20 20 20 20 20  ache list.      
c1f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 72    */.        pPr
c200: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70  eStmt->pNext = p
c210: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20  Db->stmtList;.  
c220: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
c230: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
c240: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
c250: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
c260: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e   pDb->stmtList->
c270: 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74  pPrev = pPreStmt
c280: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c290: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
c2a0: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
c2b0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73        if( pDb->s
c2c0: 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20  tmtLast==0 ){.  
c2d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c2e0: 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b  pDb->nStmt==0 );
c2f0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
c300: 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53  stmtLast = pPreS
c310: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  tmt;.        }el
c320: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
c330: 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74  sert( pDb->nStmt
c340: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  >0 );.        }.
c350: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74          pDb->nSt
c360: 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20 20  mt++;.   .      
c370: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
c380: 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d 65  too many stateme
c390: 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65 6d  nt in cache, rem
c3a0: 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73 20  ove the surplus 
c3b0: 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20  from the.       
c3c0: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 63   ** end of the c
c3d0: 61 63 68 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  ache list..     
c3e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68     */.        wh
c3f0: 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e  ile( pDb->nStmt>
c400: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a  pDb->maxStmt ){.
c410: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c420: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e  3_finalize(pDb->
c430: 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29  stmtLast->pStmt)
c440: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
c450: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d  >stmtLast = pDb-
c460: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76  >stmtLast->pPrev
c470: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
c480: 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 2d  Free((char*)pDb-
c490: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74  >stmtLast->pNext
c4a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
c4b0: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78  ->stmtLast->pNex
c4c0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
c4d0: 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20   pDb->nStmt--;. 
c4e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c4f0: 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65  ..      /* Proce
c500: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
c510: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
c520: 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a    zSql = zLeft;.
c530: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
c540: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b  crRefCount(objv[
c550: 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 52  2]);..    if( pR
c560: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  et ){.      if( 
c570: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
c580: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
c590: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
c5a0: 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ret);.      }.  
c5b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
c5c0: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
c5d0: 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
c5e0: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  L_OK ){.      Tc
c5f0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
c600: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  terp);.    }.   
c610: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
c620: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66  *.  **     $db f
c630: 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52  unction NAME SCR
c640: 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
c650: 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66  eate a new SQL f
c660: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
c670: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74  AME.  Whenever t
c680: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  hat function is.
c690: 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76    ** called, inv
c6a0: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
c6b0: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
c6c0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
c6d0: 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   DB_FUNCTION: {.
c6e0: 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75      SqlFunc *pFu
c6f0: 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  nc;.    Tcl_Obj 
c700: 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68  *pScript;.    ch
c710: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
c720: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
c730: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
c740: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
c750: 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49  objv, "NAME SCRI
c760: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
c770: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c780: 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
c790: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
c7a0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
c7b0: 3b 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d 20  ;.    pScript = 
c7c0: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 70 46 75  objv[3];.    pFu
c7d0: 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63  nc = findSqlFunc
c7e0: 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  (pDb, zName);.  
c7f0: 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29    if( pFunc==0 )
c800: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c810: 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  R;.    if( pFunc
c820: 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20  ->pScript ){.   
c830: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
c840: 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69  unt(pFunc->pScri
c850: 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pt);.    }.    p
c860: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20  Func->pScript = 
c870: 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c  pScript;.    Tcl
c880: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
c890: 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e  cript);.    pFun
c8a0: 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d  c->useEvalObjv =
c8b0: 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62   safeToUseEvalOb
c8c0: 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  jv(interp, pScri
c8d0: 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  pt);.    rc = sq
c8e0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
c8f0: 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a  ction(pDb->db, z
c900: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
c910: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70  _UTF8,.        p
c920: 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63  Func, tclSqlFunc
c930: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
c940: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c950: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
c960: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63  _ERROR;.      Tc
c970: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
c980: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
c990: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
c9a0: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
c9b0: 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  E);.    }else{. 
c9c0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 66 6c 75       /* Must flu
c9d0: 73 68 20 61 6e 79 20 63 61 63 68 65 64 20 73 74  sh any cached st
c9e0: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
c9f0: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
ca00: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 7d 0a 20  ( pDb );.    }. 
ca10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
ca20: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
ca30: 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a   interrupt.  **.
ca40: 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74    ** Interrupt t
ca50: 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
ca60: 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53  the inner-most S
ca70: 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  QL interpreter. 
ca80: 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65   This.  ** cause
ca90: 73 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  s the SQL statem
caa0: 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  ent to return an
cab0: 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45   error of SQLITE
cac0: 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f  _INTERRUPT..  */
cad0: 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52  .  case DB_INTER
cae0: 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69  RUPT: {.    sqli
caf0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44  te3_interrupt(pD
cb00: 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61  b->db);.    brea
cb10: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
cb20: 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61  *     $db nullva
cb30: 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a  lue ?STRING?.  *
cb40: 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65  *.  ** Change te
cb50: 78 74 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e  xt used when a N
cb60: 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66  ULL comes back f
cb70: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
cb80: 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20  . If ?STRING?.  
cb90: 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  ** is not presen
cba0: 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72  t, then the curr
cbb0: 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64 20  ent string used 
cbc0: 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  for NULL is retu
cbd0: 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54  rned..  ** If ST
cbe0: 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c  RING is present,
cbf0: 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20   then STRING is 
cc00: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20  returned..  **. 
cc10: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55   */.  case DB_NU
cc20: 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69  LLVALUE: {.    i
cc30: 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
cc40: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
cc50: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
cc60: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
cc70: 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20   "NULLVALUE");. 
cc80: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
cc90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
cca0: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
ccb0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
ccc0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c       char *zNull
ccd0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
cce0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
ccf0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
cd00: 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a  ( pDb->zNull ){.
cd10: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
cd20: 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20  (pDb->zNull);.  
cd30: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
cd40: 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29  zNull && len>0 )
cd50: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
cd60: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Null = Tcl_Alloc
cd70: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
cd80: 20 20 20 20 20 73 74 72 6e 63 70 79 28 70 44 62       strncpy(pDb
cd90: 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20  ->zNull, zNull, 
cda0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44  len);.        pD
cdb0: 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20  b->zNull[len] = 
cdc0: 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\0';.      }els
cdd0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
cde0: 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  zNull = 0;.     
cdf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c   }.    }.    Tcl
ce00: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
ce10: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
ce20: 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a  j(pDb->zNull));.
ce30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ce40: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
ce50: 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  b last_insert_ro
ce60: 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  wid .  **.  ** R
ce70: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
ce80: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52 4f   which is the RO
ce90: 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  WID for the most
cea0: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a   recent insert..
ceb0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c    */.  case DB_L
cec0: 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
ced0: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
cee0: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63  *pResult;.    Tc
cef0: 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b  l_WideInt rowid;
cf00: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
cf10: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
cf20: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
cf30: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
cf40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
cf50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
cf60: 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74     rowid = sqlit
cf70: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
cf80: 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20  owid(pDb->db);. 
cf90: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
cfa0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
cfb0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
cfc0: 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65  etWideIntObj(pRe
cfd0: 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20  sult, rowid);.  
cfe0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
cff0: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f  /*.  ** The DB_O
d000: 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20  NECOLUMN method 
d010: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74  is implemented t
d020: 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f  ogether with DB_
d030: 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  EVAL..  */..  /*
d040: 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73 73      $db progress
d050: 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20   ?N CALLBACK?.  
d060: 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  ** .  ** Invoke 
d070: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
d080: 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74 75  ck every N virtu
d090: 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64  al machine opcod
d0a0: 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74 69  es while executi
d0b0: 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ng.  ** queries.
d0c0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
d0d0: 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20  PROGRESS: {.    
d0e0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
d0f0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
d100: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
d110: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d120: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
d130: 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a  >zProgress, 0);.
d140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d150: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
d160: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
d170: 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e  ogress;.      in
d180: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74  t len;.      int
d190: 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43   N;.      if( TC
d1a0: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
d1b0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
d1c0: 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a  objv[2], &N) ){.
d1d0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
d1e0: 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  R;.      };.    
d1f0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
d200: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
d210: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
d220: 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20  rogress);.      
d230: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73  }.      zProgres
d240: 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
d250: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
d260: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
d270: 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20  f( zProgress && 
d280: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
d290: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
d2a0: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
d2b0: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
d2c0: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  strcpy(pDb->zPro
d2d0: 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73  gress, zProgress
d2e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d2f0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
d300: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
d310: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
d320: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
d330: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20  _CALLBACK.      
d340: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
d350: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ss ){.        pD
d360: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
d370: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
d380: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
d390: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c  dler(pDb->db, N,
d3a0: 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
d3b0: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
d3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
d3d0: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
d3e0: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
d3f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
d400: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
d410: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
d420: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
d430: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20  rp, 2, objv, "N 
d440: 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
d450: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d460: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
d470: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
d480: 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43    $db profile ?C
d490: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
d4a0: 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
d4b0: 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
d4c0: 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
d4d0: 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53  ine after each S
d4e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
d4f0: 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20  * that has run. 
d500: 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
d510: 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f   SQL and the amo
d520: 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69  unt of elapse ti
d530: 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65  me are.  ** appe
d540: 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
d550: 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69   before the scri
d560: 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a  pt is run..  */.
d570: 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c    case DB_PROFIL
d580: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
d590: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
d5a0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
d5b0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
d5c0: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
d5d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d5e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
d5f0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
d600: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
d610: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
d620: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
d630: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
d640: 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20  zProfile, 0);.  
d650: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d660: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
d670: 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74  ofile;.      int
d680: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
d690: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
d6a0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
d6b0: 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29  e(pDb->zProfile)
d6c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d6d0: 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47  zProfile = Tcl_G
d6e0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
d6f0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
d700: 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69        if( zProfi
d710: 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  le && len>0 ){. 
d720: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
d730: 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  file = Tcl_Alloc
d740: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
d750: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
d760: 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66  >zProfile, zProf
d770: 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ile);.      }els
d780: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
d790: 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  zProfile = 0;.  
d7a0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
d7b0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
d7c0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
d7d0: 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
d7e0: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
d7f0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
d800: 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
d810: 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66  (pDb->db, DbProf
d820: 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  ileHandler, pDb)
d830: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
d850: 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
d860: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
d870: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
d880: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
d890: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65  .  **     $db re
d8a0: 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a  key KEY.  **.  *
d8b0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63  * Change the enc
d8c0: 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74  ryption key on t
d8d0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
d8e0: 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  n database..  */
d8f0: 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59  .  case DB_REKEY
d900: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  : {.    int nKey
d910: 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  ;.    void *pKey
d920: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
d930: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
d940: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
d950: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
d960: 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
d970: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
d980: 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63   }.    pKey = Tc
d990: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
d9a0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
d9b0: 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  nKey);.#ifdef SQ
d9c0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
d9d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
d9e0: 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
d9f0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
da00: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
da10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
da20: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
da30: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
da40: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
da50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
da60: 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
da70: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
da80: 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c   $db timeout MIL
da90: 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20  LESECONDS.  **. 
daa0: 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68   ** Delay for th
dab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
dac0: 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69  iseconds specifi
dad0: 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69  ed when a file i
dae0: 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20  s locked..  */. 
daf0: 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54   case DB_TIMEOUT
db00: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a  : {.    int ms;.
db10: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
db20: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
db30: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
db40: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 2, objv, "MILL
db50: 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
db60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
db70: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
db80: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
db90: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
dba0: 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75  [2], &ms) ) retu
dbb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dbc0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
dbd0: 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20  imeout(pDb->db, 
dbe0: 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ms);.    break;.
dbf0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a    }.  .  /*.  **
dc00: 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63       $db total_c
dc10: 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  hanges.  **.  **
dc20: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
dc30: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
dc40: 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  were modified, i
dc50: 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65  nserted, or dele
dc60: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
dc70: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
dc80: 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64 2e  dle was created.
dc90: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
dca0: 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b  TOTAL_CHANGES: {
dcb0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
dcc0: 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f  esult;.    if( o
dcd0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc!=2 ){.      
dce0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
dcf0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
dd00: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
dd10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
dd20: 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74     }.    pResult
dd30: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
dd40: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
dd50: 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70   Tcl_SetIntObj(p
dd60: 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f  Result, sqlite3_
dd70: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44  total_changes(pD
dd80: 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
dd90: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
dda0: 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c   $db trace ?CALL
ddb0: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
ddc0: 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74  Make arrangement
ddd0: 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  s to invoke the 
dde0: 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65  CALLBACK routine
ddf0: 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74   for each SQL st
de00: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61  atement.  ** tha
de10: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
de20: 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
de30: 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20  SQL is appended 
de40: 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f  to CALLBACK befo
de50: 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78  re.  ** it is ex
de60: 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  ecuted..  */.  c
de70: 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a  ase DB_TRACE: {.
de80: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
de90: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
dea0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
deb0: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
dec0: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
ded0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
dee0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
def0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
df00: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
df10: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
df20: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
df30: 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  rp, pDb->zTrace,
df40: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
df50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
df60: 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20  ar *zTrace;.    
df70: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
df80: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
df90: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
dfa0: 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
dfb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dfc0: 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65   zTrace = Tcl_Ge
dfd0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
dfe0: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
dff0: 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20       if( zTrace 
e000: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
e010: 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
e020: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
e030: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
e040: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 54 72 61  strcpy(pDb->zTra
e050: 63 65 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 20  ce, zTrace);.   
e060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e070: 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20    pDb->zTrace = 
e080: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
e090: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
e0a0: 52 41 43 45 0a 20 20 20 20 20 20 69 66 28 20 70  RACE.      if( p
e0b0: 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
e0c0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
e0d0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
e0e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
e0f0: 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61  e(pDb->db, DbTra
e100: 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  ceHandler, pDb);
e110: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
e130: 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ace(pDb->db, 0, 
e140: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
e150: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
e160: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
e170: 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e   $db transaction
e180: 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d   [-deferred|-imm
e190: 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69 76  ediate|-exclusiv
e1a0: 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  e] SCRIPT.  **. 
e1b0: 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20   ** Start a new 
e1c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66 20  transaction (if 
e1d0: 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
e1e0: 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74 20  dy in the midst 
e1f0: 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61  of a.  ** transa
e200: 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63 75  ction) and execu
e210: 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  te the TCL scrip
e220: 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65 72  t SCRIPT.  After
e230: 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d   SCRIPT.  ** com
e240: 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20 63  pletes, either c
e250: 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
e260: 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74  ction or roll it
e270: 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54 0a   back if SCRIPT.
e280: 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20 65    ** throws an e
e290: 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66  xception.  Or if
e2a0: 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74 69   no new transati
e2b0: 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  on was started, 
e2c0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a  do nothing..  **
e2d0: 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70 74   pass the except
e2e0: 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73 74  ion on up the st
e2f0: 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
e300: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  his command was 
e310: 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76 65  inspired by Dave
e320: 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f   Thomas's talk o
e330: 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20 20  n Ruby at the.  
e340: 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c 79  ** 2005 O'Reilly
e350: 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e   Open Source Con
e360: 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e  vention (OSCON).
e370: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
e380: 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20  TRANSACTION: {. 
e390: 20 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 3b 0a     int inTrans;.
e3a0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
e3b0: 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ript;.    const 
e3c0: 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22  char *zBegin = "
e3d0: 42 45 47 49 4e 22 3b 0a 20 20 20 20 69 66 28 20  BEGIN";.    if( 
e3e0: 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21  objc!=3 && objc!
e3f0: 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =4 ){.      Tcl_
e400: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e410: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b  erp, 2, objv, "[
e420: 54 59 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a  TYPE] SCRIPT");.
e430: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e440: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
e450: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
e460: 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
e470: 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 7d 20   objv[2];.    } 
e480: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74 61  else {.      sta
e490: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
e4a0: 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b  TTYPE_strs[] = {
e4b0: 0a 20 20 20 20 20 20 20 20 22 64 65 66 65 72 72  .        "deferr
e4c0: 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76  ed",   "exclusiv
e4d0: 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22  e",  "immediate"
e4e0: 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  , 0.      };.   
e4f0: 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e     enum TTYPE_en
e500: 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59  um {.        TTY
e510: 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59  PE_DEFERRED, TTY
e520: 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54  PE_EXCLUSIVE, TT
e530: 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20  YPE_IMMEDIATE.  
e540: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74      };.      int
e550: 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66   ttype;.      if
e560: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
e570: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
e580: 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72  jv[2], TTYPE_str
e590: 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20  s, "transaction 
e5a0: 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20  type",.         
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 20       0, &ttype) 
e5d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
e5e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e5f0: 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63     }.      switc
e600: 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65  h( (enum TTYPE_e
e610: 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20  num)ttype ){.   
e620: 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
e630: 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20  DEFERRED:    /* 
e640: 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20  no-op */;       
e650: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
e660: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54  .        case TT
e670: 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20  YPE_EXCLUSIVE:  
e680: 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e   zBegin = "BEGIN
e690: 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72   EXCLUSIVE";  br
e6a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
e6b0: 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54  e TTYPE_IMMEDIAT
e6c0: 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42  E:   zBegin = "B
e6d0: 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b  EGIN IMMEDIATE";
e6e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e6f0: 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
e700: 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a   objv[3];.    }.
e710: 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 21 73      inTrans = !s
e720: 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
e730: 6f 6d 6d 69 74 28 70 44 62 2d 3e 64 62 29 3b 0a  ommit(pDb->db);.
e740: 20 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73      if( !inTrans
e750: 20 29 7b 0a 20 20 20 20 20 20 28 76 6f 69 64 29   ){.      (void)
e760: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
e770: 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c  ->db, zBegin, 0,
e780: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
e790: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
e7a0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63  bjEx(interp, pSc
e7b0: 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  ript, 0);.    if
e7c0: 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20  ( !inTrans ){.  
e7d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e7e0: 7a 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  zEnd;.      if( 
e7f0: 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b  rc==TCL_ERROR ){
e800: 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20  .        zEnd = 
e810: 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
e820: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
e830: 20 20 20 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d 49     zEnd = "COMMI
e840: 54 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T";.      }.    
e850: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
e860: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45  exec(pDb->db, zE
e870: 6e 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nd, 0, 0, 0);.  
e880: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
e890: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
e8a0: 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
e8b0: 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
e8c0: 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
e8d0: 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
e8e0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41  /.  case DB_UPDA
e8f0: 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65  TE_HOOK: .  case
e900: 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
e910: 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74  K: {..    /* set
e920: 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74   ppHook to point
e930: 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20   at pUpdateHook 
e940: 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  or pRollbackHook
e950: 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a  , depending on .
e960: 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b      ** whether [
e970: 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d  $db update_hook]
e980: 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63   or [$db rollbac
e990: 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f  k_hook] was invo
e9a0: 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
e9b0: 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b  Tcl_Obj **ppHook
e9c0: 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63  ; .    if( choic
e9d0: 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f  e==DB_UPDATE_HOO
e9e0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f  K ){.      ppHoo
e9f0: 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74  k = &pDb->pUpdat
ea00: 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  eHook;.    }else
ea10: 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d  {.      ppHook =
ea20: 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   &pDb->pRollback
ea30: 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hook;.    }..   
ea40: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
ea50: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
ea60: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
ea70: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
ea80: 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b  jv, "?SCRIPT?");
ea90: 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  .       return T
eaa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
eab0: 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20      if( *ppHook 
eac0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
ead0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
eae0: 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  , *ppHook);.    
eaf0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
eb00: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
eb10: 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
eb20: 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 48  k);.        *ppH
eb30: 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ook = 0;.      }
eb40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
eb50: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
eb60: 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f  assert( !(*ppHoo
eb70: 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  k) );.      if( 
eb80: 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74  Tcl_GetCharLengt
eb90: 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a  h(objv[2])>0 ){.
eba0: 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20          *ppHook 
ebb0: 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20  = objv[2];.     
ebc0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
ebd0: 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
ebe0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
ebf0: 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f   sqlite3_update_
ec00: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70  hook(pDb->db, (p
ec10: 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f  Db->pUpdateHook?
ec20: 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a  DbUpdateHandler:
ec30: 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20 73 71  0), pDb);.    sq
ec40: 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
ec50: 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44 62  ook(pDb->db,(pDb
ec60: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f  ->pRollbackHook?
ec70: 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65  DbRollbackHandle
ec80: 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20  r:0),pDb);..    
ec90: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
eca0: 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a      $db version.
ecb0: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
ecc0: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72   the version str
ecd0: 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74  ing for this dat
ece0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
ecf0: 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b  se DB_VERSION: {
ed00: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
ed10: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
ed20: 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65   *)sqlite3_libve
ed30: 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41  rsion(), TCL_STA
ed40: 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  TIC);.    break;
ed50: 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e  .  }...  } /* En
ed60: 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20  d of the SWITCH 
ed70: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72  statement */.  r
ed80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ed90: 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e  **   sqlite3 DBN
eda0: 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f  AME FILENAME ?MO
edb0: 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a 2a  DE? ?-key KEY?.*
edc0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
edd0: 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e   main Tcl comman
ede0: 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71  d.  When the "sq
edf0: 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  lite" Tcl comman
ee00: 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c  d is.** invoked,
ee10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
ee20: 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ns to process th
ee30: 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  at command..**.*
ee40: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
ee50: 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73  ment, DBNAME, is
ee60: 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61   an arbitrary na
ee70: 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20  me for a new.** 
ee80: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ee90: 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ion.  This comma
eea0: 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  nd creates a new
eeb0: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a   command named.*
eec0: 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73  * DBNAME that is
eed0: 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c   used to control
eee0: 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   that connection
eef0: 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a  .  The database.
ef00: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  ** connection is
ef10: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
ef20: 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64  e DBNAME command
ef30: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
ef40: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
ef50: 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
ef60: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
ef70: 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
ef80: 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 20  s.** the sqlite 
ef90: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
efa0: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
efb0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69  .**.** For testi
efc0: 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65 20  ng purposes, we 
efd0: 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74 68 65  also support the
efe0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
eff0: 2a 20 20 73 71 6c 69 74 65 33 20 2d 65 6e 63 6f  *  sqlite3 -enco
f000: 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ding.**.**      
f010: 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e 63 6f   Return the enco
f020: 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c 49 4b  ding used by LIK
f030: 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61  E and GLOB opera
f040: 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73 0a 2a  tors.  Choices.*
f050: 2a 20 20 20 20 20 20 20 61 72 65 20 55 54 46 2d  *       are UTF-
f060: 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e 0a 2a  8 and iso8859..*
f070: 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 76  *.**  sqlite3 -v
f080: 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  ersion.**.**    
f090: 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 65     Return the ve
f0a0: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20  rsion number of 
f0b0: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
f0c0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  ry..**.**  sqlit
f0d0: 65 33 20 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66  e3 -tcl-uses-utf
f0e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74  .**.**       Ret
f0f0: 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d 70 69  urn "1" if compi
f100: 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c 20 75  led with a Tcl u
f110: 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65 74 75  ses UTF-8.  Retu
f120: 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20 20 20  rn "0" if.**    
f130: 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20 62 79     not.  Used by
f140: 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65 20 73   tests to make s
f150: 75 72 65 20 74 68 65 20 6c 69 62 72 61 72 79 20  ure the library 
f160: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a  was compiled .**
f170: 20 20 20 20 20 20 20 63 6f 72 72 65 63 74 6c 79         correctly
f180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f190: 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c  DbMain(void *cd,
f1a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
f1b0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
f1c0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
f1d0: 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
f1e0: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  p;.  void *pKey 
f1f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  = 0;.  int nKey 
f200: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
f210: 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20  r *zArg;.  char 
f220: 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f 6e 73  *zErrMsg;.  cons
f230: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
f240: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61   Tcl_DString tra
f250: 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b  nslatedFilename;
f260: 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
f270: 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
f280: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f290: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
f2a0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
f2b0: 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  rg,"-version")==
f2c0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
f2d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f2e0: 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rp,sqlite3_versi
f2f0: 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74  on,0);.      ret
f300: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
f310: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
f320: 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65  (zArg,"-has-code
f330: 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  c")==0 ){.#ifdef
f340: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
f350: 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  C.      Tcl_Appe
f360: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f370: 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20  "1",0);.#else.  
f380: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f390: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c  sult(interp,"0",
f3a0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
f3b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f3c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
f3d0: 72 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d  rcmp(zArg,"-tcl-
f3e0: 75 73 65 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b  uses-utf")==0 ){
f3f0: 0a 23 69 66 64 65 66 20 54 43 4c 5f 55 54 46 5f  .#ifdef TCL_UTF_
f400: 4d 41 58 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  MAX.      Tcl_Ap
f410: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f420: 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a  p,"1",0);.#else.
f430: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
f440: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30  Result(interp,"0
f450: 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ",0);.#endif.   
f460: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
f470: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f480: 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a  ( objc==5 || obj
f490: 63 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==6 ){.    zArg
f4a0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f4b0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a  FromObj(objv[obj
f4c0: 63 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  c-2], 0);.    if
f4d0: 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
f4e0: 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  key")==0 ){.    
f4f0: 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
f500: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
f510: 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26  (objv[objc-1], &
f520: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a  nKey);.      obj
f530: 63 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  c -= 2;.    }.  
f540: 7d 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  }.  if( objc!=3 
f550: 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
f560: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f570: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
f580: 6a 76 2c 20 0a 23 69 66 64 65 66 20 53 51 4c 49  jv, .#ifdef SQLI
f590: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
f5a0: 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e     "HANDLE FILEN
f5b0: 41 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d  AME ?-key CODEC-
f5c0: 4b 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20  KEY?".#else.    
f5d0: 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
f5e0: 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69  ME ?MODE?".#endi
f5f0: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74  f.    );.    ret
f600: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f610: 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30   }.  zErrMsg = 0
f620: 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44  ;.  p = (SqliteD
f630: 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  b*)Tcl_Alloc( si
f640: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
f650: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  ( p==0 ){.    Tc
f660: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f670: 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  rp, "malloc fail
f680: 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ed", TCL_STATIC)
f690: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f6a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65  _ERROR;.  }.  me
f6b0: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
f6c0: 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20  f(*p));.  zFile 
f6d0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f6e0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
f6f0: 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  0);.  zFile = Tc
f700: 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e  l_TranslateFileN
f710: 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c  ame(interp, zFil
f720: 65 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69  e, &translatedFi
f730: 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  lename);.  sqlit
f740: 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 26  e3_open(zFile, &
f750: 70 2d 3e 64 62 29 3b 0a 20 20 54 63 6c 5f 44 53  p->db);.  Tcl_DS
f760: 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73  tringFree(&trans
f770: 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
f780: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f790: 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  =sqlite3_errcode
f7a0: 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a  (p->db) ){.    z
f7b0: 45 72 72 4d 73 67 20 3d 20 73 74 72 64 75 70 28  ErrMsg = strdup(
f7c0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
f7d0: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  ->db));.    sqli
f7e0: 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
f7f0: 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b  ;.    p->db = 0;
f800: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
f810: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73  TE_HAS_CODEC.  s
f820: 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62  qlite3_key(p->db
f830: 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23  , pKey, nKey);.#
f840: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64  endif.  if( p->d
f850: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  b==0 ){.    Tcl_
f860: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
f870: 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56  , zErrMsg, TCL_V
f880: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63  OLATILE);.    Tc
f890: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29  l_Free((char*)p)
f8a0: 3b 0a 20 20 20 20 66 72 65 65 28 7a 45 72 72 4d  ;.    free(zErrM
f8b0: 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  sg);.    return 
f8c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
f8d0: 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55   p->maxStmt = NU
f8e0: 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  M_PREPARED_STMTS
f8f0: 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47  ;.  zArg = Tcl_G
f900: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f910: 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54  objv[1], 0);.  T
f920: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
f930: 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67  and(interp, zArg
f940: 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61  , DbObjCmd, (cha
f950: 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d  r*)p, DbDeleteCm
f960: 64 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6d  d);..  /* If com
f970: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
f980: 45 5f 54 45 53 54 20 74 75 72 6e 65 64 20 6f 6e  E_TEST turned on
f990: 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  , then register 
f9a0: 74 68 65 20 22 6d 64 35 73 75 6d 22 0a 20 20 2a  the "md5sum".  *
f9b0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a  * SQL function..
f9c0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
f9d0: 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20  TE_TEST.  {.    
f9e0: 65 78 74 65 72 6e 20 76 6f 69 64 20 4d 64 35 5f  extern void Md5_
f9f0: 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
fa00: 2a 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  *);.#ifdef SQLIT
fa10: 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 69  E_MEMDEBUG.    i
fa20: 6e 74 20 6d 61 6c 6c 6f 63 66 61 69 6c 20 3d 20  nt mallocfail = 
fa30: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
fa40: 61 69 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ail;.    sqlite3
fa50: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 30  _iMallocFail = 0
fa60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 4d 64 35  ;.#endif.    Md5
fa70: 5f 52 65 67 69 73 74 65 72 28 70 2d 3e 64 62 29  _Register(p->db)
fa80: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fa90: 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 73 71 6c  MEMDEBUG.    sql
faa0: 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
fab0: 20 3d 20 6d 61 6c 6c 6f 63 66 61 69 6c 3b 0a 23   = mallocfail;.#
fac0: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
fad0: 20 20 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d    .  p->interp =
fae0: 20 69 6e 74 65 72 70 3b 0a 20 20 72 65 74 75 72   interp;.  retur
faf0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
fb00: 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d  ** Provide a dum
fb10: 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  my Tcl_InitStubs
fb20: 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
fb30: 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74 69   this as a stati
fb40: 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  c.** library..*/
fb50: 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c  .#ifndef USE_TCL
fb60: 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20  _STUBS.# undef  
fb70: 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20  Tcl_InitStubs.# 
fb80: 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53  define Tcl_InitS
fb90: 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64  tubs(a,b,c).#end
fba0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
fbb0: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 50 41  ure we have a PA
fbc0: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61  CKAGE_VERSION ma
fbd0: 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68  cro defined.  Th
fbe0: 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  is will be.** de
fbf0: 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61  fined automatica
fc00: 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41 20 6d  lly by the TEA m
fc10: 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74  akefile.  But ot
fc20: 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a  her makefiles.**
fc30: 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69   do not define i
fc40: 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41  t..*/.#ifndef PA
fc50: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20  CKAGE_VERSION.# 
fc60: 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56  define PACKAGE_V
fc70: 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45  ERSION SQLITE_VE
fc80: 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RSION.#endif../*
fc90: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
fca0: 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a  his module..**.*
fcb0: 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c  * This Tcl modul
fcc0: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
fcd0: 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c  a single new Tcl
fce0: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22   command named "
fcf0: 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e  sqlite"..** (Hen
fd00: 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ce there is no n
fd10: 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72 65  amespace.  There
fd20: 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
fd30: 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63  using a namespac
fd40: 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65  e.** if the exte
fd50: 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c  nsion only suppl
fd60: 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65  ies one new name
fd70: 21 29 20 20 54 68 65 20 22 73 71 6c 69 74 65 22  !)  The "sqlite"
fd80: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75   command is.** u
fd90: 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  sed to open a ne
fda0: 77 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  w SQLite databas
fdb0: 65 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d 61  e.  See the DbMa
fdc0: 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f  in() routine abo
fdd0: 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  ve.** for additi
fde0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
fdf0: 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20  ..*/.EXTERN int 
fe00: 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c  Sqlite3_Init(Tcl
fe10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
fe20: 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  {.  Tcl_InitStub
fe30: 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c  s(interp, "8.4",
fe40: 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
fe50: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
fe60: 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28  rp, "sqlite3", (
fe70: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
fe80: 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20  DbMain, 0, 0);. 
fe90: 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28   Tcl_PkgProvide(
fea0: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
feb0: 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ", PACKAGE_VERSI
fec0: 4f 4e 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74  ON);.  Tcl_Creat
fed0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
fee0: 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54  rp, "sqlite", (T
fef0: 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44  cl_ObjCmdProc*)D
ff00: 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  bMain, 0, 0);.  
ff10: 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
ff20: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
ff30: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
ff40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
ff50: 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK;.}.EXTERN int
ff60: 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74   Tclsqlite3_Init
ff70: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
ff80: 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
ff90: 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
ffa0: 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  ); }.EXTERN int 
ffb0: 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74  Sqlite3_SafeInit
ffc0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
ffd0: 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
ffe0: 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
fff0: 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66  t Tclsqlite3_Saf
10000 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
10010 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
10020 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66  n TCL_OK; }..#if
10030 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55  ndef SQLITE_3_SU
10040 46 46 49 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e  FFIX_ONLY.EXTERN
10050 20 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74   int Sqlite_Init
10060 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
10070 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
10080 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
10090 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  ); }.EXTERN int 
100a0 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54  Tclsqlite_Init(T
100b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
100c0 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
100d0 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
100e0 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71   }.EXTERN int Sq
100f0 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63  lite_SafeInit(Tc
10100 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10110 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
10120 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
10130 63 6c 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69  clsqlite_SafeIni
10140 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
10150 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
10160 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK; }.#endif..
10170 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a  #ifdef TCLSH./**
10180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
101d0 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  he code that fol
101e0 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20  lows is used to 
101f0 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65  build standalone
10200 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
10210 73 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  s.*/../*.** If t
10220 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69  he macro TCLSH i
10230 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20  s one, then put 
10240 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72  in code this for
10250 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72   the.** "main" r
10260 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
10270 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20   initialize Tcl 
10280 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66  and take input f
10290 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20  rom.** standard 
102a0 69 6e 70 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43  input..*/.#if TC
102b0 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68  LSH==1.static ch
102c0 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d  ar zMainloop[] =
102d0 0a 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c  .  "set line {}\
102e0 6e 22 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65  n".  "while {![e
102f0 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a  of stdin]} {\n".
10300 20 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d      "if {$line!=
10310 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  \"\"} {\n".     
10320 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e   "puts -nonewlin
10330 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20  e \"> \"\n".    
10340 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20  "} else {\n".   
10350 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c     "puts -nonewl
10360 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20  ine \"% \"\n".  
10370 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75    "}\n".    "flu
10380 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20  sh stdout\n".   
10390 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67   "append line [g
103a0 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20  ets stdin]\n".  
103b0 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d    "if {[info com
103c0 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c  plete $line]} {\
103d0 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63  n".      "if {[c
103e0 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30  atch {uplevel #0
103f0 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d   $line} result]}
10400 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70   {\n".        "p
10410 75 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72  uts stderr \"Err
10420 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22  or: $result\"\n"
10430 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66  .      "} elseif
10440 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d   {$result!=\"\"}
10450 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70   {\n".        "p
10460 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20  uts $result\n". 
10470 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20       "}\n".     
10480 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22   "set line {}\n"
10490 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e  .    "} else {\n
104a0 22 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20  ".      "append 
104b0 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20  line \\n\n".    
104c0 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a  "}\n".  "}\n".;.
104d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
104e0 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48   the macro TCLSH
104f0 20 69 73 20 74 77 6f 2c 20 74 68 65 6e 20 67 65   is two, then ge
10500 74 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20  t the main loop 
10510 63 6f 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74  code out of.** t
10520 68 65 20 73 65 70 61 72 61 74 65 20 66 69 6c 65  he separate file
10530 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e   "spaceanal_tcl.
10540 68 22 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48  h"..*/.#if TCLSH
10550 3d 3d 32 0a 73 74 61 74 69 63 20 63 68 61 72 20  ==2.static char 
10560 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23  zMainloop[] = .#
10570 69 6e 63 6c 75 64 65 20 22 73 70 61 63 65 61 6e  include "spacean
10580 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64  al_tcl.h".;.#end
10590 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53  if..#define TCLS
105a0 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a  H_MAIN main   /*
105b0 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20   Needed to fake 
105c0 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a  out mktclapp */.
105d0 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69  int TCLSH_MAIN(i
105e0 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
105f0 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  argv){.  Tcl_Int
10600 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
10610 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c  cl_FindExecutabl
10620 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  e(argv[0]);.  in
10630 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74  terp = Tcl_Creat
10640 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c  eInterp();.  Sql
10650 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
10660 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
10670 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78  _TEST.  {.    ex
10680 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
10690 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est1_Init(Tcl_In
106a0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
106b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
106c0 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t2_Init(Tcl_Inte
106d0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
106e0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33   int Sqlitetest3
106f0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10700 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10710 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49  nt Sqlitetest4_I
10720 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10730 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10740 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
10750 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10760 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10770 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28  qlitetest6_Init(
10780 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10790 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
107a0 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63  itetest7_Init(Tc
107b0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
107c0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
107d0 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f  etest8_Init(Tcl_
107e0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
107f0 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69  tern int Md5_Ini
10800 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10810 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10820 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69  qlitetestsse_Ini
10830 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10840 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10850 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49  qlitetestasync_I
10860 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10870 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10880 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61   Sqlitetesttclva
10890 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  r_Init(Tcl_Inter
108a0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
108b0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63  int Sqlitetestsc
108c0 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  hema_Init(Tcl_In
108d0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
108e0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
108f0 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54  t_autoext_Init(T
10900 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20  cl_Interp*);..  
10910 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e    Sqlitetest1_In
10920 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
10930 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74  Sqlitetest2_Init
10940 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
10950 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69  litetest3_Init(i
10960 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
10970 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74  tetest4_Init(int
10980 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
10990 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72  test5_Init(inter
109a0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
109b0 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st6_Init(interp)
109c0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
109d0 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  7_Init(interp);.
109e0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f      Sqlitetest8_
109f0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10a00 20 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e    Sqlitetestasyn
10a10 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
10a20 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 74 63      Sqlitetesttc
10a30 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70  lvar_Init(interp
10a40 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
10a50 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74  tschema_Init(int
10a60 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
10a70 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69  test_autoext_Ini
10a80 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d  t(interp);.    M
10a90 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  d5_Init(interp);
10aa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
10ab0 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  SE.    Sqlitetes
10ac0 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  tsse_Init(interp
10ad0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65  );.#endif.  }.#e
10ae0 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67 63 3e  ndif.  if( argc>
10af0 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29  =2 || TCLSH==2 )
10b00 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
10b10 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b   char zArgc[32];
10b20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
10b30 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72  rintf(sizeof(zAr
10b40 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22  gc), zArgc, "%d"
10b50 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29  , argc-(3-TCLSH)
10b60 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
10b70 72 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c  r(interp,"argc",
10b80 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42   zArgc, TCL_GLOB
10b90 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63  AL_ONLY);.    Tc
10ba0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
10bb0 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c  "argv0",argv[1],
10bc0 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
10bd0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
10be0 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20  (interp,"argv", 
10bf0 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  "", TCL_GLOBAL_O
10c00 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  NLY);.    for(i=
10c10 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b  3-TCLSH; i<argc;
10c20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c   i++){.      Tcl
10c30 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _SetVar(interp, 
10c40 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c  "argv", argv[i],
10c50 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47  .          TCL_G
10c60 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c  LOBAL_ONLY | TCL
10c70 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20  _LIST_ELEMENT | 
10c80 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45  TCL_APPEND_VALUE
10c90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10ca0 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c   TCLSH==1 && Tcl
10cb0 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70  _EvalFile(interp
10cc0 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f  , argv[1])!=TCL_
10cd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  OK ){.      cons
10ce0 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20  t char *zInfo = 
10cf0 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72  Tcl_GetVar(inter
10d00 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20  p, "errorInfo", 
10d10 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
10d20 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66  ;.      if( zInf
10d30 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69  o==0 ) zInfo = i
10d40 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20  nterp->result;. 
10d50 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
10d60 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20  err,"%s: %s\n", 
10d70 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20  *argv, zInfo);. 
10d80 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
10d90 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61     }.  }.  if( a
10da0 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c 53 48 3d  rgc<=1 || TCLSH=
10db0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c  =2 ){.    Tcl_Gl
10dc0 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c  obalEval(interp,
10dd0 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d   zMainloop);.  }
10de0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
10df0 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a  endif /* TCLSH *
10e00 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  /..#endif /* !de
10e10 66 69 6e 65 64 28 4e 4f 5f 54 43 4c 29 20 2a 2f  fined(NO_TCL) */
10e20 0a                                               .