/ Hex Artifact Content
Login

Artifact 92a997ee5caca4923a6452ff8ebfaa8d37334f4a:


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 35 20 32 30 30 36 2f 30 37 2f 31 37 20 30 30  65 2006/07/17 00
01c0: 3a 30 32 3a 34 35 20 64 72 68 20 45 78 70 20 24  :02:45 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: 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c   "Error: non-nul
82e0: 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  l separator requ
82f0: 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 20  ired for copy", 
8300: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
8310: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8320: 7d 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65 33  }.    if(sqlite3
8330: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
8340: 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21  t, "rollback") !
8350: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
8360: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
8370: 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20  nflict, "abort" 
8380: 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
8390: 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d     sqlite3StrICm
83a0: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61  p(zConflict, "fa
83b0: 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26  il"    ) != 0 &&
83c0: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  .       sqlite3S
83d0: 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  trICmp(zConflict
83e0: 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d  , "ignore"  ) !=
83f0: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c   0 &&.       sql
8400: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e  ite3StrICmp(zCon
8410: 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22  flict, "replace"
8420: 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20   ) != 0 ) {.    
8430: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8440: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
8450: 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63  r: \"", zConflic
8460: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
8470: 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  "\", conflict-al
8480: 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20  gorithm must be 
8490: 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b  one of: rollback
84a0: 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
84b0: 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67  "abort, fail, ig
84c0: 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65  nore, or replace
84d0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
84e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
84f0: 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
8500: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8510: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
8520: 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
8530: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
8540: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8550: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8560: 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
8570: 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
8580: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  e, 0);.      ret
8590: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
85a0: 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
85b0: 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20   strlen(zSql);. 
85c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
85d0: 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
85e0: 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74   zSql, 0, &pStmt
85f0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
8600: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
8610: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
8620: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8630: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
8640: 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
8650: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
8660: 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  );.      nCol = 
8670: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
8680: 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
8690: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
86a0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
86b0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
86c0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
86d0: 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20  f( nCol==0 ) {. 
86e0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
86f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8700: 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20   zSql = malloc( 
8710: 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f  nByte + 50 + nCo
8720: 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  l*2 );.    if( z
8730: 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Sql==0 ) {.     
8740: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8750: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8760: 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
8770: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
8780: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8790: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
87a0: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b  _snprintf(nByte+
87b0: 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52  50, zSql, "INSER
87c0: 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71  T OR %q INTO '%q
87d0: 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20  ' VALUES(?",.   
87e0: 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c        zConflict,
87f0: 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20   zTable);.    j 
8800: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
8810: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
8820: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
8830: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
8840: 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
8850: 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
8860: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
8870: 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
8880: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
8890: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
88a0: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  b->db, zSql, 0, 
88b0: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
88c0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
88d0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
88e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
88f0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
8900: 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
8910: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
8920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8930: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
8940: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8950: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8960: 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69    in = fopen(zFi
8970: 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69  le, "rb");.    i
8980: 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
8990: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
89a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
89b0: 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66  r: cannot open f
89c0: 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e  ile: ", zFile, N
89d0: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
89e0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
89f0: 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
8a00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8a10: 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d   }.    azCol = m
8a20: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a  alloc( sizeof(az
8a30: 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29  Col[0])*(nCol+1)
8a40: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f   );.    if( azCo
8a50: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54  l==0 ) {.      T
8a60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8a70: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
8a80: 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c  can't malloc()",
8a90: 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73   0);.      fclos
8aa0: 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  e(in);.      ret
8ab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8ac0: 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73     }.    (void)s
8ad0: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
8ae0: 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  >db, "BEGIN", 0,
8af0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d   0, 0);.    zCom
8b00: 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a  mit = "COMMIT";.
8b10: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e      while( (zLin
8b20: 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  e = local_getlin
8b30: 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a  e(0, in))!=0 ){.
8b40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20        char *z;. 
8b50: 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20       i = 0;.    
8b60: 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
8b70: 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69    azCol[0] = zLi
8b80: 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
8b90: 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20  0, z=zLine; *z; 
8ba0: 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
8bb0: 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26  ( *z==zSep[0] &&
8bc0: 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70   strncmp(z, zSep
8bd0: 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
8be0: 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
8bf0: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
8c00: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
8c10: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
8c20: 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
8c30: 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
8c40: 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
8c50: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8c60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8c70: 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43       if( i+1!=nC
8c80: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ol ){.        ch
8c90: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
8ca0: 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28    zErr = malloc(
8cb0: 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46 69  200 + strlen(zFi
8cc0: 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  le));.        if
8cd0: 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
8ce0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72      sprintf(zErr
8cf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
8d00: 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25  Error: %s line %
8d10: 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
8d20: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62  olumns of data b
8d30: 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20  ut found %d",.  
8d40: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
8d50: 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20  , lineno, nCol, 
8d60: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
8d70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8d80: 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30  (interp, zErr, 0
8d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65  );.          fre
8da0: 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20  e(zErr);.       
8db0: 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d   }.        zComm
8dc0: 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  it = "ROLLBACK";
8dd0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
8df0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
8e00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
8e10: 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64  check for null d
8e20: 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64  ata, if so, bind
8e30: 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   as null */.    
8e40: 20 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e 30      if ((nNull>0
8e50: 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c   && strcmp(azCol
8e60: 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20  [i], zNull)==0) 
8e70: 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b  || strlen(azCol[
8e80: 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20  i])==0) {.      
8e90: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
8ea0: 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31  _null(pStmt, i+1
8eb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
8ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8ed0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
8ee0: 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b  tmt, i+1, azCol[
8ef0: 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  i], -1, SQLITE_S
8f00: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
8f10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8f20: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
8f30: 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
8f40: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
8f50: 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65  tmt);.      free
8f60: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69  (zLine);.      i
8f70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8f80: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
8f90: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8fa0: 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73  erp,"Error: ", s
8fb0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
8fc0: 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
8fd0: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52      zCommit = "R
8fe0: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
8ff0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9000: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
9010: 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f  azCol);.    fclo
9020: 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se(in);.    sqli
9030: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
9040: 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73  mt);.    (void)s
9050: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
9060: 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c  >db, zCommit, 0,
9070: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28   0, 0);..    if(
9080: 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27   zCommit[0] == '
9090: 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73  C' ){.      /* s
90a0: 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73 75  uccess, set resu
90b0: 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20  lt as number of 
90c0: 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20  lines processed 
90d0: 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74  */.      pResult
90e0: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
90f0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
9100: 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
9110: 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f  (pResult, lineno
9120: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
9130: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  L_OK;.    }else{
9140: 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72  .      /* failur
9150: 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f  e, append lineno
9160: 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f   where failed */
9170: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
9180: 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e  LineNum,"%d",lin
9190: 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  eno);.      Tcl_
91a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
91b0: 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68  erp,", failed wh
91c0: 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  ile processing l
91d0: 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c  ine: ",zLineNum,
91e0: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
91f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9210: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
9220: 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74   enable_load_ext
9230: 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20  ension BOOLEAN. 
9240: 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68   **.  ** Turn th
9250: 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64  e extension load
9260: 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f  ing feature on o
9270: 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66  r off.  It if of
9280: 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c  f by.  ** defaul
9290: 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t..  */.  case D
92a0: 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  B_ENABLE_LOAD_EX
92b0: 54 45 4e 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 69  TENSION: {.    i
92c0: 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66  nt onoff;.    if
92d0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
92e0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
92f0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
9300: 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b  bjv, "BOOLEAN");
9310: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9320: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9330: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
9340: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
9350: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f  erp, objv[2], &o
9360: 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72  noff) ){.      r
9370: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9380: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9390: 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
93a0: 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62  xtension(pDb->db
93b0: 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72  , onoff);.    br
93c0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
93d0: 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72   **    $db error
93e0: 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  code.  **.  ** R
93f0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69  eturn the numeri
9400: 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  c error code tha
9410: 74 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62  t was returned b
9420: 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
9430: 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  t.  ** call to s
9440: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20  qlite3_exec().. 
9450: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52   */.  case DB_ER
9460: 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54  RORCODE: {.    T
9470: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
9480: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
9490: 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ntObj(sqlite3_er
94a0: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29  rcode(pDb->db)))
94b0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
94c0: 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  .   .  /*.  **  
94d0: 20 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20    $db eval $sql 
94e0: 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63  ?array? ?{  ...c
94f0: 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20  ode... }?.  **  
9500: 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20    $db onecolumn 
9510: 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  $sql.  **.  ** T
9520: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
9530: 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c   in $sql is eval
9540: 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68  uated.  For each
9550: 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73   row, the values
9560: 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64   are.  ** placed
9570: 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   in elements of 
9580: 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20  the array named 
9590: 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63  "array" and ...c
95a0: 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74  ode... is execut
95b0: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
95c0: 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61  ay" and "code" a
95d0: 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e  re omitted, then
95e0: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20   no callback is 
95f0: 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20  every invoked.. 
9600: 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69   ** If "array" i
9610: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
9620: 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  g, then the valu
9630: 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e  es are placed in
9640: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
9650: 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61  that have the sa
9660: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66  me name as the f
9670: 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20  ields extracted 
9680: 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  by the query..  
9690: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63  **.  ** The onec
96a0: 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20  olumn method is 
96b0: 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
96c0: 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64  f:.  **     lind
96d0: 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71  ex [$db eval $sq
96e0: 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65  l] 0.  */.  case
96f0: 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20   DB_ONECOLUMN:. 
9700: 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20   case DB_EVAL:. 
9710: 20 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a   case DB_EXISTS:
9720: 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73   {.    char cons
9730: 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a  t *zSql;      /*
9740: 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   Next SQL statem
9750: 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a  ent to execute *
9760: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
9770: 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *zLeft;     /* 
9780: 57 68 61 74 20 69 73 20 6c 65 66 74 20 61 66 74  What is left aft
9790: 65 72 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e  er first stmt in
97a0: 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c   zSql */.    sql
97b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
97c0: 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20  ;   /* Compiled 
97d0: 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a  SQL statment */.
97e0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72      Tcl_Obj *pAr
97f0: 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ray;       /* Na
9800: 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f  me of array into
9810: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61   which results a
9820: 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  re written */.  
9830: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
9840: 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69  pt;      /* Scri
9850: 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61  pt to run for ea
9860: 63 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ch result set */
9870: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
9880: 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50  pParm;      /* P
9890: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e  arameters that n
98a0: 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65  eed a Tcl_DecrRe
98b0: 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20  fCount() */.    
98c0: 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20  int nParm;      
98d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
98e0: 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65 64   of entries used
98f0: 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a   in apParm[] */.
9900: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61      Tcl_Obj *aPa
9910: 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74  rm[10];    /* St
9920: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
9930: 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63  pParm[] in the c
9940: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
9950: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
9960: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
9970: 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
9980: 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61   */.    SqlPrepa
9990: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
99a0: 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  t;  /* Pointer t
99b0: 6f 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  o a prepared sta
99c0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
99d0: 74 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20  t rc2;..    if( 
99e0: 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20  choice==DB_EVAL 
99f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
9a00: 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b  c<3 || objc>5 ){
9a10: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
9a20: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
9a30: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20  , 2, objv, "SQL 
9a40: 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43  ?ARRAY-NAME? ?SC
9a50: 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20  RIPT?");.       
9a60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9a70: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
9a80: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
9a90: 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  bj();.      Tcl_
9aa0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
9ab0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
9ac0: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
9ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
9ae0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9af0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
9b00: 51 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  QL");.        re
9b10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9b30: 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49  ( choice==DB_EXI
9b40: 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70  STS ){.        p
9b50: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f  Ret = Tcl_NewBoo
9b60: 6c 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20  leanObj(0);.    
9b70: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
9b80: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
9b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9ba0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
9bb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9bc0: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
9bd0: 20 20 70 41 72 72 61 79 20 3d 20 70 53 63 72 69    pArray = pScri
9be0: 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  pt = 0;.    }els
9bf0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
9c00: 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20  .      pArray = 
9c10: 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  0;.      pScript
9c20: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
9c30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 72  }else{.      pAr
9c40: 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ray = objv[3];. 
9c50: 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
9c60: 53 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b 30  String(pArray)[0
9c70: 5d 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d 20  ]==0 ) pArray = 
9c80: 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  0;.      pScript
9c90: 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20   = objv[4];.    
9ca0: 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  }..    Tcl_IncrR
9cb0: 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29  efCount(objv[2])
9cc0: 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c  ;.    zSql = Tcl
9cd0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
9ce0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
9cf0: 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43     while( rc==TC
9d00: 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20  L_OK && zSql[0] 
9d10: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  ){.      int i; 
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9d40: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
9d50: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
9d60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9d70: 72 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d 65  r of bind parame
9d80: 74 65 72 73 20 69 6e 20 74 68 65 20 70 53 74 6d  ters in the pStm
9d90: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
9da0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
9db0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9dc0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9dd0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
9de0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a        Tcl_Obj **
9df0: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20  apColName = 0;  
9e00: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
9e10: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
9e20: 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20     int len;     
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9e40: 20 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f   String length o
9e50: 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20  f zSql */.  .   
9e60: 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e     /* Try to fin
9e70: 64 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  d a SQL statemen
9e80: 74 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  t that has alrea
9e90: 64 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64  dy been compiled
9ea0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77 68   and.      ** wh
9eb0: 69 63 68 20 6d 61 74 63 68 65 73 20 74 68 65 20  ich matches the 
9ec0: 6e 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f 66  next sequence of
9ed0: 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   SQL..      */. 
9ee0: 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a       pStmt = 0;.
9ef0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d        pPreStmt =
9f00: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a   pDb->stmtList;.
9f10: 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c        len = strl
9f20: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  en(zSql);.      
9f30: 69 66 28 20 70 50 72 65 53 74 6d 74 20 26 26 20  if( pPreStmt && 
9f40: 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28  sqlite3_expired(
9f50: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29  pPreStmt->pStmt)
9f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73   ){.        flus
9f70: 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b  hStmtCache(pDb);
9f80: 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d  .        pPreStm
9f90: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
9fa0: 20 20 20 20 20 66 6f 72 28 3b 20 70 50 72 65 53       for(; pPreS
9fb0: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
9fc0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
9fd0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
9fe0: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a  pPreStmt->nSql;.
9ff0: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
a000: 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =n .            
a010: 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74  && memcmp(pPreSt
a020: 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  mt->zSql, zSql, 
a030: 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
a040: 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30    && (zSql[n]==0
a050: 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27   || zSql[n-1]=='
a060: 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ;').        ){. 
a070: 20 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d           pStmt =
a080: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
a090: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65 66  ;.          zLef
a0a0: 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74  t = &zSql[pPreSt
a0b0: 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20  mt->nSql];..    
a0c0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20        /* When a 
a0d0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a0e0: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c  nt is found, unl
a0f0: 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ink it from the.
a100: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63            ** cac
a110: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
a120: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
a130: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
a140: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  inning.         
a150: 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65   ** of the cache
a160: 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74   list in order t
a170: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20  o implement LRU 
a180: 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20  replacement..   
a190: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a1a0: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
a1b0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
a1c0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
a1d0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
a1e0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
a1f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
a200: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
a210: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
a220: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
a230: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a240: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
a250: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
a260: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
a270: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
a280: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
a290: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
a2a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
a2b0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
a2c0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
a2d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a2e0: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
a2f0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  --;.          br
a300: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a310: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
a320: 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65  /* If no prepare
a330: 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  d statement was 
a340: 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20  found.  Compile 
a350: 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20 20  the SQL text.   
a360: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
a370: 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pStmt==0 ){.    
a380: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
a390: 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61  K!=sqlite3_prepa
a3a0: 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
a3b0: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a  , -1, &pStmt, &z
a3c0: 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
a3d0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
a3e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
a3f0: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
a400: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29  errmsg(pDb->db))
a410: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
a420: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
a430: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a450: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
a460: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51            if( SQ
a470: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
a480: 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
a490: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
a4a0: 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69   /* A compile-ti
a4b0: 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  me error in the 
a4c0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
a4d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a4e0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
a4f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
a500: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
a510: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
a520: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
a530: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
a540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
a550: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ak;.          }e
a560: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
a570: 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e   /* The statemen
a580: 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  t was a no-op.  
a590: 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20  Continue to the 
a5a0: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  next statement. 
a5b0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
a5c0: 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e   the SQL string.
a5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c              zSql
a5f0: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20   = zLeft;.      
a600: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
a610: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a620: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
a630: 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d  sert( pPreStmt==
a640: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  0 );.      }..  
a650: 20 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75      /* Bind valu
a660: 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73  es to parameters
a670: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
a680: 20 24 20 6f 72 20 3a 0a 20 20 20 20 20 20 2a 2f   $ or :.      */
a690: 20 20 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20    .      nVar = 
a6a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
a6b0: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
a6c0: 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50 61 72 6d  mt);.      nParm
a6d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
a6e0: 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61 50 61 72  nVar>sizeof(aPar
a6f0: 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61 72 6d 5b  m)/sizeof(aParm[
a700: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  0]) ){.        a
a710: 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a  pParm = (Tcl_Obj
a720: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61  **)Tcl_Alloc(nVa
a730: 72 2a 73 69 7a 65 6f 66 28 61 70 50 61 72 6d 5b  r*sizeof(apParm[
a740: 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  0]));.      }els
a750: 65 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72  e{.        apPar
a760: 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20 20 20  m = aParm;.     
a770: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31   }.      for(i=1
a780: 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b  ; i<=nVar; i++){
a790: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
a7a0: 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69  har *zVar = sqli
a7b0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
a7c0: 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  er_name(pStmt, i
a7d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
a7e0: 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b  Var!=0 && (zVar[
a7f0: 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b  0]=='$' || zVar[
a800: 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20 20 20 20  0]==':') ){.    
a810: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
a820: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  Var = Tcl_GetVar
a830: 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61  2Ex(interp, &zVa
a840: 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  r[1], 0, 0);.   
a850: 20 20 20 20 20 20 20 69 66 28 20 70 56 61 72 20         if( pVar 
a860: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
a870: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  nt n;.          
a880: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
a890: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
a8a0: 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65  ype = pVar->type
a8b0: 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65  Ptr ? pVar->type
a8c0: 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a  Ptr->name : "";.
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
a8e0: 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20   c = zType[0];. 
a8f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
a900: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
a910: 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79  zType,"bytearray
a920: 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62  ")==0 && pVar->b
a930: 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ytes==0 ){.     
a940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
a950: 20 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70   load a BLOB typ
a960: 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72  e if the Tcl var
a970: 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61  iable is a bytea
a980: 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20  rray and.       
a990: 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f         ** has no
a9a0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
a9b0: 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  tation. */.     
a9c0: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
a9d0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
a9e0: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
a9f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
aa00: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
aa10: 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74  ob(pStmt, i, dat
aa20: 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  a, n, SQLITE_STA
aa30: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
aa40: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
aa50: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
aa60: 20 20 20 20 20 20 20 20 20 20 61 70 50 61 72 6d            apParm
aa70: 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [nParm++] = pVar
aa80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
aa90: 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62 27 20  lse if( (c=='b' 
aaa0: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
aab0: 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29 20 7c  "boolean")==0) |
aac0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
aad0: 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73      (c=='i' && s
aae0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74  trcmp(zType,"int
aaf0: 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ")==0) ){.      
ab00: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49          Tcl_GetI
ab10: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
ab20: 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  , pVar, &n);.   
ab30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ab40: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
ab50: 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t, i, n);.      
ab60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ab70: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
ab80: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
ab90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
aba0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
abc0: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
abd0: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
abe0: 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &r);.           
abf0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
ac00: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c  double(pStmt, i,
ac10: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   r);.           
ac20: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 77   }else if( c=='w
ac30: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
ac40: 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 20  e,"wideInt")==0 
ac50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ac60: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
ac80: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
ac90: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
aca0: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
acb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
acc0: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  d_int64(pStmt, i
acd0: 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , v);.          
ace0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
acf0: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75         data = (u
ad00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
ad10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
ad20: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ad40: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
ad50: 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a  Stmt, i, (char *
ad60: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
ad70: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
ad80: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
ad90: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
adb0: 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[nParm++] = 
adc0: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20  pVar;.          
add0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
ade0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
adf0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
ae00: 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a  ll( pStmt, i );.
ae10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ae20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
ae30: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20       /* Compute 
ae40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
ae50: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
ae60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
ae70: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
ae80: 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20  if( pScript ){. 
ae90: 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65         apColName
aea0: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63   = (Tcl_Obj**)Tc
aeb0: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
aec0: 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29  Tcl_Obj*)*nCol )
aed0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
aee0: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ColName==0 ) bre
aef0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ak;.        for(
af00: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
af10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
af20: 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65  olName[i] = dbTe
af30: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
af40: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
af50: 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20  t,i));.         
af60: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
af70: 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  t(apColName[i]);
af80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
af90: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
afa0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
afb0: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
afc0: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
afd0: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 20  hen create.     
afe0: 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29   ** the array(*)
aff0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20   entry for that 
b000: 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2f 0a 20  array.      */. 
b010: 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79 20       if( pArray 
b020: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  ){.        Tcl_O
b030: 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54  bj *pColList = T
b040: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
b050: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53       Tcl_Obj *pS
b060: 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  tar = Tcl_NewStr
b070: 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b  ingObj("*", -1);
b080: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
b090: 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69  rRefCount(pColLi
b0a0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  st);.        for
b0b0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
b0c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
b0d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b0e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
b0f0: 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61  ColList, apColNa
b100: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  me[i]);.        
b110: 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  }.        Tcl_Ob
b120: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
b130: 20 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20   pArray, pStar, 
b140: 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20  pColList,0);.   
b150: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
b160: 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b  Count(pColList);
b170: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
b180: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
b190: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
b1a0: 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
b1b0: 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  SQL.      */.   
b1c0: 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43     while( rc==TC
b1d0: 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20 26 26  L_OK && pStmt &&
b1e0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
b1f0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
b200: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
b210: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
b220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
b230: 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20  _Obj *pVal;.    
b240: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
b250: 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20   /* Set pVal to 
b260: 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68  contain the i'th
b270: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20   column of this 
b280: 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  row. */.        
b290: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
b2a0: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
b2b0: 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  tmt, i) ){.     
b2c0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
b2d0: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
b2e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
b2f0: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  es = sqlite3_col
b300: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
b310: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
b320: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
b330: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71  wByteArrayObj(sq
b340: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
b350: 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 62 79 74  b(pStmt, i), byt
b360: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  es);.           
b370: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b380: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b390: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b3a0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
b3b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
b3c0: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
b3d0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
b3e0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
b3f0: 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d          if( v>=-
b400: 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c  2147483647 && v<
b410: 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20  =2147483647 ){. 
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b430: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74  Val = Tcl_NewInt
b440: 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Obj(v);.        
b450: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
b470: 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  l = Tcl_NewWideI
b480: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
b490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b4a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b4b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b4c0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
b4d0: 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
b4f0: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
b500: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
b510: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
b520: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
b530: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29  _NewDoubleObj(r)
b540: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b550: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b560: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b570: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
b580: 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L: {.           
b590: 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74     pVal = dbText
b5a0: 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c  ToObj(pDb->zNull
b5b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b5c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b5d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b5e0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
b5f0: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
b600: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 28 63  = dbTextToObj((c
b610: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
b620: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
b630: 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   i));.          
b640: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b660: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
b670: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
b680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b690: 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20   pArray==0 ){.  
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
b6b0: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
b6c0: 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  p, apColName[i],
b6d0: 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20   0, pVal, 0);.  
b6e0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
b6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
b700: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
b710: 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70  terp, pArray, ap
b720: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c  ColName[i], pVal
b730: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
b740: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
b750: 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d  lse if( choice==
b760: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a  DB_ONECOLUMN ){.
b770: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
b780: 72 74 28 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20  rt( pRet==0 );. 
b790: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
b7a0: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ret==0 ){.      
b7b0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70          pRet = p
b7c0: 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Val;.           
b7d0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
b7e0: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
b7f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b800: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52       rc = TCL_BR
b810: 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EAK;.           
b820: 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i = nCol;.     
b830: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
b840: 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53  hoice==DB_EXISTS
b850: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b860: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
b870: 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  (pRet);.        
b880: 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e      pRet = Tcl_N
b890: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 3b  ewBooleanObj(1);
b8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
b8b0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _IncrRefCount(pR
b8c0: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
b8d0: 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b   rc = TCL_BREAK;
b8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d  .            i =
b8f0: 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   nCol;.         
b900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b910: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
b920: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
b930: 65 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c 29  erp, pRet, pVal)
b940: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
b950: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
b960: 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29     if( pScript )
b970: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
b980: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
b990: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
b9a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
b9b0: 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e  ( rc==TCL_CONTIN
b9c0: 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  UE ){.          
b9d0: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
b9e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b9f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ba00: 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42     if( rc==TCL_B
ba10: 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  REAK ){.        
ba20: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
ba30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
ba40: 72 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ree the column n
ba50: 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  ame objects */. 
ba60: 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74       if( pScript
ba70: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
ba80: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
ba90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
baa0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _DecrRefCount(ap
bab0: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
bac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
bad0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61  cl_Free((char*)a
bae0: 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  pColName);.     
baf0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   }..      /* Fre
bb00: 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69  e the bound stri
bb10: 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61  ng and blob para
bb20: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  meters */.      
bb30: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d  for(i=0; i<nParm
bb40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
bb50: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
bb60: 28 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20  (apParm[i]);.   
bb70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
bb80: 70 50 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a  pParm!=aParm ){.
bb90: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
bba0: 28 28 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b  ((char*)apParm);
bbb0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
bbc0: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 73 74 61  /* Reset the sta
bbd0: 74 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20  tement.  If the 
bbe0: 72 65 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53  result code is S
bbf0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68  QLITE_SCHEMA, th
bc00: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  en.      ** flus
bc10: 68 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  h the statement 
bc20: 63 61 63 68 65 20 61 6e 64 20 74 72 79 20 74 68  cache and try th
bc30: 65 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69  e statement agai
bc40: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
bc50: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
bc60: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
bc70: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 53      if( SQLITE_S
bc80: 43 48 45 4d 41 3d 3d 72 63 32 20 29 7b 0a 20 20  CHEMA==rc2 ){.  
bc90: 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 61        /* After a
bca0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
bcb0: 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 20  flush the cache 
bcc0: 61 6e 64 20 74 72 79 20 74 6f 20 72 75 6e 20 74  and try to run t
bcd0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  he.        ** st
bce0: 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 0a 20 20  atement again.  
bcf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
bd00: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
bd10: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20   pDb );.        
bd20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
bd30: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
bd40: 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20   if( pPreStmt ) 
bd50: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
bd60: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20  pPreStmt);.     
bd70: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
bd80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c     }else if( SQL
bd90: 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20  ITE_OK!=rc2 ){. 
bda0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72         /* If a r
bdb0: 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63  un-time error oc
bdc0: 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65  curs, report the
bdd0: 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20   error and stop 
bde0: 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20  reading.        
bdf0: 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20  ** the SQL.     
be00: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63     */.        Tc
be10: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
be20: 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
be30: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
be40: 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  g(pDb->db)));.  
be50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
be60: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
be70: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
be80: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69  ERROR;.        i
be90: 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63  f( pPreStmt ) Tc
bea0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50  l_Free((char*)pP
beb0: 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  reStmt);.       
bec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
bed0: 6c 73 65 20 69 66 28 20 70 44 62 2d 3e 6d 61 78  lse if( pDb->max
bee0: 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt<=0 ){.     
bef0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63     /* If the cac
bf00: 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  he is turned off
bf10: 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68  , deallocated th
bf20: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
bf30: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
bf40: 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28  tmt ) Tcl_Free((
bf50: 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b  char*)pPreStmt);
bf60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bf70: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
bf80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
bf90: 20 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79 74         /* Everyt
bfa0: 68 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64 20  hing worked and 
bfb0: 74 68 65 20 63 61 63 68 65 20 69 73 20 6f 70 65  the cache is ope
bfc0: 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20  rational..      
bfd0: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
bfe0: 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  w SqlPreparedStm
bff0: 74 20 73 74 72 75 63 74 75 72 65 20 69 66 20 77  t structure if w
c000: 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20  e need one..    
c010: 20 20 20 20 2a 2a 20 28 49 66 20 77 65 20 61 6c      ** (If we al
c020: 72 65 61 64 79 20 68 61 76 65 20 6f 6e 65 20 77  ready have one w
c030: 65 20 63 61 6e 20 6a 75 73 74 20 72 65 75 73 65  e can just reuse
c040: 20 69 74 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f   it.).        */
c050: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
c060: 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eStmt==0 ){.    
c070: 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66        len = zLef
c080: 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20  t - zSql;.      
c090: 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28      pPreStmt = (
c0a0: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a  SqlPreparedStmt*
c0b0: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
c0c0: 6f 66 28 2a 70 50 72 65 53 74 6d 74 29 20 2b 20  of(*pPreStmt) + 
c0d0: 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  len );.         
c0e0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30   if( pPreStmt==0
c0f0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
c100: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ROR;.          p
c110: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d  PreStmt->pStmt =
c120: 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
c130: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c    pPreStmt->nSql
c140: 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20   = len;.        
c150: 20 20 6d 65 6d 63 70 79 28 70 50 72 65 53 74 6d    memcpy(pPreStm
c160: 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c  t->zSql, zSql, l
c170: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  en);.          p
c180: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65  PreStmt->zSql[le
c190: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
c1a0: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64  }..        /* Ad
c1b0: 64 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  d the prepared s
c1c0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20  tatement to the 
c1d0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
c1e0: 20 63 61 63 68 65 20 6c 69 73 74 0a 20 20 20 20   cache list.    
c1f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
c200: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d  PreStmt->pNext =
c210: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a   pDb->stmtList;.
c220: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
c230: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
c240: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74       if( pDb->st
c250: 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  mtList ){.      
c260: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
c270: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74  ->pPrev = pPreSt
c280: 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  mt;.        }.  
c290: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
c2a0: 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  ist = pPreStmt;.
c2b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d          if( pDb-
c2c0: 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a  >stmtLast==0 ){.
c2d0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
c2e0: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20  ( pDb->nStmt==0 
c2f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
c300: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72  ->stmtLast = pPr
c310: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  eStmt;.        }
c320: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c330: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74  assert( pDb->nSt
c340: 6d 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  mt>0 );.        
c350: 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e  }.        pDb->n
c360: 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20  Stmt++;.   .    
c370: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
c380: 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65  e too many state
c390: 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72  ment in cache, r
c3a0: 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75  emove the surplu
c3b0: 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20  s from the.     
c3c0: 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
c3d0: 20 63 61 63 68 65 20 6c 69 73 74 2e 0a 20 20 20   cache list..   
c3e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c3f0: 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d  while( pDb->nStm
c400: 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29  t>pDb->maxStmt )
c410: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
c420: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62  te3_finalize(pDb
c430: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d  ->stmtLast->pStm
c440: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  t);.          pD
c450: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44  b->stmtLast = pD
c460: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72  b->stmtLast->pPr
c470: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  ev;.          Tc
c480: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44  l_Free((char*)pD
c490: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65  b->stmtLast->pNe
c4a0: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xt);.          p
c4b0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e  Db->stmtLast->pN
c4c0: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
c4d0: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b     pDb->nStmt--;
c4e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c4f0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f   }..      /* Pro
c500: 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ceed to the next
c510: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
c520: 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74      zSql = zLeft
c530: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
c540: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a  DecrRefCount(obj
c550: 76 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20  v[2]);..    if( 
c560: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66  pRet ){.      if
c570: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
c580: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
c590: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
c5a0: 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a   pRet);.      }.
c5b0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
c5c0: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
c5d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
c5e0: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
c5f0: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
c600: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20  interp);.    }. 
c610: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
c620: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
c630: 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 53   function NAME S
c640: 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
c650: 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
c660: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
c670: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
c680: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
c690: 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69  s.  ** called, i
c6a0: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
c6b0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
c6c0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
c6d0: 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20  se DB_FUNCTION: 
c6e0: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
c6f0: 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  Func;.    Tcl_Ob
c700: 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
c710: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
c720: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
c730: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
c740: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
c750: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
c760: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
c770: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c780: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
c790: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
c7a0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
c7b0: 30 29 3b 0a 20 20 20 20 70 53 63 72 69 70 74 20  0);.    pScript 
c7c0: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 70  = objv[3];.    p
c7d0: 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75  Func = findSqlFu
c7e0: 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a  nc(pDb, zName);.
c7f0: 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30      if( pFunc==0
c800: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
c810: 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75  ROR;.    if( pFu
c820: 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20  nc->pScript ){. 
c830: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
c840: 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
c850: 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ript);.    }.   
c860: 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
c870: 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54  = pScript;.    T
c880: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c890: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46  pScript);.    pF
c8a0: 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76  unc->useEvalObjv
c8b0: 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c   = safeToUseEval
c8c0: 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63  Objv(interp, pSc
c8d0: 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  ript);.    rc = 
c8e0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
c8f0: 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  unction(pDb->db,
c900: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
c910: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
c920: 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75   pFunc, tclSqlFu
c930: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nc, 0, 0);.    i
c940: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c950: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
c960: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
c970: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
c980: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
c990: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
c9a0: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
c9b0: 49 4c 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ILE);.    }else{
c9c0: 0a 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 66  .      /* Must f
c9d0: 6c 75 73 68 20 61 6e 79 20 63 61 63 68 65 64 20  lush any cached 
c9e0: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
c9f0: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
ca00: 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 7d  he( pDb );.    }
ca10: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
ca20: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
ca30: 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a  db interrupt.  *
ca40: 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74  *.  ** Interrupt
ca50: 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f   the execution o
ca60: 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  f the inner-most
ca70: 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72   SQL interpreter
ca80: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75  .  This.  ** cau
ca90: 73 65 73 20 74 68 65 20 53 51 4c 20 73 74 61 74  ses the SQL stat
caa0: 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20  ement to return 
cab0: 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49  an error of SQLI
cac0: 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20  TE_INTERRUPT..  
cad0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54  */.  case DB_INT
cae0: 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71  ERRUPT: {.    sq
caf0: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
cb00: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72  pDb->db);.    br
cb10: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
cb20: 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c   **     $db null
cb30: 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20  value ?STRING?. 
cb40: 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20   **.  ** Change 
cb50: 74 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61  text used when a
cb60: 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b   NULL comes back
cb70: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
cb80: 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a  se. If ?STRING?.
cb90: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73    ** is not pres
cba0: 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ent, then the cu
cbb0: 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65  rrent string use
cbc0: 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65  d for NULL is re
cbd0: 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20  turned..  ** If 
cbe0: 53 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e  STRING is presen
cbf0: 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69  t, then STRING i
cc00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
cc10: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
cc20: 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20  NULLVALUE: {.   
cc30: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
cc40: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
cc50: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
cc60: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
cc70: 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b  v, "NULLVALUE");
cc80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
cc90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
cca0: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
ccb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  {.      int len;
ccc0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  .      char *zNu
ccd0: 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ll = Tcl_GetStri
cce0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
ccf0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
cd00: 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29  if( pDb->zNull )
cd10: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
cd20: 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  ee(pDb->zNull);.
cd30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
cd40: 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30  ( zNull && len>0
cd50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
cd60: 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c  >zNull = Tcl_All
cd70: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
cd80: 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 70         strncpy(p
cd90: 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c  Db->zNull, zNull
cda0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  , len);.        
cdb0: 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20  pDb->zNull[len] 
cdc0: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65  = '\0';.      }e
cdd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
cde0: 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  ->zNull = 0;.   
cdf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54     }.    }.    T
ce00: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
ce10: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
ce20: 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29  Obj(pDb->zNull))
ce30: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
ce40: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
ce50: 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  $db last_insert_
ce60: 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rowid .  **.  **
ce70: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
ce80: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
ce90: 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f  ROWID for the mo
cea0: 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74  st recent insert
ceb0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
cec0: 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57  _LAST_INSERT_ROW
ced0: 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ID: {.    Tcl_Ob
cee0: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
cef0: 54 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69  Tcl_WideInt rowi
cf00: 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  d;.    if( objc!
cf10: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
cf20: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cf30: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
cf40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cf50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cf60: 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c  .    rowid = sql
cf70: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
cf80: 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b  _rowid(pDb->db);
cf90: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
cfa0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
cfb0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
cfc0: 5f 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70  _SetWideIntObj(p
cfd0: 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a  Result, rowid);.
cfe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
cff0: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42    /*.  ** The DB
d000: 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f  _ONECOLUMN metho
d010: 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  d is implemented
d020: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 44   together with D
d030: 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20  B_EVAL..  */..  
d040: 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65  /*    $db progre
d050: 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a  ss ?N CALLBACK?.
d060: 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b    ** .  ** Invok
d070: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
d080: 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72  back every N vir
d090: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63  tual machine opc
d0a0: 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75  odes while execu
d0b0: 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65  ting.  ** querie
d0c0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
d0d0: 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20  B_PROGRESS: {.  
d0e0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
d0f0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
d100: 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
d110: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
d120: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
d130: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29  b->zProgress, 0)
d140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d150: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
d160: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
d170: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20  Progress;.      
d180: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
d190: 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt N;.      if( 
d1a0: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
d1b0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
d1c0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29  , objv[2], &N) )
d1d0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
d1e0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ROR;.      };.  
d1f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
d200: 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
d210: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
d220: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20  zProgress);.    
d230: 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72    }.      zProgr
d240: 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ess = Tcl_GetStr
d250: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
d260: 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  3], &len);.     
d270: 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26   if( zProgress &
d280: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
d290: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
d2a0: 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  s = Tcl_Alloc( l
d2b0: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
d2c0: 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50    strcpy(pDb->zP
d2d0: 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65  rogress, zProgre
d2e0: 73 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ss);.      }else
d2f0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
d300: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
d310: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
d320: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
d330: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20  SS_CALLBACK.    
d340: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
d350: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
d360: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
d370: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
d380: 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68  lite3_progress_h
d390: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
d3a0: 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e  N, DbProgressHan
d3b0: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
d3c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d3d0: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
d3e0: 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  s_handler(pDb->d
d3f0: 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
d400: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d410: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
d420: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
d430: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
d440: 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20  N CALLBACK");.  
d450: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d460: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
d470: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
d480: 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20      $db profile 
d490: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
d4a0: 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67    ** Make arrang
d4b0: 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65  ements to invoke
d4c0: 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f   the CALLBACK ro
d4d0: 75 74 69 6e 65 20 61 66 74 65 72 20 65 61 63 68  utine after each
d4e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20   SQL statement. 
d4f0: 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e   ** that has run
d500: 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  .  The text of t
d510: 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61  he SQL and the a
d520: 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20  mount of elapse 
d530: 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70  time are.  ** ap
d540: 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41  pended to CALLBA
d550: 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73 63  CK before the sc
d560: 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a  ript is run..  *
d570: 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46  /.  case DB_PROF
d580: 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ILE: {.    if( o
d590: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
d5a0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
d5b0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
d5c0: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
d5d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
d5e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
d5f0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
d600: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
d610: 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
d620: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d630: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
d640: 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a  ->zProfile, 0);.
d650: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d660: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
d670: 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69  Profile;.      i
d680: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
d690: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
d6a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
d6b0: 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  ree(pDb->zProfil
d6c0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
d6d0: 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c    zProfile = Tcl
d6e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
d6f0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
d700: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f  ;.      if( zPro
d710: 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b  file && len>0 ){
d720: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
d730: 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c  rofile = Tcl_All
d740: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
d750: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44         strcpy(pD
d760: 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72  b->zProfile, zPr
d770: 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 65  ofile);.      }e
d780: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
d790: 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a  ->zProfile = 0;.
d7a0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
d7b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
d7c0: 45 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  E.      if( pDb-
d7d0: 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
d7e0: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
d7f0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
d800: 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
d810: 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72  le(pDb->db, DbPr
d820: 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44  ofileHandler, pD
d830: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
d840: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d850: 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62  _profile(pDb->db
d860: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
d870: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
d880: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
d890: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
d8a0: 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20  rekey KEY.  **. 
d8b0: 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65   ** Change the e
d8c0: 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e  ncryption key on
d8d0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   the currently o
d8e0: 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20  pen database..  
d8f0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b  */.  case DB_REK
d900: 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b  EY: {.    int nK
d910: 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b  ey;.    void *pK
d920: 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ey;.    if( objc
d930: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
d940: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
d950: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
d960: 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74  KEY");.      ret
d970: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d980: 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20     }.    pKey = 
d990: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
d9a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
d9b0: 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20   &nKey);.#ifdef 
d9c0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
d9d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
d9e0: 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c  3_rekey(pDb->db,
d9f0: 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
da00: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
da10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
da20: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
da30: 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29  e3ErrStr(rc), 0)
da40: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
da50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65  _ERROR;.    }.#e
da60: 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
da70: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
da80: 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d     $db timeout M
da90: 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a  ILLESECONDS.  **
daa0: 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20  .  ** Delay for 
dab0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
dac0: 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69  lliseconds speci
dad0: 66 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65  fied when a file
dae0: 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f   is locked..  */
daf0: 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f  .  case DB_TIMEO
db00: 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73  UT: {.    int ms
db10: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
db20: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
db30: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
db40: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49  rp, 2, objv, "MI
db50: 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20  LLISECONDS");.  
db60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
db70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
db80: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
db90: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
dba0: 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65  jv[2], &ms) ) re
dbb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
dbc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
dbd0: 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62  _timeout(pDb->db
dbe0: 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b  , ms);.    break
dbf0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20  ;.  }.  .  /*.  
dc00: 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c  **     $db total
dc10: 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20  _changes.  **.  
dc20: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
dc30: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
dc40: 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
dc50: 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
dc60: 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63  leted .  ** sinc
dc70: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  e the database h
dc80: 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65  andle was create
dc90: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
dca0: 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a  B_TOTAL_CHANGES:
dcb0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
dcc0: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28  pResult;.    if(
dcd0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
dce0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
dcf0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
dd00: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
dd10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
dd20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75  .    }.    pResu
dd30: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
dd40: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
dd50: 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
dd60: 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65  (pResult, sqlite
dd70: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
dd80: 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62  pDb->db));.    b
dd90: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
dda0: 20 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41     $db trace ?CA
ddb0: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
ddc0: 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  * Make arrangeme
ddd0: 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  nts to invoke th
dde0: 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69  e CALLBACK routi
ddf0: 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20  ne for each SQL 
de00: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
de10: 68 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  hat is executed.
de20: 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
de30: 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65  e SQL is appende
de40: 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65  d to CALLBACK be
de50: 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  fore.  ** it is 
de60: 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20  executed..  */. 
de70: 20 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20   case DB_TRACE: 
de80: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
de90: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
dea0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
deb0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
dec0: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
ded0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
dee0: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
def0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
df00: 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
df10: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
df20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
df30: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63  terp, pDb->zTrac
df40: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
df50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df60: 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20  char *zTrace;.  
df70: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
df80: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
df90: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
dfa0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
dfb0: 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
dfc0: 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f     zTrace = Tcl_
dfd0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
dfe0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
dff0: 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63  .      if( zTrac
e000: 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
e010: 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
e020: 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
e030: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
e040: 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 54    strcpy(pDb->zT
e050: 72 61 63 65 2c 20 7a 54 72 61 63 65 29 3b 0a 20  race, zTrace);. 
e060: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e070: 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
e080: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
e090: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e0a0: 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28  _TRACE.      if(
e0b0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
e0c0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
e0d0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
e0e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
e0f0: 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54  ace(pDb->db, DbT
e100: 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  raceHandler, pDb
e110: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e130: 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30  trace(pDb->db, 0
e140: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
e150: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
e160: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
e170: 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
e180: 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
e190: 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
e1a0: 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  ive] SCRIPT.  **
e1b0: 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  .  ** Start a ne
e1c0: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  w transaction (i
e1d0: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
e1e0: 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73  eady in the mids
e1f0: 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e  t of a.  ** tran
e200: 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65  saction) and exe
e210: 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72  cute the TCL scr
e220: 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74  ipt SCRIPT.  Aft
e230: 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63  er SCRIPT.  ** c
e240: 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72  ompletes, either
e250: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
e260: 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20  saction or roll 
e270: 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50  it back if SCRIP
e280: 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e  T.  ** throws an
e290: 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20   exception.  Or 
e2a0: 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61  if no new transa
e2b0: 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
e2c0: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
e2d0: 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65  ** pass the exce
e2e0: 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20  ption on up the 
e2f0: 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
e300: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61   This command wa
e310: 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61  s inspired by Da
e320: 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b  ve Thomas's talk
e330: 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a   on Ruby at the.
e340: 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c    ** 2005 O'Reil
e350: 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43  ly Open Source C
e360: 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e  onvention (OSCON
e370: 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
e380: 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b  B_TRANSACTION: {
e390: 0a 20 20 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  .    int inTrans
e3a0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
e3b0: 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73  Script;.    cons
e3c0: 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d  t char *zBegin =
e3d0: 20 22 42 45 47 49 4e 22 3b 0a 20 20 20 20 69 66   "BEGIN";.    if
e3e0: 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
e3f0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
e400: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
e410: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
e420: 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54 22 29  "[TYPE] SCRIPT")
e430: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
e440: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
e450: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
e460: 29 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  ){.      pScript
e470: 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20   = objv[2];.    
e480: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73  } else {.      s
e490: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
e4a0: 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d   *TTYPE_strs[] =
e4b0: 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65   {.        "defe
e4c0: 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73  rred",   "exclus
e4d0: 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74  ive",  "immediat
e4e0: 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20  e", 0.      };. 
e4f0: 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f       enum TTYPE_
e500: 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54  enum {.        T
e510: 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54  TYPE_DEFERRED, T
e520: 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  TYPE_EXCLUSIVE, 
e530: 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a  TTYPE_IMMEDIATE.
e540: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
e550: 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20  nt ttype;.      
e560: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
e570: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
e580: 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73  objv[2], TTYPE_s
e590: 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f  trs, "transactio
e5a0: 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20  n type",.       
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65         0, &ttype
e5d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
e5e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e5f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69       }.      swi
e600: 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45  tch( (enum TTYPE
e610: 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20  _enum)ttype ){. 
e620: 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
e630: 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f  E_DEFERRED:    /
e640: 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20  * no-op */;     
e650: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
e660: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
e670: 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a  TTYPE_EXCLUSIVE:
e680: 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47     zBegin = "BEG
e690: 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20  IN EXCLUSIVE";  
e6a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
e6b0: 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49  ase TTYPE_IMMEDI
e6c0: 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20  ATE:   zBegin = 
e6d0: 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45  "BEGIN IMMEDIATE
e6e0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
e6f0: 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
e700: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
e710: 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20  }.    inTrans = 
e720: 21 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74  !sqlite3_get_aut
e730: 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64 62 29  ocommit(pDb->db)
e740: 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61  ;.    if( !inTra
e750: 6e 73 20 29 7b 0a 20 20 20 20 20 20 28 76 6f 69  ns ){.      (voi
e760: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
e770: 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20  Db->db, zBegin, 
e780: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
e790: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
e7a0: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
e7b0: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
e7c0: 69 66 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a  if( !inTrans ){.
e7d0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e7e0: 20 2a 7a 45 6e 64 3b 0a 20 20 20 20 20 20 69 66   *zEnd;.      if
e7f0: 28 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 20  ( rc==TCL_ERROR 
e800: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20  ){.        zEnd 
e810: 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
e820: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
e830: 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 43 4f 4d       zEnd = "COM
e840: 4d 49 54 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  MIT";.      }.  
e850: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
e860: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
e870: 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zEnd, 0, 0, 0);.
e880: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
e890: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
e8a0: 20 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f     $db update_ho
e8b0: 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a  ok ?script?.  **
e8c0: 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b      $db rollback
e8d0: 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
e8e0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50   */.  case DB_UP
e8f0: 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61  DATE_HOOK: .  ca
e900: 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48  se DB_ROLLBACK_H
e910: 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73  OOK: {..    /* s
e920: 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69  et ppHook to poi
e930: 6e 74 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f  nt at pUpdateHoo
e940: 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f  k or pRollbackHo
e950: 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ok, depending on
e960: 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72   .    ** whether
e970: 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f   [$db update_hoo
e980: 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62  k] or [$db rollb
e990: 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e  ack_hook] was in
e9a0: 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  voked..    */.  
e9b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f    Tcl_Obj **ppHo
e9c0: 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f  ok; .    if( cho
e9d0: 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48  ice==DB_UPDATE_H
e9e0: 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48  OOK ){.      ppH
e9f0: 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64  ook = &pDb->pUpd
ea00: 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c  ateHook;.    }el
ea10: 73 65 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b  se{.      ppHook
ea20: 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61   = &pDb->pRollba
ea30: 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ckHook;.    }.. 
ea40: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
ea50: 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
ea60: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ea70: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
ea80: 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22  objv, "?SCRIPT?"
ea90: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
eaa0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
eab0: 7d 0a 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f  }.    if( *ppHoo
eac0: 6b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  k ){.      Tcl_S
ead0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
eae0: 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  rp, *ppHook);.  
eaf0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
eb00: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ){.        Tcl_D
eb10: 65 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ecrRefCount(*ppH
eb20: 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  ook);.        *p
eb30: 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20  pHook = 0;.     
eb40: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
eb50: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
eb60: 20 20 61 73 73 65 72 74 28 20 21 28 2a 70 70 48    assert( !(*ppH
eb70: 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ook) );.      if
eb80: 28 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e  ( Tcl_GetCharLen
eb90: 67 74 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29  gth(objv[2])>0 )
eba0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f  {.        *ppHoo
ebb0: 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20  k = objv[2];.   
ebc0: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
ebd0: 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a  Count(*ppHook);.
ebe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
ebf0: 20 20 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74     sqlite3_updat
ec00: 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  e_hook(pDb->db, 
ec10: 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
ec20: 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65  k?DbUpdateHandle
ec30: 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20  r:0), pDb);.    
ec40: 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
ec50: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70  _hook(pDb->db,(p
ec60: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
ec70: 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  k?DbRollbackHand
ec80: 6c 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20  ler:0),pDb);..  
ec90: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
eca0: 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73 69 6f  /*    $db versio
ecb0: 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  n.  **.  ** Retu
ecc0: 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73  rn the version s
ecd0: 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64  tring for this d
ece0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
ecf0: 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a  case DB_VERSION:
ed00: 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65   {.    Tcl_SetRe
ed10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
ed20: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62  ar *)sqlite3_lib
ed30: 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53  version(), TCL_S
ed40: 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61  TATIC);.    brea
ed50: 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20  k;.  }...  } /* 
ed60: 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43  End of the SWITC
ed70: 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  H statement */. 
ed80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ed90: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44  *.**   sqlite3 D
eda0: 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f  BNAME FILENAME ?
edb0: 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f  MODE? ?-key KEY?
edc0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
edd0: 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d  he main Tcl comm
ede0: 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22  and.  When the "
edf0: 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d  sqlite" Tcl comm
ee00: 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  and is.** invoke
ee10: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
ee20: 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20  runs to process 
ee30: 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  that command..**
ee40: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
ee50: 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20  gument, DBNAME, 
ee60: 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20  is an arbitrary 
ee70: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a  name for a new.*
ee80: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
ee90: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d  ction.  This com
eea0: 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e  mand creates a n
eeb0: 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  ew command named
eec0: 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20  .** DBNAME that 
eed0: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  is used to contr
eee0: 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69  ol that connecti
eef0: 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  on.  The databas
ef00: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
ef10: 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  is deleted when 
ef20: 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61  the DBNAME comma
ef30: 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  nd is deleted..*
ef40: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
ef50: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
ef60: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
ef70: 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
ef80: 69 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ins.** the sqlit
ef90: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
efa0: 69 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  is to be accesse
efb0: 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73  d..**.** For tes
efc0: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77  ting purposes, w
efd0: 65 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74  e also support t
efe0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
eff0: 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 65 6e  .**  sqlite3 -en
f000: 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20  coding.**.**    
f010: 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e     Return the en
f020: 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c  coding used by L
f030: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65  IKE and GLOB ope
f040: 72 61 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73  rators.  Choices
f050: 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 55 54  .**       are UT
f060: 46 2d 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e  F-8 and iso8859.
f070: 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20  .**.**  sqlite3 
f080: 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  -version.**.**  
f090: 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20       Return the 
f0a0: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f  version number o
f0b0: 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  f the SQLite lib
f0c0: 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c  rary..**.**  sql
f0d0: 69 74 65 33 20 2d 74 63 6c 2d 75 73 65 73 2d 75  ite3 -tcl-uses-u
f0e0: 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52  tf.**.**       R
f0f0: 65 74 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d  eturn "1" if com
f100: 70 69 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c  piled with a Tcl
f110: 20 75 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65   uses UTF-8.  Re
f120: 74 75 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20  turn "0" if.**  
f130: 20 20 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20       not.  Used 
f140: 62 79 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65  by tests to make
f150: 20 73 75 72 65 20 74 68 65 20 6c 69 62 72 61 72   sure the librar
f160: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a  y was compiled .
f170: 2a 2a 20 20 20 20 20 20 20 63 6f 72 72 65 63 74  **       correct
f180: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
f190: 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63  t DbMain(void *c
f1a0: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
f1b0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
f1c0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
f1d0: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
f1e0: 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65   *p;.  void *pKe
f1f0: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65  y = 0;.  int nKe
f200: 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  y = 0;.  const c
f210: 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61  har *zArg;.  cha
f220: 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f  r *zErrMsg;.  co
f230: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
f240: 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
f250: 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
f260: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f270: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
f280: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
f290: 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  rg,"-version")==
f2a0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
f2b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f2c0: 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rp,sqlite3_versi
f2d0: 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74  on,0);.      ret
f2e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
f2f0: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
f300: 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65  (zArg,"-has-code
f310: 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  c")==0 ){.#ifdef
f320: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
f330: 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  C.      Tcl_Appe
f340: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f350: 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20  "1",0);.#else.  
f360: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f370: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c  sult(interp,"0",
f380: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
f390: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f3a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
f3b0: 72 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c 2d  rcmp(zArg,"-tcl-
f3c0: 75 73 65 73 2d 75 74 66 22 29 3d 3d 30 20 29 7b  uses-utf")==0 ){
f3d0: 0a 23 69 66 64 65 66 20 54 43 4c 5f 55 54 46 5f  .#ifdef TCL_UTF_
f3e0: 4d 41 58 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  MAX.      Tcl_Ap
f3f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f400: 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a  p,"1",0);.#else.
f410: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
f420: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30  Result(interp,"0
f430: 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ",0);.#endif.   
f440: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
f450: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f460: 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62 6a  ( objc==5 || obj
f470: 63 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==6 ){.    zArg
f480: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f490: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a  FromObj(objv[obj
f4a0: 63 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  c-2], 0);.    if
f4b0: 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
f4c0: 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  key")==0 ){.    
f4d0: 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
f4e0: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
f4f0: 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26  (objv[objc-1], &
f500: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f 62 6a  nKey);.      obj
f510: 63 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  c -= 2;.    }.  
f520: 7d 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  }.  if( objc!=3 
f530: 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
f540: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f550: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
f560: 6a 76 2c 20 0a 23 69 66 64 65 66 20 53 51 4c 49  jv, .#ifdef SQLI
f570: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
f580: 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e     "HANDLE FILEN
f590: 41 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d  AME ?-key CODEC-
f5a0: 4b 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20 20  KEY?".#else.    
f5b0: 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
f5c0: 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64 69  ME ?MODE?".#endi
f5d0: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74  f.    );.    ret
f5e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f5f0: 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30   }.  zErrMsg = 0
f600: 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44  ;.  p = (SqliteD
f610: 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  b*)Tcl_Alloc( si
f620: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
f630: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  ( p==0 ){.    Tc
f640: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f650: 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  rp, "malloc fail
f660: 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ed", TCL_STATIC)
f670: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f680: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65  _ERROR;.  }.  me
f690: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
f6a0: 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20  f(*p));.  zFile 
f6b0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f6c0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
f6d0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  0);.  sqlite3_op
f6e0: 65 6e 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62  en(zFile, &p->db
f6f0: 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
f700: 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
f710: 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20  ode(p->db) ){.  
f720: 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 74 72 64    zErrMsg = strd
f730: 75 70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  up(sqlite3_errms
f740: 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73  g(p->db));.    s
f750: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
f760: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
f770: 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53   0;.  }.#ifdef S
f780: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
f790: 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d    sqlite3_key(p-
f7a0: 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  >db, pKey, nKey)
f7b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
f7c0: 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ->db==0 ){.    T
f7d0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
f7e0: 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43  erp, zErrMsg, TC
f7f0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
f800: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
f810: 29 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 45  )p);.    free(zE
f820: 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75  rrMsg);.    retu
f830: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f840: 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d  }.  p->maxStmt =
f850: 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54   NUM_PREPARED_ST
f860: 4d 54 53 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63  MTS;.  zArg = Tc
f870: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f880: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
f890: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
f8a0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
f8b0: 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28  Arg, DbObjCmd, (
f8c0: 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
f8d0: 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  eCmd);..  /* If 
f8e0: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
f8f0: 4c 49 54 45 5f 54 45 53 54 20 74 75 72 6e 65 64  LITE_TEST turned
f900: 20 6f 6e 2c 20 74 68 65 6e 20 72 65 67 69 73 74   on, then regist
f910: 65 72 20 74 68 65 20 22 6d 64 35 73 75 6d 22 0a  er the "md5sum".
f920: 20 20 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f    ** SQL functio
f930: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
f940: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
f950: 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 4d     extern void M
f960: 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69  d5_Register(sqli
f970: 74 65 33 2a 29 3b 0a 23 69 66 64 65 66 20 53 51  te3*);.#ifdef SQ
f980: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20  LITE_MEMDEBUG.  
f990: 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 66 61 69 6c    int mallocfail
f9a0: 20 3d 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c   = sqlite3_iMall
f9b0: 6f 63 46 61 69 6c 3b 0a 20 20 20 20 73 71 6c 69  ocFail;.    sqli
f9c0: 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20  te3_iMallocFail 
f9d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
f9e0: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 70 2d 3e  Md5_Register(p->
f9f0: 64 62 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  db);.#ifdef SQLI
fa00: 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20  TE_MEMDEBUG.    
fa10: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
fa20: 61 69 6c 20 3d 20 6d 61 6c 6c 6f 63 66 61 69 6c  ail = mallocfail
fa30: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  ;.#endif.  }.#en
fa40: 64 69 66 20 20 0a 20 20 70 2d 3e 69 6e 74 65 72  dif  .  p->inter
fa50: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 72 65  p = interp;.  re
fa60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
fa70: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20  /*.** Provide a 
fa80: 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74  dummy Tcl_InitSt
fa90: 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73  ubs if we are us
faa0: 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74  ing this as a st
fab0: 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e  atic.** library.
fac0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f  .*/.#ifndef USE_
fad0: 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65  TCL_STUBS.# unde
fae0: 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f  Tcl_InitStubs
faf0: 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e  .# define Tcl_In
fb00: 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23  itStubs(a,b,c).#
fb10: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
fb20: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
fb30: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
fb40: 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
fb50: 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a   This will be.**
fb60: 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74   defined automat
fb70: 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45  ically by the TE
fb80: 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74  A makefile.  But
fb90: 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73   other makefiles
fba0: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e  .** do not defin
fbb0: 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  e it..*/.#ifndef
fbc0: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
fbd0: 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47  .# define PACKAG
fbe0: 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45  E_VERSION SQLITE
fbf0: 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a  _VERSION.#endif.
fc00: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
fc10: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
fc20: 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f  *.** This Tcl mo
fc30: 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  dule contains on
fc40: 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  ly a single new 
fc50: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  Tcl command name
fc60: 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28  d "sqlite"..** (
fc70: 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  Hence there is n
fc80: 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68  o namespace.  Th
fc90: 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
fca0: 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73  in using a names
fcb0: 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65  pace.** if the e
fcc0: 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75  xtension only su
fcd0: 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e  pplies one new n
fce0: 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69  ame!)  The "sqli
fcf0: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  te" command is.*
fd00: 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61  * used to open a
fd10: 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61   new SQLite data
fd20: 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44  base.  See the D
fd30: 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20  bMain() routine 
fd40: 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64  above.** for add
fd50: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
fd60: 69 6f 6e 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69  ion..*/.EXTERN i
fd70: 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  nt Sqlite3_Init(
fd80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
fd90: 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53  rp){.  Tcl_InitS
fda0: 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
fdb0: 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  4", 0);.  Tcl_Cr
fdc0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
fdd0: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
fde0: 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
fdf0: 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
fe00: 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  ;.  Tcl_PkgProvi
fe10: 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
fe20: 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  te3", PACKAGE_VE
fe30: 52 53 49 4f 4e 29 3b 0a 20 20 54 63 6c 5f 43 72  RSION);.  Tcl_Cr
fe40: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
fe50: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
fe60: 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
fe70: 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
fe80: 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
fe90: 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
fea0: 65 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e", PACKAGE_VERS
feb0: 49 4f 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ION);.  return T
fec0: 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20  CL_OK;.}.EXTERN 
fed0: 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49  int Tclsqlite3_I
fee0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
fef0: 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
ff00: 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
ff10: 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69  erp); }.EXTERN i
ff20: 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49  nt Sqlite3_SafeI
ff30: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
ff40: 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
ff50: 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
ff60: 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
ff70: 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
ff80: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
ff90: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a  turn TCL_OK; }..
ffa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33  #ifndef SQLITE_3
ffb0: 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 45 58 54  _SUFFIX_ONLY.EXT
ffc0: 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 49  ERN int Sqlite_I
ffd0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
ffe0: 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
fff0: 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
10000 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69  erp); }.EXTERN i
10010 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69  nt Tclsqlite_Ini
10020 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
10030 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
10040 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
10050 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  p); }.EXTERN int
10060 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74   Sqlite_SafeInit
10070 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
10080 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
10090 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
100a0 74 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66 65  t Tclsqlite_Safe
100b0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
100c0 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
100d0 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69   TCL_OK; }.#endi
100e0 66 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a  f..#ifdef TCLSH.
100f0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
10100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10140 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20  * The code that 
10150 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20  follows is used 
10160 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c  to build standal
10170 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  one TCL interpre
10180 74 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ters.*/../*.** I
10190 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53  f the macro TCLS
101a0 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70  H is one, then p
101b0 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20  ut in code this 
101c0 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e  for the.** "main
101d0 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  " routine that w
101e0 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54  ill initialize T
101f0 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75  cl and take inpu
10200 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61  t from.** standa
10210 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 23 69 66  rd input..*/.#if
10220 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63   TCLSH==1.static
10230 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b   char zMainloop[
10240 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65 20  ] =.  "set line 
10250 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20 7b  {}\n".  "while {
10260 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c  ![eof stdin]} {\
10270 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69 6e  n".    "if {$lin
10280 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  e!=\"\"} {\n".  
10290 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77      "puts -nonew
102a0 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20  line \"> \"\n". 
102b0 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a     "} else {\n".
102c0 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
102d0 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22  ewline \"% \"\n"
102e0 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22  .    "}\n".    "
102f0 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a  flush stdout\n".
10300 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65      "append line
10310 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22   [gets stdin]\n"
10320 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20  .    "if {[info 
10330 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d  complete $line]}
10340 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20   {\n".      "if 
10350 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
10360 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c   #0 $line} resul
10370 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  t]} {\n".       
10380 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c 22   "puts stderr \"
10390 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22  Error: $result\"
103a0 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73  \n".      "} els
103b0 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22  eif {$result!=\"
103c0 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  \"} {\n".       
103d0 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e   "puts $result\n
103e0 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20  ".      "}\n".  
103f0 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d      "set line {}
10400 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20  \n".    "} else 
10410 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65  {\n".      "appe
10420 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20  nd line \\n\n". 
10430 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22     "}\n".  "}\n"
10440 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .;.#endif../*.**
10450 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43   If the macro TC
10460 4c 53 48 20 69 73 20 74 77 6f 2c 20 74 68 65 6e  LSH is two, then
10470 20 67 65 74 20 74 68 65 20 6d 61 69 6e 20 6c 6f   get the main lo
10480 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a 2a  op code out of.*
10490 2a 20 74 68 65 20 73 65 70 61 72 61 74 65 20 66  * the separate f
104a0 69 6c 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74  ile "spaceanal_t
104b0 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54 43  cl.h"..*/.#if TC
104c0 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 68  LSH==2.static ch
104d0 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d  ar zMainloop[] =
104e0 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70 61 63   .#include "spac
104f0 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23  eanal_tcl.h".;.#
10500 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 54  endif..#define T
10510 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20  CLSH_MAIN main  
10520 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61   /* Needed to fa
10530 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20  ke out mktclapp 
10540 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49  */.int TCLSH_MAI
10550 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  N(int argc, char
10560 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f   **argv){.  Tcl_
10570 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
10580 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74    Tcl_FindExecut
10590 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  able(argv[0]);. 
105a0 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72   interp = Tcl_Cr
105b0 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20  eateInterp();.  
105c0 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
105d0 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  erp);.#ifdef SQL
105e0 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20  ITE_TEST.  {.   
105f0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
10600 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c  tetest1_Init(Tcl
10610 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
10620 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
10630 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49  test2_Init(Tcl_I
10640 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
10650 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
10660 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st3_Init(Tcl_Int
10670 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
10680 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
10690 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  4_Init(Tcl_Inter
106a0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
106b0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f  int Sqlitetest5_
106c0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
106d0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
106e0 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e  t Sqlitetest6_In
106f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
10700 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
10710 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
10720 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
10730 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
10740 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54  litetest8_Init(T
10750 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
10760 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f   extern int Md5_
10770 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
10780 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
10790 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f  t Sqlitetestsse_
107a0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
107b0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
107c0 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e  t Sqlitetestasyn
107d0 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
107e0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
107f0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74 63  int Sqlitetesttc
10800 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lvar_Init(Tcl_In
10810 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
10820 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
10830 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c  tschema_Init(Tcl
10840 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20 20  _Interp*);..    
10850 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
10860 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
10870 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69  litetest2_Init(i
10880 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
10890 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74  tetest3_Init(int
108a0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
108b0 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72  test4_Init(inter
108c0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
108d0 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st5_Init(interp)
108e0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
108f0 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  6_Init(interp);.
10900 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f      Sqlitetest7_
10910 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10920 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e    Sqlitetest8_In
10930 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
10940 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f  Sqlitetestasync_
10950 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10960 20 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76    Sqlitetesttclv
10970 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ar_Init(interp);
10980 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73  .    Sqlitetests
10990 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72  chema_Init(inter
109a0 70 29 3b 0a 20 20 20 20 4d 64 35 5f 49 6e 69 74  p);.    Md5_Init
109b0 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66  (interp);.#ifdef
109c0 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20   SQLITE_SSE.    
109d0 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e  Sqlitetestsse_In
109e0 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
109f0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
10a00 69 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54  if( argc>=2 || T
10a10 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69  CLSH==2 ){.    i
10a20 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f 53 65  nt i;.    Tcl_Se
10a30 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
10a40 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f  v0",argv[1],TCL_
10a50 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
10a60 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
10a70 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20  erp,"argv", "", 
10a80 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
10a90 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43  ;.    for(i=3-TC
10aa0 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  LSH; i<argc; i++
10ab0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
10ac0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67  Var(interp, "arg
10ad0 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20  v", argv[i],.   
10ae0 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41         TCL_GLOBA
10af0 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53  L_ONLY | TCL_LIS
10b00 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f  T_ELEMENT | TCL_
10b10 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20  APPEND_VALUE);. 
10b20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c     }.    if( TCL
10b30 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61  SH==1 && Tcl_Eva
10b40 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72  lFile(interp, ar
10b50 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29  gv[1])!=TCL_OK )
10b60 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
10b70 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f  ar *zInfo = Tcl_
10b80 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  GetVar(interp, "
10b90 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f  errorInfo", TCL_
10ba0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
10bb0 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30      if( zInfo==0
10bc0 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72   ) zInfo = inter
10bd0 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20 20  p->result;.     
10be0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
10bf0 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67  "%s: %s\n", *arg
10c00 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20  v, zInfo);.     
10c10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
10c20 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3c  .  }.  if( argc<
10c30 3d 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29  =1 || TCLSH==2 )
10c40 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c  {.    Tcl_Global
10c50 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61  Eval(interp, zMa
10c60 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72  inloop);.  }.  r
10c70 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
10c80 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23  f /* TCLSH */..#
10c90 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
10ca0 64 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a           d(NO_TCL) */.