/ Hex Artifact Content
Login

Artifact e029f739bed90071789fe81a226d53e97a80a4d8:


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: 37 33 20 32 30 30 36 2f 30 39 2f 30 32 20 31 34  73 2006/09/02 14
01c0: 3a 31 37 3a 30 30 20 64 72 68 20 45 78 70 20 24  :17:00 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 63 61 73 65   break;.    case
4850: 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e   SQLITE_FUNCTION
4860: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4870: 65 3d 22 53 51 4c 49 54 45 5f 46 55 4e 43 54 49  e="SQLITE_FUNCTI
4880: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
4890: 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20  default         
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
48b0: 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72  zCode="????"; br
48c0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44  eak;.  }.  Tcl_D
48d0: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
48e0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
48f0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
4900: 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54  >zAuth, -1);.  T
4910: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
4920: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43  Element(&str, zC
4930: 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  ode);.  Tcl_DStr
4940: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
4950: 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a  (&str, zArg1 ? z
4960: 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg1 : "");.  Tc
4970: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
4980: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
4990: 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29  g2 ? zArg2 : "")
49a0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
49b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
49c0: 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33  r, zArg3 ? zArg3
49d0: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
49e0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
49f0: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f  nt(&str, zArg4 ?
4a00: 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20   zArg4 : "");.  
4a10: 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  rc = Tcl_GlobalE
4a20: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
4a30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
4a40: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
4a50: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
4a60: 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54 63  );.  zReply = Tc
4a70: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
4a80: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
4a90: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65    if( strcmp(zRe
4aa0: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29  ply,"SQLITE_OK")
4ab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
4ac0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
4ad0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
4ae0: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e  eply,"SQLITE_DEN
4af0: 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Y")==0 ){.    rc
4b00: 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a   = SQLITE_DENY;.
4b10: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
4b20: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
4b30: 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b  E_IGNORE")==0 ){
4b40: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4b50: 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65  _IGNORE;.  }else
4b60: 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a  {.    rc = 999;.
4b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4b80: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
4b90: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
4ba0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ZATION */../*.**
4bb0: 20 7a 54 65 78 74 20 69 73 20 61 20 70 6f 69 6e   zText is a poin
4bc0: 74 65 72 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ter to text obta
4bd0: 69 6e 65 64 20 76 69 61 20 61 6e 20 73 71 6c 69  ined via an sqli
4be0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
4bf0: 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72 20  ).** or similar 
4c00: 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69 73 20  interface. This 
4c10: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
4c20: 61 20 54 63 6c 20 73 74 72 69 6e 67 20 6f 62 6a  a Tcl string obj
4c30: 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ect, .** referen
4c40: 63 65 20 63 6f 75 6e 74 20 73 65 74 20 74 6f 20  ce count set to 
4c50: 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  0, containing th
4c60: 65 20 74 65 78 74 2e 20 49 66 20 61 20 74 72 61  e text. If a tra
4c70: 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74 77  nslation.** betw
4c80: 65 65 6e 20 69 73 6f 38 38 35 39 20 61 6e 64 20  een iso8859 and 
4c90: 55 54 46 2d 38 20 69 73 20 72 65 71 75 69 72 65  UTF-8 is require
4ca0: 64 2c 20 69 74 20 69 73 20 70 72 65 66 6f 72 6d  d, it is preform
4cb0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  ed..*/.static Tc
4cc0: 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f 4f  l_Obj *dbTextToO
4cd0: 62 6a 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  bj(char const *z
4ce0: 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a  Text){.  Tcl_Obj
4cf0: 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66 20 55   *pVal;.#ifdef U
4d00: 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e  TF_TRANSLATION_N
4d10: 45 45 44 45 44 0a 20 20 54 63 6c 5f 44 53 74 72  EEDED.  Tcl_DStr
4d20: 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f  ing dCol;.  Tcl_
4d30: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f  DStringInit(&dCo
4d40: 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72 6e  l);.  Tcl_Extern
4d50: 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e  alToUtfDString(N
4d60: 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  ULL, zText, -1, 
4d70: 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20 3d  &dCol);.  pVal =
4d80: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4d90: 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  j(Tcl_DStringVal
4da0: 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a  ue(&dCol), -1);.
4db0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
4dc0: 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a  e(&dCol);.#else.
4dd0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
4de0: 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74 2c  StringObj(zText,
4df0: 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72   -1);.#endif.  r
4e00: 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f  eturn pVal;.}../
4e10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4e20: 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f  e reads a line o
4e30: 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c 45  f text from FILE
4e40: 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74   in, stores.** t
4e50: 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72  he text in memor
4e60: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4e70: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 74  malloc() and ret
4e80: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
4e90: 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20 20  * to the text.  
4ea0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
4eb0: 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c   at end of file,
4ec0: 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a   or if malloc().
4ed0: 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20  ** fails..**.** 
4ee0: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
4ef0: 20 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e 65 22   like "readline"
4f00: 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d   but no command-
4f10: 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a 20  line editing.** 
4f20: 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63  is done..**.** c
4f30: 6f 70 69 65 64 20 66 72 6f 6d 20 73 68 65 6c 6c  opied from shell
4f40: 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72 74  .c from '.import
4f50: 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61  ' command.*/.sta
4f60: 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f  tic char *local_
4f70: 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a 50  getline(char *zP
4f80: 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e 29  rompt, FILE *in)
4f90: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b  {.  char *zLine;
4fa0: 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20  .  int nLine;.  
4fb0: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c  int n;.  int eol
4fc0: 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30  ;..  nLine = 100
4fd0: 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c  ;.  zLine = mall
4fe0: 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69  oc( nLine );.  i
4ff0: 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65  f( zLine==0 ) re
5000: 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b  turn 0;.  n = 0;
5010: 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77 68  .  eol = 0;.  wh
5020: 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20 20  ile( !eol ){.   
5030: 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65   if( n+100>nLine
5040: 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20   ){.      nLine 
5050: 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b  = nLine*2 + 100;
5060: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72  .      zLine = r
5070: 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c  ealloc(zLine, nL
5080: 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
5090: 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72  zLine==0 ) retur
50a0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
50b0: 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b  f( fgets(&zLine[
50c0: 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69  n], nLine - n, i
50d0: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  n)==0 ){.      i
50e0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
50f0: 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a     free(zLine);.
5100: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
5110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5120: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
5130: 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20      eol = 1;.   
5140: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5150: 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65      while( zLine
5160: 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  [n] ){ n++; }.  
5170: 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69    if( n>0 && zLi
5180: 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b  ne[n-1]=='\n' ){
5190: 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  .      n--;.    
51a0: 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a    zLine[n] = 0;.
51b0: 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20        eol = 1;. 
51c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65     }.  }.  zLine
51d0: 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e   = realloc( zLin
51e0: 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75  e, n+1 );.  retu
51f0: 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zLine;.}../*.
5200: 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22 20  ** The "sqlite" 
5210: 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72  command below cr
5220: 65 61 74 65 73 20 61 20 6e 65 77 20 54 63 6c 20  eates a new Tcl 
5230: 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63 68  command for each
5240: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
5250: 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53 51  t opens to an SQ
5260: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
5270: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5280: 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65  invoked.** whene
5290: 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ver one of those
52a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63   connection-spec
52b0: 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73  ific commands is
52c0: 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20   executed.** in 
52d0: 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  Tcl.  For exampl
52e0: 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20 54 63  e, if you run Tc
52f0: 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73  l code like this
5300: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71  :.**.**       sq
5310: 6c 69 74 65 33 20 64 62 31 20 20 22 6d 79 5f 64  lite3 db1  "my_d
5320: 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20  atabase".**     
5330: 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a    db1 close.**.*
5340: 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d  * The first comm
5350: 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e  and opens a conn
5360: 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d  ection to the "m
5370: 79 5f 64 61 74 61 62 61 73 65 22 20 64 61 74 61  y_database" data
5380: 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c  base.** and call
5390: 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  s that connectio
53a0: 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20 73 65  n "db1".  The se
53b0: 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75  cond command cau
53c0: 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72  ses this.** subr
53d0: 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76  outine to be inv
53e0: 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oked..*/.static 
53f0: 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69  int DbObjCmd(voi
5400: 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
5410: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
5420: 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  bjc,Tcl_Obj *con
5430: 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69  st*objv){.  Sqli
5440: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
5450: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
5460: 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72   choice;.  int r
5470: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74  c = TCL_OK;.  st
5480: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5490: 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  *DB_strs[] = {. 
54a0: 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72 22 2c     "authorizer",
54b0: 20 20 20 20 20 20 20 20 20 22 62 75 73 79 22 2c           "busy",
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
54d0: 61 63 68 65 22 2c 0a 20 20 20 20 22 63 68 61 6e  ache",.    "chan
54e0: 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  ges",           
54f0: 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20   "close",       
5500: 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c        "collate",
5510: 0a 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f  .    "collation_
5520: 6e 65 65 64 65 64 22 2c 20 20 20 22 63 6f 6d 6d  needed",   "comm
5530: 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20  it_hook",       
5540: 22 63 6f 6d 70 6c 65 74 65 22 2c 0a 20 20 20 20  "complete",.    
5550: 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20  "copy",         
5560: 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f        "enable_lo
5570: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 22 65  ad_extension","e
5580: 72 72 6f 72 63 6f 64 65 22 2c 0a 20 20 20 20 22  rrorcode",.    "
5590: 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20  eval",          
55a0: 20 20 20 20 20 22 65 78 69 73 74 73 22 2c 20 20       "exists",  
55b0: 20 20 20 20 20 20 20 20 20 20 22 66 75 6e 63 74            "funct
55c0: 69 6f 6e 22 2c 0a 20 20 20 20 22 69 6e 74 65 72  ion",.    "inter
55d0: 72 75 70 74 22 2c 20 20 20 20 20 20 20 20 20 20  rupt",          
55e0: 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  "last_insert_row
55f0: 69 64 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22  id", "nullvalue"
5600: 2c 0a 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e  ,.    "onecolumn
5610: 22 2c 20 20 20 20 20 20 20 20 20 20 22 70 72 6f  ",          "pro
5620: 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  file",          
5630: 20 22 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20   "progress",.   
5640: 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20   "rekey",       
5650: 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b         "rollback
5660: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 22 74 69 6d  _hook",     "tim
5670: 65 6f 75 74 22 2c 0a 20 20 20 20 22 74 6f 74 61  eout",.    "tota
5680: 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  l_changes",     
5690: 20 22 74 72 61 63 65 22 2c 20 20 20 20 20 20 20   "trace",       
56a0: 20 20 20 20 20 20 22 74 72 61 6e 73 61 63 74 69        "transacti
56b0: 6f 6e 22 2c 0a 20 20 20 20 22 75 70 64 61 74 65  on",.    "update
56c0: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 20 22  _hook",        "
56d0: 76 65 72 73 69 6f 6e 22 2c 20 20 20 20 20 20 20  version",       
56e0: 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75      0.  };.  enu
56f0: 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20  m DB_enum {.    
5700: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20  DB_AUTHORIZER,  
5710: 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 20 20        DB_BUSY,  
5720: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 41             DB_CA
5730: 43 48 45 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e  CHE,.    DB_CHAN
5740: 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 20 44  GES,           D
5750: 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20  B_CLOSE,        
5760: 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a      DB_COLLATE,.
5770: 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e      DB_COLLATION
5780: 5f 4e 45 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d  _NEEDED,  DB_COM
5790: 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44  MIT_HOOK,      D
57a0: 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20  B_COMPLETE,.    
57b0: 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20  DB_COPY,        
57c0: 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f        DB_ENABLE_
57d0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 44  LOAD_EXTENSION,D
57e0: 42 5f 45 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20  B_ERRORCODE,.   
57f0: 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20   DB_EVAL,       
5800: 20 20 20 20 20 20 20 44 42 5f 45 58 49 53 54 53         DB_EXISTS
5810: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 46  ,           DB_F
5820: 55 4e 43 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f  UNCTION,.    DB_
5830: 49 4e 54 45 52 52 55 50 54 2c 20 20 20 20 20 20  INTERRUPT,      
5840: 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52     DB_LAST_INSER
5850: 54 5f 52 4f 57 49 44 2c 44 42 5f 4e 55 4c 4c 56  T_ROWID,DB_NULLV
5860: 41 4c 55 45 2c 0a 20 20 20 20 44 42 5f 4f 4e 45  ALUE,.    DB_ONE
5870: 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20 20 20  COLUMN,         
5880: 44 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20  DB_PROFILE,     
5890: 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53       DB_PROGRESS
58a0: 2c 0a 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20  ,.    DB_REKEY, 
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52              DB_R
58c0: 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20  OLLBACK_HOOK,   
58d0: 20 44 42 5f 54 49 4d 45 4f 55 54 2c 0a 20 20 20   DB_TIMEOUT,.   
58e0: 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
58f0: 53 2c 20 20 20 20 20 44 42 5f 54 52 41 43 45 2c  S,     DB_TRACE,
5900: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54              DB_T
5910: 52 41 4e 53 41 43 54 49 4f 4e 2c 0a 20 20 20 20  RANSACTION,.    
5920: 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20  DB_UPDATE_HOOK, 
5930: 20 20 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e        DB_VERSION
5940: 2c 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b  ,          .  };
5950: 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76  .  /* don't leav
5960: 65 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61  e trailing comma
5970: 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74  s on DB_enum, it
5980: 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49   confuses the AI
5990: 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a  X xlc compiler *
59a0: 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20  /..  if( objc<2 
59b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
59c0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
59d0: 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d  1, objv, "SUBCOM
59e0: 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  MAND ...");.    
59f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5a00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
5a10: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
5a20: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
5a30: 20 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f   DB_strs, "optio
5a40: 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20  n", 0, &choice) 
5a50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
5a60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
5a70: 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42  switch( (enum DB
5a80: 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a  _enum)choice ){.
5a90: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74  .  /*    $db aut
5aa0: 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43  horizer ?CALLBAC
5ab0: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
5ac0: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
5ad0: 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72  llback to author
5ae0: 69 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65  ize each SQL ope
5af0: 72 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a  ration as it is.
5b00: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20    ** compiled.  
5b10: 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  5 arguments are 
5b20: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
5b30: 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20  callback before 
5b40: 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b  it is.  ** invok
5b50: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
5b60: 28 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a  (1) The authoriz
5b70: 61 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20  ation type (ex: 
5b80: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
5b90: 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  BLE, SQLITE_INSE
5ba0: 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20  RT, ...).  **   
5bb0: 28 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69  (2) First descri
5bc0: 70 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65  ptive name (depe
5bd0: 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61  nds on authoriza
5be0: 74 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20  tion type).  ** 
5bf0: 20 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73    (3) Second des
5c00: 63 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20  criptive name.  
5c10: 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66  **   (4) Name of
5c20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65   the database (e
5c30: 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  x: "main", "temp
5c40: 22 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61  ").  **   (5) Na
5c50: 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68  me of trigger th
5c60: 61 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20  at is doing the 
5c70: 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a  access.  **.  **
5c80: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68   The callback sh
5c90: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f  ould return on o
5ca0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
5cb0: 73 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f  strings: SQLITE_
5cc0: 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  OK,.  ** SQLITE_
5cd0: 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54  IGNORE, or SQLIT
5ce0: 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68  E_DENY.  Any oth
5cf0: 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
5d00: 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a  is an error..  *
5d10: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d  *.  ** If this m
5d20: 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64  ethod is invoked
5d30: 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
5d40: 74 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20  ts, the current 
5d50: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20  authorization.  
5d60: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69  ** callback stri
5d70: 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ng is returned..
5d80: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41    */.  case DB_A
5d90: 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66  UTHORIZER: {.#if
5da0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5db0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
5dc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5dd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68  lt(interp, "auth
5de0: 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76  orization not av
5df0: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20  ailable in this 
5e00: 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20  build", 0);.    
5e10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5e20: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
5e30: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
5e40: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
5e50: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
5e60: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
5e70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
5e80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
5e90: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
5ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
5eb0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
5ec0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5ed0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
5ee0: 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20  zAuth, 0);.     
5ef0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5f00: 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b      char *zAuth;
5f10: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
5f20: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
5f30: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
5f40: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41  Tcl_Free(pDb->zA
5f50: 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uth);.      }.  
5f60: 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f      zAuth = Tcl_
5f70: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
5f80: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
5f90: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68  .      if( zAuth
5fa0: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
5fb0: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
5fc0: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
5fd0: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
5fe0: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 41 75 74  strcpy(pDb->zAut
5ff0: 68 2c 20 7a 41 75 74 68 29 3b 0a 20 20 20 20 20  h, zAuth);.     
6000: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6010: 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a  pDb->zAuth = 0;.
6020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6030: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
6040: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
6050: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
6060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
6070: 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62  t_authorizer(pDb
6080: 2d 3e 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62  ->db, auth_callb
6090: 61 63 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ack, pDb);.     
60a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
60b0: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
60c0: 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20  orizer(pDb->db, 
60d0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
60e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
60f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6100: 20 20 20 20 24 64 62 20 62 75 73 79 20 3f 43 41      $db busy ?CA
6110: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
6120: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
6130: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 61  en callback if a
6140: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
6150: 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
6160: 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64  .  ** a locked d
6170: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
6180: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 55 53  */.  case DB_BUS
6190: 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  Y: {.    if( obj
61a0: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
61b0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
61c0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
61d0: 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
61e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
61f0: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
6200: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
6210: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
6220: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
6230: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
6240: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79  terp, pDb->zBusy
6250: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
6270: 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20  har *zBusy;.    
6280: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
6290: 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
62a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
62b0: 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b  ree(pDb->zBusy);
62c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
62d0: 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  Busy = Tcl_GetSt
62e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
62f0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
6300: 20 20 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c    if( zBusy && l
6310: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
6320: 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c  pDb->zBusy = Tcl
6330: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
6340: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  );.        strcp
6350: 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42  y(pDb->zBusy, zB
6360: 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  usy);.      }els
6370: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
6380: 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20  zBusy = 0;.     
6390: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
63a0: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20  ->zBusy ){.     
63b0: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
63c0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
63d0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
63e0: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44  ndler(pDb->db, D
63f0: 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44  bBusyHandler, pD
6400: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
6410: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6420: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44  _busy_handler(pD
6430: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
6440: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6450: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6460: 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20 66       $db cache f
6470: 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64  lush.  **     $d
6480: 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20  b cache size n. 
6490: 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74   **.  ** Flush t
64a0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
64b0: 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20  ement cache, or 
64c0: 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
64d0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63  number of.  ** c
64e0: 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73  ached statements
64f0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
6500: 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68  _CACHE: {.    ch
6510: 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20  ar *subCmd;.    
6520: 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20  int n;..    if( 
6530: 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20  objc<=2 ){.     
6540: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
6550: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
6560: 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e  v, "cache option
6570: 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20   ?arg?");.      
6580: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43  ;.    }.    subC
65a0: 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  md = Tcl_GetStri
65b0: 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b  ngFromObj( objv[
65c0: 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28  2], 0 );.    if(
65d0: 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26   *subCmd=='f' &&
65e0: 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22   strcmp(subCmd,"
65f0: 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20  flush")==0 ){.  
6600: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
6610: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
6620: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6630: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c  rp, 2, objv, "fl
6640: 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ush");.        r
6650: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6660: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6670: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
6680: 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20  ache( pDb );.   
6690: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
66a0: 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20  f( *subCmd=='s' 
66b0: 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64  && strcmp(subCmd
66c0: 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"size")==0 ){. 
66d0: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34       if( objc!=4
66e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
66f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
6700: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73  erp, 2, objv, "s
6710: 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20  ize n");.       
6720: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6730: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
6740: 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f          if( TCL_
6750: 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e  ERROR==Tcl_GetIn
6760: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
6770: 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b   objv[3], &n) ){
6780: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
6790: 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74  ppendResult( int
67a0: 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e  erp, "cannot con
67b0: 76 65 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20  vert \"", .     
67c0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
67d0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
67e0: 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74  bjv[3],0), "\" t
67f0: 6f 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a  o integer", 0);.
6800: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6810: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6820: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6830: 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a       if( n<0 ){.
6840: 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75 73              flus
6850: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
6860: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
6870: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
6880: 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f  }else if( n>MAX_
6890: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29  PREPARED_STMTS )
68a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  {.            n 
68b0: 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  = MAX_PREPARED_S
68c0: 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20  TMTS;.          
68d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  }.          pDb-
68e0: 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20  >maxStmt = n;.  
68f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6910: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6920: 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20  t( interp, "bad 
6930: 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20  option \"", .   
6940: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
6950: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
6960: 5b 30 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73  [0],0), "\": mus
6970: 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69  t be flush or si
6980: 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ze", 0);.      r
6990: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
69a0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
69b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
69c0: 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  $db changes.  **
69d0: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
69e0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
69f0: 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
6a00: 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
6a10: 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a   deleted by.  **
6a20: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6a30: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
6a40: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
6a50: 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  ent, not includi
6a60: 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61  ng .  ** any cha
6a70: 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 72 69  nges made by tri
6a80: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20  gger programs.. 
6a90: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48   */.  case DB_CH
6aa0: 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
6ab0: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
6ac0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
6ad0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
6ae0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6af0: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
6b00: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6b10: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6b20: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
6b30: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
6b40: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
6b50: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
6b60: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
6b70: 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62  pDb->db));.    b
6b80: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
6b90: 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a     $db close.  *
6ba0: 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20  *.  ** Shutdown 
6bb0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
6bc0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53  /.  case DB_CLOS
6bd0: 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c  E: {.    Tcl_Del
6be0: 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  eteCommand(inter
6bf0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
6c00: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
6c10: 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   0));.    break;
6c20: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
6c30: 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20      $db collate 
6c40: 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a  NAME SCRIPT.  **
6c50: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
6c60: 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  ew SQL collation
6c70: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
6c80: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
6c90: 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74  .  ** that funct
6ca0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
6cb0: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
6cc0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
6cd0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
6ce0: 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b  se DB_COLLATE: {
6cf0: 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  .    SqlCollate 
6d00: 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63  *pCollate;.    c
6d10: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
6d20: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20  char *zScript;. 
6d30: 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a     int nScript;.
6d40: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
6d50: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
6d60: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6d70: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45  , 2, objv, "NAME
6d80: 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
6d90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6da0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  R;.    }.    zNa
6db0: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
6dc0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
6dd0: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69  ], 0);.    zScri
6de0: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
6df0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
6e00: 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20  ], &nScript);.  
6e10: 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71    pCollate = (Sq
6e20: 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c  lCollate*)Tcl_Al
6e30: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f  loc( sizeof(*pCo
6e40: 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74  llate) + nScript
6e50: 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
6e60: 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65  pCollate==0 ) re
6e70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6e80: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e      pCollate->in
6e90: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
6ea0: 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65     pCollate->pNe
6eb0: 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  xt = pDb->pColla
6ec0: 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  te;.    pCollate
6ed0: 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61  ->zScript = (cha
6ee0: 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b  r*)&pCollate[1];
6ef0: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
6f00: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20  te = pCollate;. 
6f10: 20 20 20 73 74 72 63 70 79 28 70 43 6f 6c 6c 61     strcpy(pColla
6f20: 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63  te->zScript, zSc
6f30: 72 69 70 74 29 3b 0a 20 20 20 20 69 66 28 20 73  ript);.    if( s
6f40: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
6f50: 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  llation(pDb->db,
6f60: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55   zName, SQLITE_U
6f70: 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43  TF8, .        pC
6f80: 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f  ollate, tclSqlCo
6f90: 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
6fa0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
6fb0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
6fc0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
6fd0: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
6fe0: 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ILE);.      retu
6ff0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7000: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
7010: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
7020: 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f    $db collation_
7030: 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20  needed SCRIPT.  
7040: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
7050: 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
7060: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
7070: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
7080: 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
7090: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
70a0: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
70b0: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
70c0: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
70d0: 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  case DB_COLLATIO
70e0: 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20  N_NEEDED: {.    
70f0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
7100: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
7110: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
7120: 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
7130: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
7140: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7150: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f      if( pDb->pCo
7160: 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
7170: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
7180: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
7190: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
71a0: 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  }.    pDb->pColl
71b0: 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f  ateNeeded = Tcl_
71c0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
71d0: 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49  v[2]);.    Tcl_I
71e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
71f0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
7200: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
7210: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70  llation_needed(p
7220: 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c  Db->db, pDb, tcl
7230: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
7240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
7250: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
7260: 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
7270: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
7280: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
7290: 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
72a0: 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
72b0: 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
72c0: 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
72d0: 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
72e0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
72f0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
7300: 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
7310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7320: 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
7330: 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
7340: 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
7350: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
7360: 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
7370: 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
7380: 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
7390: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
73a0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
73b0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
73c0: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
73d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
73e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
73f0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
7400: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
7410: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
7420: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7430: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
7440: 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20  >zCommit, 0);.  
7450: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7460: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
7470: 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  mmit;.      int 
7480: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
7490: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
74a0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
74b0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
74c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f       }.      zCo
74d0: 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  mmit = Tcl_GetSt
74e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
74f0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
7500: 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26    if( zCommit &&
7510: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
7520: 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d    pDb->zCommit =
7530: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
7540: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
7550: 74 72 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d  trcpy(pDb->zComm
7560: 69 74 2c 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20  it, zCommit);.  
7570: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7580: 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
7590: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
75a0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
75b0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mit ){.        p
75c0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
75d0: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
75e0: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
75f0: 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d  (pDb->db, DbComm
7600: 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  itHandler, pDb);
7610: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
7630: 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  mmit_hook(pDb->d
7640: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
7650: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
7660: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
7670: 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  $db complete SQL
7680: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
7690: 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20 69 73  n TRUE if SQL is
76a0: 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20   a complete SQL 
76b0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
76c0: 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a  rn FALSE if.  **
76d0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65   additional line
76e0: 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e  s of input are n
76f0: 65 65 64 65 64 2e 20 20 54 68 69 73 20 69 73 20  eeded.  This is 
7700: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
7710: 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e   ** built-in "in
7720: 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d  fo complete" com
7730: 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a  mand of Tcl..  *
7740: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50  /.  case DB_COMP
7750: 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20  LETE: {.#ifndef 
7760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
7770: 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  LETE.    Tcl_Obj
7780: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
7790: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20  nt isComplete;. 
77a0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
77b0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
77c0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
77d0: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29   2, objv, "SQL")
77e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
77f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7800: 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d      isComplete =
7810: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
7820: 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  e( Tcl_GetString
7830: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
7840: 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75   0) );.    pResu
7850: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
7860: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
7870: 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61     Tcl_SetBoolea
7880: 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73  nObj(pResult, is
7890: 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69  Complete);.#endi
78a0: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
78b0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
78c0: 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  py conflict-algo
78d0: 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65  rithm table file
78e0: 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f  name ?SEPARATOR?
78f0: 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
7900: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20  .  **.  ** Copy 
7910: 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20  data into table 
7920: 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f  from filename, o
7930: 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20  ptionally using 
7940: 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61  SEPARATOR.  ** a
7950: 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  s column separat
7960: 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d  ors.  If a colum
7970: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c  n contains a nul
7980: 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65  l string, or the
7990: 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e  .  ** value of N
79a0: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20  ULLINDICATOR, a 
79b0: 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64  NULL is inserted
79c0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e   for the column.
79d0: 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61  .  ** conflict-a
79e0: 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20  lgorithm is one 
79f0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f  of the sqlite co
7a00: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
7a10: 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62  s:.  **    rollb
7a20: 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c  ack, abort, fail
7a30: 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63  , ignore, replac
7a40: 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73  e.  ** On succes
7a50: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  s, return the nu
7a60: 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
7a70: 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63  ocessed, not nec
7a80: 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20  essarily same.  
7a90: 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65  ** as 'db change
7aa0: 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69  s' due to confli
7ab0: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c  ct-algorithm sel
7ac0: 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ected..  **.  **
7ad0: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61   This code is ba
7ae0: 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65  sically an imple
7af0: 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63  mentation/enhanc
7b00: 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68  ement of.  ** th
7b10: 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e  e sqlite3 shell.
7b20: 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d  c ".import" comm
7b30: 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  and..  **.  ** T
7b40: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67  his command usag
7b50: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
7b60: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78  to the sqlite2.x
7b70: 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c   COPY statement,
7b80: 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f  .  ** which impo
7b90: 72 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e  rts file data in
7ba0: 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67  to a table using
7bb0: 20 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20   the PostgreSQL 
7bc0: 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74  COPY file format
7bd0: 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70  :.  **   $db cop
7be0: 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20  y $conflit_algo 
7bf0: 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c  $table_name $fil
7c00: 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a  ename \t \\N.  *
7c10: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59  /.  case DB_COPY
7c20: 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  : {.    char *zT
7c30: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
7c40: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
7c50: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
7c60: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
7c70: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
7c80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
7c90: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
7ca0: 65 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a  extract data */.
7cb0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c      char *zConfl
7cc0: 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ict;            
7cd0: 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20  /* The conflict 
7ce0: 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65  algorithm to use
7cf0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
7d00: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
7d10: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65      /* A stateme
7d20: 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  nt */.    int rc
7d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d40: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
7d50: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  code */.    int 
7d60: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
7d70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7d80: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
7d90: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
7da0: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7dc0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7dd0: 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67  in an SQL string
7de0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   */.    int i, j
7df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e00: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7e10: 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
7e20: 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nSep;           
7e30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7e40: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53  r of bytes in zS
7e50: 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ep[] */.    int 
7e60: 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nNull;          
7e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7e80: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e  r of bytes in zN
7e90: 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61  ull[] */.    cha
7ea0: 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
7eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53           /* An S
7ec0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
7ed0: 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b      char *zLine;
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65  /* A single line
7f00: 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74   of input from t
7f10: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  he file */.    c
7f20: 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20  har **azCol;    
7f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c             /* zL
7f40: 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20  ine[] broken up 
7f50: 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  into columns */.
7f60: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
7f70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7f80: 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74  /* How to commit
7f90: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
7fa0: 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7fc0: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
7fd0: 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .    int lineno 
7fe0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7ff0: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
8000: 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
8010: 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e  .    char zLineN
8020: 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20  um[80];         
8030: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
8040: 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a  print buffer */.
8050: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
8060: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
8070: 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74  /* interp result
8080: 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a   */..    char *z
8090: 53 65 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Sep;.    char *z
80a0: 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62  Null;.    if( ob
80b0: 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29  jc<5 || objc>7 )
80c0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
80d0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
80e0: 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20   2, objv, .     
80f0: 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c      "CONFLICT-AL
8100: 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49  GORITHM TABLE FI
8110: 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f  LENAME ?SEPARATO
8120: 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f  R? ?NULLINDICATO
8130: 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  R?");.      retu
8140: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8150: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
8160: 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65  >=6 ){.      zSe
8170: 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  p = Tcl_GetStrin
8180: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d  gFromObj(objv[5]
8190: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
81a0: 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  .      zSep = "\
81b0: 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t";.    }.    if
81c0: 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20  ( objc>=7 ){.   
81d0: 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47     zNull = Tcl_G
81e0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
81f0: 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20  objv[6], 0);.   
8200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e   }else{.      zN
8210: 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a  ull = "";.    }.
8220: 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20      zConflict = 
8230: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8240: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
8250: 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54  ;.    zTable = T
8260: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8270: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b  Obj(objv[3], 0);
8280: 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  .    zFile = Tcl
8290: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
82a0: 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20  j(objv[4], 0);. 
82b0: 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
82c0: 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c  (zSep);.    nNul
82d0: 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c  l = strlen(zNull
82e0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
82f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
8300: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8310: 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d  erp,"Error: non-
8320: 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72  null separator r
8330: 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79  equired for copy
8340: 22 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ",0);.      retu
8350: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8360: 20 20 7d 0a 20 20 20 20 69 66 28 73 71 6c 69 74    }.    if(sqlit
8370: 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c  e3StrICmp(zConfl
8380: 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29  ict, "rollback")
8390: 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
83a0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
83b0: 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74  Conflict, "abort
83c0: 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  "   ) != 0 &&.  
83d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
83e0: 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  Cmp(zConflict, "
83f0: 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20  fail"    ) != 0 
8400: 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  &&.       sqlite
8410: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
8420: 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20  ct, "ignore"  ) 
8430: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
8440: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
8450: 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63  onflict, "replac
8460: 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20  e" ) != 0 ) {.  
8470: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8480: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
8490: 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c  ror: \"", zConfl
84a0: 69 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ict, .          
84b0: 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d    "\", conflict-
84c0: 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62  algorithm must b
84d0: 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61  e one of: rollba
84e0: 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ck, ".          
84f0: 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20    "abort, fail, 
8500: 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61  ignore, or repla
8510: 63 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ce", 0);.      r
8520: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8530: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
8540: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8550: 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
8560: 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b   '%q'", zTable);
8570: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
8580: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
8590: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
85a0: 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75  p, "Error: no su
85b0: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61  ch table: ", zTa
85c0: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ble, 0);.      r
85d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
85e0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
85f0: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b   = strlen(zSql);
8600: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8610: 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
8620: 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74  b, zSql, 0, &pSt
8630: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
8640: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
8650: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
8660: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8670: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
8680: 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
8690: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
86a0: 20 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20   0);.      nCol 
86b0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
86c0: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
86d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
86e0: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
86f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
8700: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
8710: 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b   if( nCol==0 ) {
8720: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8730: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8740: 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63     zSql = malloc
8750: 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e  ( nByte + 50 + n
8760: 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
8770: 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20   zSql==0 ) {.   
8780: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8790: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
87a0: 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
87b0: 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ()", 0);.      r
87c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
87d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
87e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
87f0: 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+50, zSql, "INS
8800: 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27  ERT OR %q INTO '
8810: 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20  %q' VALUES(?",. 
8820: 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63          zConflic
8830: 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, zTable);.    
8840: 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29  j = strlen(zSql)
8850: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
8860: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
8870: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
8880: 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  ,';.      zSql[j
8890: 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d  ++] = '?';.    }
88a0: 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d  .    zSql[j++] =
88b0: 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a   ')';.    zSql[j
88c0: 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  ] = 0;.    rc = 
88d0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
88e0: 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  pDb->db, zSql, 0
88f0: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
8900: 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20    free(zSql);.  
8910: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
8920: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8930: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
8940: 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
8950: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
8960: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8970: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
8980: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8990: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
89a0: 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
89b0: 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
89c0: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
89d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
89e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
89f0: 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
8a00: 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
8a10: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
8a20: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
8a30: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
8a40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8a50: 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
8a60: 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
8a70: 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
8a80: 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
8a90: 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
8aa0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8ab0: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8ac0: 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
8ad0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c  ", 0);.      fcl
8ae0: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72  ose(in);.      r
8af0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8b00: 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64  .    }.    (void
8b10: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
8b20: 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  b->db, "BEGIN", 
8b30: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43  0, 0, 0);.    zC
8b40: 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22  ommit = "COMMIT"
8b50: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c  ;.    while( (zL
8b60: 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ine = local_getl
8b70: 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29  ine(0, in))!=0 )
8b80: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
8b90: 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  .      i = 0;.  
8ba0: 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
8bb0: 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a      azCol[0] = z
8bc0: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
8bd0: 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a  i=0, z=zLine; *z
8be0: 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; z++){.        
8bf0: 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20  if( *z==zSep[0] 
8c00: 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53  && strncmp(z, zS
8c10: 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a  ep, nSep)==0 ){.
8c20: 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30            *z = 0
8c30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
8c40: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
8c50: 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  <nCol ){.       
8c60: 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20       azCol[i] = 
8c70: 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20  &z[nSep];.      
8c80: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d        z += nSep-
8c90: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
8ca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8cb0: 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d  .      if( i+1!=
8cc0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
8cd0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
8ce0: 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f      zErr = mallo
8cf0: 63 28 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a  c(200 + strlen(z
8d00: 46 69 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  File));.        
8d10: 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
8d20: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45        sprintf(zE
8d30: 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
8d40: 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65   "Error: %s line
8d50: 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64   %d: expected %d
8d60: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
8d70: 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a   but found %d",.
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
8d90: 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c  le, lineno, nCol
8da0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
8db0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8dc0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
8dd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66   0);.          f
8de0: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20  ree(zErr);.     
8df0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f     }.        zCo
8e00: 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
8e10: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
8e20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8e30: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
8e40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
8e50: 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c  * check for null
8e60: 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69   data, if so, bi
8e70: 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  nd as null */.  
8e80: 20 20 20 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c        if ((nNull
8e90: 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43  >0 && strcmp(azC
8ea0: 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30  ol[i], zNull)==0
8eb0: 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f  ) || strlen(azCo
8ec0: 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20  l[i])==0) {.    
8ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
8ee0: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
8ef0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1);.        }el
8f00: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
8f10: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
8f20: 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f  pStmt, i+1, azCo
8f30: 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  l[i], -1, SQLITE
8f40: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
8f50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8f60: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
8f70: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Stmt);.      rc 
8f80: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
8f90: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72  pStmt);.      fr
8fa0: 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
8fb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8fc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
8fd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8fe0: 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c  nterp,"Error: ",
8ff0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
9000: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
9010: 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
9020: 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
9030: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9040: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
9050: 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63  e(azCol);.    fc
9060: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71  lose(in);.    sq
9070: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
9080: 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64  Stmt);.    (void
9090: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
90a0: 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20  b->db, zCommit, 
90b0: 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69  0, 0, 0);..    i
90c0: 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d  f( zCommit[0] ==
90d0: 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a   'C' ){.      /*
90e0: 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65   success, set re
90f0: 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f  sult as number o
9100: 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65  f lines processe
9110: 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75  d */.      pResu
9120: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
9130: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
9140: 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f       Tcl_SetIntO
9150: 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65  bj(pResult, line
9160: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
9170: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  TCL_OK;.    }els
9180: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c  e{.      /* fail
9190: 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65  ure, append line
91a0: 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20  no where failed 
91b0: 2a 2f 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  */.      sprintf
91c0: 28 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c  (zLineNum,"%d",l
91d0: 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63  ineno);.      Tc
91e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
91f0: 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20  nterp,", failed 
9200: 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
9210: 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75   line: ",zLineNu
9220: 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  m,0);.      rc =
9230: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9240: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
9250: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
9260: 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  db enable_load_e
9270: 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e  xtension BOOLEAN
9280: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20  .  **.  ** Turn 
9290: 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f  the extension lo
92a0: 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e  ading feature on
92b0: 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20   or off.  It if 
92c0: 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61  off by.  ** defa
92d0: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ult..  */.  case
92e0: 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f   DB_ENABLE_LOAD_
92f0: 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 20 20 20  EXTENSION: {.   
9300: 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20   int onoff;.    
9310: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
9320: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
9330: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
9340: 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22   objv, "BOOLEAN"
9350: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9360: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9370: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
9380: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
9390: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
93a0: 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20  &onoff) ){.     
93b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
93c0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
93d0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
93e0: 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e  _extension(pDb->
93f0: 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  db, onoff);.    
9400: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
9410: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72  .  **    $db err
9420: 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a  orcode.  **.  **
9430: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65   Return the nume
9440: 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74  ric error code t
9450: 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64  hat was returned
9460: 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
9470: 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f  ent.  ** call to
9480: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
9490: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
94a0: 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20  ERRORCODE: {.   
94b0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
94c0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
94d0: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
94e0: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
94f0: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
9500: 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   }.   .  /*.  **
9510: 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73 71      $db eval $sq
9520: 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e  l ?array? ?{  ..
9530: 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a  .code... }?.  **
9540: 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d      $db onecolum
9550: 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a  n $sql.  **.  **
9560: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
9570: 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
9580: 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
9590: 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
95a0: 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
95b0: 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
95c0: 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
95d0: 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
95e0: 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
95f0: 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
9600: 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
9610: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
9620: 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
9630: 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
9640: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
9650: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
9660: 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
9670: 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
9680: 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
9690: 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
96a0: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
96b0: 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
96c0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
96d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e    **.  ** The on
96e0: 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69  ecolumn method i
96f0: 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
9700: 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69   of:.  **     li
9710: 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24  ndex [$db eval $
9720: 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61  sql] 0.  */.  ca
9730: 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a  se DB_ONECOLUMN:
9740: 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a  .  case DB_EVAL:
9750: 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53 54  .  case DB_EXIST
9760: 53 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  S: {.    char co
9770: 6e 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  nst *zSql;      
9780: 2f 2a 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74  /* Next SQL stat
9790: 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
97a0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
97b0: 73 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f  st *zLeft;     /
97c0: 2a 20 57 68 61 74 20 69 73 20 6c 65 66 74 20 61  * What is left a
97d0: 66 74 65 72 20 66 69 72 73 74 20 73 74 6d 74 20  fter first stmt 
97e0: 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73  in zSql */.    s
97f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
9800: 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  mt;   /* Compile
9810: 64 20 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a  d SQL statment *
9820: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
9830: 41 72 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20  Array;       /* 
9840: 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e  Name of array in
9850: 74 6f 20 77 68 69 63 68 20 72 65 73 75 6c 74 73  to which results
9860: 20 61 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a   are written */.
9870: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
9880: 72 69 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63  ript;      /* Sc
9890: 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20  ript to run for 
98a0: 65 61 63 68 20 72 65 73 75 6c 74 20 73 65 74 20  each result set 
98b0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
98c0: 2a 61 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a  *apParm;      /*
98d0: 20 50 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   Parameters that
98e0: 20 6e 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72   need a Tcl_Decr
98f0: 52 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20  RefCount() */.  
9900: 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20    int nParm;    
9910: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9920: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73  er of entries us
9930: 65 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a  ed in apParm[] *
9940: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61  /.    Tcl_Obj *a
9950: 50 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20  Parm[10];    /* 
9960: 53 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  Static space for
9970: 20 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65   apParm[] in the
9980: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
9990: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
99a0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  t;         /* Va
99b0: 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
99c0: 65 64 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65  ed */.    SqlPre
99d0: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
99e0: 74 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  tmt;  /* Pointer
99f0: 20 74 6f 20 61 20 70 72 65 70 61 72 65 64 20 73   to a prepared s
9a00: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
9a10: 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 69 66  int rc2;..    if
9a20: 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41  ( choice==DB_EVA
9a30: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  L ){.      if( o
9a40: 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20  bjc<3 || objc>5 
9a50: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
9a60: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
9a70: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
9a80: 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f  L ?ARRAY-NAME? ?
9a90: 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
9aa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9ab0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
9ac0: 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
9ad0: 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
9ae0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
9af0: 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ret);.    }else{
9b00: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
9b10: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
9b20: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
9b30: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
9b40: 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  "SQL");.        
9b50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9b70: 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45  if( choice==DB_E
9b80: 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20  XISTS ){.       
9b90: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42   pRet = Tcl_NewB
9ba0: 6f 6f 6c 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20  ooleanObj(0);.  
9bb0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
9bc0: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
9bd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9be0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
9bf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9c00: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
9c10: 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 53 63      pArray = pSc
9c20: 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ript = 0;.    }e
9c30: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
9c40: 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20  ){.      pArray 
9c50: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69  = 0;.      pScri
9c60: 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
9c70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
9c80: 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b  Array = objv[3];
9c90: 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
9ca0: 65 74 53 74 72 69 6e 67 28 70 41 72 72 61 79 29  etString(pArray)
9cb0: 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72 61 79 20  [0]==0 ) pArray 
9cc0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69  = 0;.      pScri
9cd0: 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20  pt = objv[4];.  
9ce0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63    }..    Tcl_Inc
9cf0: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32  rRefCount(objv[2
9d00: 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54  ]);.    zSql = T
9d10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9d20: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
9d30: 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
9d40: 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30  TCL_OK && zSql[0
9d50: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ] ){.      int i
9d60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9d70: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9d80: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  unter */.      i
9d90: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
9da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9db0: 62 65 72 20 6f 66 20 62 69 6e 64 20 70 61 72 61  ber of bind para
9dc0: 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20 70 53  meters in the pS
9dd0: 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
9de0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
9df0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9e00: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
9e10: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
9e20: 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  /.      Tcl_Obj 
9e30: 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b  **apColName = 0;
9e40: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
9e50: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
9e60: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20       int len;   
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67 74 68  /* String length
9e90: 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20   of zSql */.  . 
9ea0: 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66       /* Try to f
9eb0: 69 6e 64 20 61 20 53 51 4c 20 73 74 61 74 65 6d  ind a SQL statem
9ec0: 65 6e 74 20 74 68 61 74 20 68 61 73 20 61 6c 72  ent that has alr
9ed0: 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c  eady been compil
9ee0: 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ed and.      ** 
9ef0: 77 68 69 63 68 20 6d 61 74 63 68 65 73 20 74 68  which matches th
9f00: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 63 65 20  e next sequence 
9f10: 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f  of SQL..      */
9f20: 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30  .      pStmt = 0
9f30: 3b 0a 20 20 20 20 20 20 70 50 72 65 53 74 6d 74  ;.      pPreStmt
9f40: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
9f50: 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74  ;.      len = st
9f60: 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20  rlen(zSql);.    
9f70: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 26    if( pPreStmt &
9f80: 26 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65  & sqlite3_expire
9f90: 64 28 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  d(pPreStmt->pStm
9fa0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  t) ){.        fl
9fb0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62  ushStmtCache(pDb
9fc0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  );.        pPreS
9fd0: 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
9fe0: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 70 50 72  .      for(; pPr
9ff0: 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d  eStmt; pPreStmt=
a000: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29  pPreStmt->pNext)
a010: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
a020: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  = pPreStmt->nSql
a030: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
a040: 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20  n>=n .          
a050: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65    && memcmp(pPre
a060: 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c  Stmt->zSql, zSql
a070: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  , n)==0.        
a080: 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d      && (zSql[n]=
a090: 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d  =0 || zSql[n-1]=
a0a0: 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b  =';').        ){
a0b0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 6d 74  .          pStmt
a0c0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74   = pPreStmt->pSt
a0d0: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c  mt;.          zL
a0e0: 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65  eft = &zSql[pPre
a0f0: 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20  Stmt->nSql];..  
a100: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20          /* When 
a110: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
a120: 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75  ment is found, u
a130: 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68  nlink it from th
a140: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
a150: 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77  ache list.  It w
a160: 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64  ill later be add
a170: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  ed back to the b
a180: 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20  eginning.       
a190: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63     ** of the cac
a1a0: 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72  he list in order
a1b0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52   to implement LR
a1c0: 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20  U replacement.. 
a1d0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
a1e0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
a1f0: 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  mt->pPrev ){.   
a200: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
a210: 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  t->pPrev->pNext 
a220: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
a230: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  t;.          }el
a240: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
a250: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
a260: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
a270: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a280: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
a290: 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  tmt->pNext ){.  
a2a0: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
a2b0: 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  mt->pNext->pPrev
a2c0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
a2d0: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ev;.          }e
a2e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
a2f0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
a300: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
a310: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a320: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74          pDb->nSt
a330: 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  mt--;.          
a340: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
a350: 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
a360: 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61    /* If no prepa
a370: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61  red statement wa
a380: 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c  s found.  Compil
a390: 65 20 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20  e the SQL text. 
a3a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
a3b0: 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( pStmt==0 ){.  
a3c0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
a3d0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65  _OK!=sqlite3_pre
a3e0: 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
a3f0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
a400: 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20  &zLeft) ){.     
a410: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
a420: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
a430: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
a440: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
a450: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  )));.          r
a460: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
a470: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a480: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a490: 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29    if( pStmt==0 )
a4a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a4b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
a4c0: 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e  e3_errcode(pDb->
a4d0: 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  db) ){.         
a4e0: 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d     /* A compile-
a4f0: 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68  time error in th
a500: 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  e statement.    
a510: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a520: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
a530: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
a540: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
a550: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
a560: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  db)));.         
a570: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
a580: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  R;.            b
a590: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a5a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a5b0: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d     /* The statem
a5c0: 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e  ent was a no-op.
a5d0: 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68    Continue to th
a5e0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
a5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
a600: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  in the SQL strin
a610: 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  g..            *
a620: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  /.            zS
a630: 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20  ql = zLeft;.    
a640: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
a650: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a670: 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74  assert( pPreStmt
a680: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ==0 );.      }..
a690: 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 76 61        /* Bind va
a6a0: 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65  lues to paramete
a6b0: 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  rs that begin wi
a6c0: 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20 20 20  th $ or :.      
a6d0: 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61 72 20  */  .      nVar 
a6e0: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
a6f0: 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
a700: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50 61  Stmt);.      nPa
a710: 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  rm = 0;.      if
a720: 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61 50  ( nVar>sizeof(aP
a730: 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61 72  arm)/sizeof(aPar
a740: 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  m[0]) ){.       
a750: 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f   apParm = (Tcl_O
a760: 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e  bj**)Tcl_Alloc(n
a770: 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50 61 72  Var*sizeof(apPar
a780: 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  m[0]));.      }e
a790: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 50  lse{.        apP
a7a0: 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20  arm = aParm;.   
a7b0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
a7c0: 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
a7d0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
a7e0: 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71   char *zVar = sq
a7f0: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
a800: 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  eter_name(pStmt,
a810: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
a820: 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61   zVar!=0 && (zVa
a830: 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61  r[0]=='$' || zVa
a840: 72 5b 30 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20 20  r[0]==':') ){.  
a850: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
a860: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56  *pVar = Tcl_GetV
a870: 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a  ar2Ex(interp, &z
a880: 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20  Var[1], 0, 0);. 
a890: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 56 61           if( pVa
a8a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
a8b0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
a8c0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
a8d0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
a8e0: 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79  zType = pVar->ty
a8f0: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
a900: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
a910: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
a920: 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b  ar c = zType[0];
a930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
a940: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
a950: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
a960: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
a970: 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20  >bytes==0 ){.   
a980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a990: 6c 79 20 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74  ly load a BLOB t
a9a0: 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76  ype if the Tcl v
a9b0: 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74  ariable is a byt
a9c0: 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20  earray and.     
a9d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
a9e0: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
a9f0: 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  entation. */.   
aa00: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
aa10: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
aa20: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
aa30: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
aa40: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
aa50: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
aa60: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
aa70: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
aa80: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
aa90: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
aab0: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
aac0: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
aad0: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62  }else if( (c=='b
aae0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
aaf0: 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29  e,"boolean")==0)
ab00: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
ab10: 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26        (c=='i' &&
ab20: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69   strcmp(zType,"i
ab30: 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nt")==0) ){.    
ab40: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
ab50: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
ab60: 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  rp, pVar, &n);. 
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ab80: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
ab90: 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20  tmt, i, n);.    
aba0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
abb0: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
abc0: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
abd0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
abe0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b         double r;
abf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
ac00: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
ac10: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
ac20: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20  , &r);.         
ac30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
ac40: 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  d_double(pStmt, 
ac50: 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20  i, r);.         
ac60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
ac70: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
ac80: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
ac90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
aca0: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
acb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
acc0: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
acd0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
ace0: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
acf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
ad00: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
ad10: 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20   i, v);.        
ad20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad30: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
ad40: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
ad50: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
ad60: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
ad70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
ad80: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
ad90: 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72  (pStmt, i, (char
ada0: 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49   *)data, n, SQLI
adb0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
adc0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
add0: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
ade0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
adf0: 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20  apParm[nParm++] 
ae00: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
ae10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ae20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ae30: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
ae40: 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29  null( pStmt, i )
ae50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ae60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ae70: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  .      /* Comput
ae80: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
ae90: 2f 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73  /.      nCol = s
aea0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
aeb0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
aec0: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
aed0: 0a 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61  .        apColNa
aee0: 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29  me = (Tcl_Obj**)
aef0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
af00: 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c  f(Tcl_Obj*)*nCol
af10: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
af20: 61 70 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62  apColName==0 ) b
af30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f  reak;.        fo
af40: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
af50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
af60: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62  pColName[i] = db
af70: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
af80: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
af90: 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20  tmt,i));.       
afa0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
afb0: 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  unt(apColName[i]
afc0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
afd0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
afe0: 66 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65  f results are be
aff0: 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e  ing stored in an
b000: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c   array variable,
b010: 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20   then create.   
b020: 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28     ** the array(
b030: 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61  *) entry for tha
b040: 74 20 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2f  t array.      */
b050: 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61  .      if( pArra
b060: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
b070: 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d  _Obj *pColList =
b080: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
b090: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
b0a0: 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53  pStar = Tcl_NewS
b0b0: 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31  tringObj("*", -1
b0c0: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  );.        Tcl_I
b0d0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c  ncrRefCount(pCol
b0e0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66  List);.        f
b0f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
b100: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
b110: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
b120: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
b130: 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c   pColList, apCol
b140: 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Name[i]);.      
b150: 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f    }.        Tcl_
b160: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
b170: 70 2c 20 70 41 72 72 61 79 2c 20 70 53 74 61 72  p, pArray, pStar
b180: 2c 20 70 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20  , pColList,0);. 
b190: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
b1a0: 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74  efCount(pColList
b1b0: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  );.        Tcl_D
b1c0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61  ecrRefCount(pSta
b1d0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  r);.      }..   
b1e0: 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68     /* Execute th
b1f0: 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20  e SQL.      */. 
b200: 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
b210: 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20  TCL_OK && pStmt 
b220: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
b230: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
b240: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  t) ){.        fo
b250: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
b260: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
b270: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20  cl_Obj *pVal;.  
b280: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
b290: 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74     /* Set pVal t
b2a0: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27  o contain the i'
b2b0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69  th column of thi
b2c0: 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  s row. */.      
b2d0: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
b2e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
b2f0: 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20  pStmt, i) ){.   
b300: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
b310: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
b320: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62             int b
b330: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63  ytes = sqlite3_c
b340: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
b350: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
b360: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
b370: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
b380: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
b390: 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 62  lob(pStmt, i), b
b3a0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
b3b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b3d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b3e0: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
b3f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b400: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
b410: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
b420: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
b430: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
b440: 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20  =-2147483647 && 
b450: 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  v<=2147483647 ){
b460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b470: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49   pVal = Tcl_NewI
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 65 6c 73 65 7b 0a 20          }else{. 
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b4b0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Val = Tcl_NewWid
b4c0: 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  eIntObj(v);.    
b4d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b4e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b500: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
b510: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f                do
b530: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
b540: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
b550: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
b560: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
b570: 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
b580: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
b590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b5a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b5b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
b5c0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
b5d0: 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65       pVal = dbTe
b5e0: 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75  xtToObj(pDb->zNu
b5f0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
b600: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b620: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
b640: 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  l = dbTextToObj(
b650: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
b660: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
b670: 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20  t, i));.        
b680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b690: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b6a0: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
b6b0: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
b6c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
b6d0: 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a  f( pArray==0 ){.
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
b6f0: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
b700: 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  erp, apColName[i
b710: 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a  ], 0, pVal, 0);.
b720: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
b730: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
b740: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
b750: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
b760: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56  apColName[i], pV
b770: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
b780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b790: 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65  }else if( choice
b7a0: 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
b7b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
b7c0: 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 29 3b  sert( pRet==0 );
b7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b7e0: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
b7f0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
b800: 20 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20   pVal;.         
b810: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
b820: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
b830: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b840: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
b850: 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20  BREAK;.         
b860: 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20     i = nCol;.   
b870: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b880: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53   choice==DB_EXIS
b890: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
b8a0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
b8b0: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
b8c0: 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c        pRet = Tcl
b8d0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31  _NewBooleanObj(1
b8e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
b8f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
b900: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  pRet);.         
b910: 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41     rc = TCL_BREA
b920: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  K;.            i
b930: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = nCol;.       
b940: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b950: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
b960: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
b970: 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56 61  nterp, pRet, pVa
b980: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  l);.          }.
b990: 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
b9a0: 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74       if( pScript
b9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
b9c0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
b9d0: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
b9e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
b9f0: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54  if( rc==TCL_CONT
ba00: 49 4e 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20  INUE ){.        
ba10: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
ba20: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ba30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ba40: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
ba50: 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20  _BREAK ){.      
ba60: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
ba70: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
ba80: 20 46 72 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e   Free the column
ba90: 20 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f   name objects */
baa0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69  .      if( pScri
bab0: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  pt ){.        fo
bac0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
bad0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
bae0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
baf0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
bb00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bb10: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
bb20: 29 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  )apColName);.   
bb30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
bb40: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
bb50: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
bb60: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
bb70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61    for(i=0; i<nPa
bb80: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
bb90: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
bba0: 6e 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20  nt(apParm[i]);. 
bbb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
bbc0: 20 61 70 50 61 72 6d 21 3d 61 50 61 72 6d 20 29   apParm!=aParm )
bbd0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
bbe0: 65 65 28 28 63 68 61 72 2a 29 61 70 50 61 72 6d  ee((char*)apParm
bbf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
bc00: 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 73    /* Reset the s
bc10: 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 74 68  tatement.  If th
bc20: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 69 73  e result code is
bc30: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20   SQLITE_SCHEMA, 
bc40: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c  then.      ** fl
bc50: 75 73 68 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ush the statemen
bc60: 74 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20  t cache and try 
bc70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 67  the statement ag
bc80: 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ain..      */.  
bc90: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
bca0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
bcb0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
bcc0: 5f 53 43 48 45 4d 41 3d 3d 72 63 32 20 29 7b 0a  _SCHEMA==rc2 ){.
bcd0: 20 20 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72          /* After
bce0: 20 61 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65   a schema change
bcf0: 2c 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  , flush the cach
bd00: 65 20 61 6e 64 20 74 72 79 20 74 6f 20 72 75 6e  e and try to run
bd10: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
bd20: 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 0a  statement again.
bd30: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bd40: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
bd50: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
bd60: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
bd70: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
bd80: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20     if( pPreStmt 
bd90: 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72  ) Tcl_Free((char
bda0: 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20  *)pPreStmt);.   
bdb0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
bdc0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53       }else if( S
bdd0: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b  QLITE_OK!=rc2 ){
bde0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
bdf0: 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20   run-time error 
be00: 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74  occurs, report t
be10: 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f  he error and sto
be20: 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20  p reading.      
be30: 20 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20 20    ** the SQL.   
be40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
be50: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
be60: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
be70: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  oObj(sqlite3_err
be80: 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  msg(pDb->db)));.
be90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
bea0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
beb0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43  .        rc = TC
bec0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
bed0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20   if( pPreStmt ) 
bee0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
bef0: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20  pPreStmt);.     
bf00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bf10: 7d 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e 6d  }else if( pDb->m
bf20: 61 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20  axStmt<=0 ){.   
bf30: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
bf40: 61 63 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f  ache is turned o
bf50: 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  ff, deallocated 
bf60: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
bf70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
bf80: 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65  eStmt ) Tcl_Free
bf90: 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74  ((char*)pPreStmt
bfa0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bfb0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
bfc0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
bfd0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 72  .        /* Ever
bfe0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e  ything worked an
bff0: 64 20 74 68 65 20 63 61 63 68 65 20 69 73 20 6f  d the cache is o
c000: 70 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20  perational..    
c010: 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20      ** Create a 
c020: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
c030: 74 6d 74 20 73 74 72 75 63 74 75 72 65 20 69 66  tmt structure if
c040: 20 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20   we need one..  
c050: 20 20 20 20 20 20 2a 2a 20 28 49 66 20 77 65 20        ** (If we 
c060: 61 6c 72 65 61 64 79 20 68 61 76 65 20 6f 6e 65  already have one
c070: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 72 65 75   we can just reu
c080: 73 65 20 69 74 2e 29 0a 20 20 20 20 20 20 20 20  se it.).        
c090: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
c0a0: 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  PreStmt==0 ){.  
c0b0: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c          len = zL
c0c0: 65 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20  eft - zSql;.    
c0d0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d        pPreStmt =
c0e0: 20 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d   (SqlPreparedStm
c0f0: 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  t*)Tcl_Alloc( si
c100: 7a 65 6f 66 28 2a 70 50 72 65 53 74 6d 74 29 20  zeof(*pPreStmt) 
c110: 2b 20 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  + len );.       
c120: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d     if( pPreStmt=
c130: 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
c140: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
c150: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
c160: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20   = pStmt;.      
c170: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53      pPreStmt->nS
c180: 71 6c 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  ql = len;.      
c190: 20 20 20 20 6d 65 6d 63 70 79 28 70 50 72 65 53      memcpy(pPreS
c1a0: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
c1b0: 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20   len);.         
c1c0: 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b   pPreStmt->zSql[
c1d0: 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  len] = 0;.      
c1e0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
c1f0: 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64  Add the prepared
c200: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
c210: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
c220: 68 65 20 63 61 63 68 65 20 6c 69 73 74 0a 20 20  he cache list.  
c230: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c240: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
c250: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
c260: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74  ;.        pPreSt
c270: 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  mt->pPrev = 0;. 
c280: 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e         if( pDb->
c290: 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20  stmtList ){.    
c2a0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
c2b0: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  st->pPrev = pPre
c2c0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Stmt;.        }.
c2d0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
c2e0: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
c2f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  ;.        if( pD
c300: 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29  b->stmtLast==0 )
c310: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
c320: 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d  rt( pDb->nStmt==
c330: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
c340: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
c350: 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  PreStmt;.       
c360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c370: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e    assert( pDb->n
c380: 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  Stmt>0 );.      
c390: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d    }.        pDb-
c3a0: 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20  >nStmt++;.   .  
c3b0: 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68        /* If we h
c3c0: 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61  ave too many sta
c3d0: 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c  tement in cache,
c3e0: 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70   remove the surp
c3f0: 6c 75 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lus from the.   
c400: 20 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74       ** end of t
c410: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 0a 20  he cache list.. 
c420: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c430: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53    while( pDb->nS
c440: 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74  tmt>pDb->maxStmt
c450: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
c460: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
c470: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53  Db->stmtLast->pS
c480: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
c490: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
c4a0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
c4b0: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
c4c0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
c4d0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
c4e0: 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Next);.         
c4f0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e   pDb->stmtLast->
c500: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
c510: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d       pDb->nStmt-
c520: 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
c530: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50     }..      /* P
c540: 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65  roceed to the ne
c550: 78 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  xt statement */.
c560: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
c570: 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ft;.    }.    Tc
c580: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_DecrRefCount(o
c590: 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66  bjv[2]);..    if
c5a0: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
c5b0: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
c5c0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
c5d0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
c5e0: 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20  p, pRet);.      
c5f0: 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  }.      Tcl_Decr
c600: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
c610: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
c620: 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
c630: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
c640: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d  t(interp);.    }
c650: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
c660: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
c670: 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45  db function NAME
c680: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
c690: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
c6a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  QL function call
c6b0: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
c6c0: 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  er that function
c6d0: 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c   is.  ** called,
c6e0: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
c6f0: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
c700: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
c710: 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e  case DB_FUNCTION
c720: 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20  : {.    SqlFunc 
c730: 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f  *pFunc;.    Tcl_
c740: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20  Obj *pScript;.  
c750: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
c760: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
c770: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
c780: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c790: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
c7a0: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
c7b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c7c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
c7d0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
c7e0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
c7f0: 2c 20 30 29 3b 0a 20 20 20 20 70 53 63 72 69 70  , 0);.    pScrip
c800: 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  t = objv[3];.   
c810: 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c   pFunc = findSql
c820: 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29  Func(pDb, zName)
c830: 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d  ;.    if( pFunc=
c840: 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
c850: 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70  ERROR;.    if( p
c860: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b  Func->pScript ){
c870: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
c880: 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70  efCount(pFunc->p
c890: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20  Script);.    }. 
c8a0: 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70     pFunc->pScrip
c8b0: 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20  t = pScript;.   
c8c0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
c8d0: 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  t(pScript);.    
c8e0: 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62  pFunc->useEvalOb
c8f0: 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76  jv = safeToUseEv
c900: 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70  alObjv(interp, p
c910: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20  Script);.    rc 
c920: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c930: 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64  _function(pDb->d
c940: 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
c950: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
c960: 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c     pFunc, tclSql
c970: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Func, 0, 0);.   
c980: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c990: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
c9a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c9b0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
c9c0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
c9d0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
c9e0: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
c9f0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65 6c 73  ATILE);.    }els
ca00: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75 73 74  e{.      /* Must
ca10: 20 66 6c 75 73 68 20 61 6e 79 20 63 61 63 68 65   flush any cache
ca20: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  d statements */.
ca30: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
ca40: 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20  ache( pDb );.   
ca50: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
ca60: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
ca70: 20 24 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20   $db interrupt. 
ca80: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75   **.  ** Interru
ca90: 70 74 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  pt the execution
caa0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f   of the inner-mo
cab0: 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74  st SQL interpret
cac0: 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63  er.  This.  ** c
cad0: 61 75 73 65 73 20 74 68 65 20 53 51 4c 20 73 74  auses the SQL st
cae0: 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72  atement to retur
caf0: 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51  n an error of SQ
cb00: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a  LITE_INTERRUPT..
cb10: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49    */.  case DB_I
cb20: 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20  NTERRUPT: {.    
cb30: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
cb40: 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  t(pDb->db);.    
cb50: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
cb60: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75  .  **     $db nu
cb70: 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f  llvalue ?STRING?
cb80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67  .  **.  ** Chang
cb90: 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65 6e  e text used when
cba0: 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61   a NULL comes ba
cbb0: 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ck from the data
cbc0: 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47  base. If ?STRING
cbd0: 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72  ?.  ** is not pr
cbe0: 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  esent, then the 
cbf0: 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75  current string u
cc00: 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20  sed for NULL is 
cc10: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49  returned..  ** I
cc20: 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65 73  f STRING is pres
cc30: 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47  ent, then STRING
cc40: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
cc50: 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  **.  */.  case D
cc60: 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20  B_NULLVALUE: {. 
cc70: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
cc80: 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
cc90: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
cca0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
ccb0: 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22  bjv, "NULLVALUE"
ccc0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ccd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cce0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
ccf0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   ){.      int le
cd00: 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  n;.      char *z
cd10: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
cd20: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
cd30: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
cd40: 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c    if( pDb->zNull
cd50: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
cd60: 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
cd70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cd80: 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e  if( zNull && len
cd90: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
cda0: 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41  b->zNull = Tcl_A
cdb0: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
cdc0: 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79  .        strncpy
cdd0: 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75  (pDb->zNull, zNu
cde0: 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ll, len);.      
cdf0: 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e    pDb->zNull[len
ce00: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
ce10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
ce20: 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20  Db->zNull = 0;. 
ce30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ce40: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
ce50: 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74  t(interp, dbText
ce60: 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c  ToObj(pDb->zNull
ce70: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
ce80: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
ce90: 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72    $db last_inser
cea0: 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20  t_rowid .  **.  
ceb0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
cec0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
ced0: 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20  e ROWID for the 
cee0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
cef0: 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  rt..  */.  case 
cf00: 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52  DB_LAST_INSERT_R
cf10: 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  OWID: {.    Tcl_
cf20: 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
cf30: 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f    Tcl_WideInt ro
cf40: 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  wid;.    if( obj
cf50: 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
cf60: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
cf70: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
cf80: 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
cf90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
cfa0: 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73   }.    rowid = s
cfb0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
cfc0: 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62  rt_rowid(pDb->db
cfd0: 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
cfe0: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
cff0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
d000: 63 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f 62 6a  cl_SetWideIntObj
d010: 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29  (pResult, rowid)
d020: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
d030: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
d040: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74  DB_ONECOLUMN met
d050: 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  hod is implement
d060: 65 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  ed together with
d070: 20 44 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a   DB_EVAL..  */..
d080: 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67    /*    $db prog
d090: 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b  ress ?N CALLBACK
d0a0: 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76  ?.  ** .  ** Inv
d0b0: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
d0c0: 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76  llback every N v
d0d0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f  irtual machine o
d0e0: 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65  pcodes while exe
d0f0: 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72  cuting.  ** quer
d100: 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ies..  */.  case
d110: 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a   DB_PROGRESS: {.
d120: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20      if( objc==2 
d130: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
d140: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->zProgress ){. 
d150: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
d160: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d170: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20  pDb->zProgress, 
d180: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
d190: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
d1a0: 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  4 ){.      char 
d1b0: 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20  *zProgress;.    
d1c0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
d1d0: 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66   int N;.      if
d1e0: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
d1f0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
d200: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29  rp, objv[2], &N)
d210: 20 29 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f   ){..return TCL_
d220: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a  ERROR;.      };.
d230: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
d240: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
d250: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
d260: 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->zProgress);.  
d270: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
d280: 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53  gress = Tcl_GetS
d290: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
d2a0: 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[3], &len);.   
d2b0: 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73     if( zProgress
d2c0: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
d2d0: 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
d2e0: 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ess = Tcl_Alloc(
d2f0: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
d300: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
d310: 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67  zProgress, zProg
d320: 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ress);.      }el
d330: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
d340: 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >zProgress = 0;.
d350: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
d360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
d370: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20  RESS_CALLBACK.  
d380: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
d390: 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
d3a0: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
d3b0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
d3c0: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
d3d0: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
d3e0: 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48  , N, DbProgressH
d3f0: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
d400: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d410: 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72     sqlite3_progr
d420: 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  ess_handler(pDb-
d430: 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  >db, 0, 0, 0);. 
d440: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
d450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
d460: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
d470: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
d480: 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a   "N CALLBACK");.
d490: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
d4a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
d4b0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
d4c0: 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c  /*    $db profil
d4d0: 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  e ?CALLBACK?.  *
d4e0: 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61  *.  ** Make arra
d4f0: 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f  ngements to invo
d500: 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20  ke the CALLBACK 
d510: 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65 61  routine after ea
d520: 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
d530: 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72  .  ** that has r
d540: 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66  un.  The text of
d550: 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65   the SQL and the
d560: 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73   amount of elaps
d570: 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20  e time are.  ** 
d580: 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c  appended to CALL
d590: 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20  BACK before the 
d5a0: 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20  script is run.. 
d5b0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
d5c0: 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28  OFILE: {.    if(
d5d0: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
d5e0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d5f0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
d600: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
d610: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
d620: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
d630: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
d640: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
d650: 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
d660: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
d670: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
d680: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29  Db->zProfile, 0)
d690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d6a0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
d6b0: 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20  *zProfile;.     
d6c0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
d6d0: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
d6e0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
d6f0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66  _Free(pDb->zProf
d700: 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ile);.      }.  
d710: 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54      zProfile = T
d720: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
d730: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
d740: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  n);.      if( zP
d750: 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20  rofile && len>0 
d760: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
d770: 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41  zProfile = Tcl_A
d780: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
d790: 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
d7a0: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a  pDb->zProfile, z
d7b0: 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20  Profile);.      
d7c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
d7d0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30  Db->zProfile = 0
d7e0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
d7f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
d800: 41 43 45 0a 20 20 20 20 20 20 69 66 28 20 70 44  ACE.      if( pD
d810: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
d820: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
d830: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
d840: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
d850: 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62  file(pDb->db, Db
d860: 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20  ProfileHandler, 
d870: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
d880: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
d890: 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e  e3_profile(pDb->
d8a0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
d8b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
d8c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
d8d0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
d8e0: 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a  b rekey KEY.  **
d8f0: 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  .  ** Change the
d900: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20   encryption key 
d910: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  on the currently
d920: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a   open database..
d930: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52    */.  case DB_R
d940: 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20  EKEY: {.    int 
d950: 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a  nKey;.    void *
d960: 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62  pKey;.    if( ob
d970: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
d980: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
d990: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
d9a0: 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72   "KEY");.      r
d9b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d9c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20  .    }.    pKey 
d9d0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
d9e0: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
d9f0: 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65  ], &nKey);.#ifde
da00: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
da10: 45 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  EC.    rc = sqli
da20: 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64  te3_rekey(pDb->d
da30: 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, pKey, nKey);.
da40: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
da50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
da60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
da70: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
da80: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
da90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
daa0: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
dab0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
dac0: 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74       $db timeout
dad0: 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20   MILLESECONDS.  
dae0: 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f  **.  ** Delay fo
daf0: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
db00: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65  milliseconds spe
db10: 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66 69  cified when a fi
db20: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20  le is locked..  
db30: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d  */.  case DB_TIM
db40: 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  EOUT: {.    int 
db50: 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ms;.    if( objc
db60: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
db70: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
db80: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
db90: 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a  MILLISECONDS");.
dba0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
dbb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
dbc0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
dbd0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
dbe0: 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20  objv[2], &ms) ) 
dbf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
dc00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  ;.    sqlite3_bu
dc10: 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e  sy_timeout(pDb->
dc20: 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65  db, ms);.    bre
dc30: 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a  ak;.  }.  .  /*.
dc40: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74    **     $db tot
dc50: 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a  al_changes.  **.
dc60: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
dc70: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
dc80: 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65  hat were modifie
dc90: 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20  d, inserted, or 
dca0: 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69  deleted .  ** si
dcb0: 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nce the database
dcc0: 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61   handle was crea
dcd0: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
dce0: 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
dcf0: 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
dd00: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
dd10: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
dd20: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
dd30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
dd40: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
dd50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
dd60: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
dd70: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
dd80: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
dd90: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
dda0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
ddb0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
ddc0: 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20  s(pDb->db));.   
ddd0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
dde0: 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 20 3f  *    $db trace ?
ddf0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
de00: 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
de10: 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
de20: 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
de30: 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51  tine for each SQ
de40: 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  L statement.  **
de50: 20 74 68 61 74 20 69 73 20 65 78 65 63 75 74 65   that is execute
de60: 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20  d.  The text of 
de70: 74 68 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e  the SQL is appen
de80: 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20  ded to CALLBACK 
de90: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69  before.  ** it i
dea0: 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f  s executed..  */
deb0: 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43 45  .  case DB_TRACE
dec0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
ded0: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
dee0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
def0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
df00: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
df10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
df20: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
df30: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
df40: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
df50: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
df60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
df70: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72  interp, pDb->zTr
df80: 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ace, 0);.      }
df90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dfa0: 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a    char *zTrace;.
dfb0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
dfc0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
dfd0: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
dfe0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54  Tcl_Free(pDb->zT
dff0: 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  race);.      }. 
e000: 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63       zTrace = Tc
e010: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e020: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
e030: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72  );.      if( zTr
e040: 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ace && len>0 ){.
e050: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72          pDb->zTr
e060: 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ace = Tcl_Alloc(
e070: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
e080: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
e090: 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65 29 3b  zTrace, zTrace);
e0a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e0b0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
e0c0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  e = 0;.      }.#
e0d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e0e0: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69  IT_TRACE.      i
e0f0: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
e100: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
e110: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
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 44  trace(pDb->db, D
e140: 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70  bTraceHandler, p
e150: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
e160: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e170: 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
e180: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
e190: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
e1a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
e1b0: 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  *    $db transac
e1c0: 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
e1d0: 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
e1e0: 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20  usive] SCRIPT.  
e1f0: 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20  **.  ** Start a 
e200: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
e210: 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61  (if we are not a
e220: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69  lready in the mi
e230: 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72  dst of a.  ** tr
e240: 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65  ansaction) and e
e250: 78 65 63 75 74 65 20 74 68 65 20 54 43 4c 20 73  xecute the TCL s
e260: 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 20 41  cript SCRIPT.  A
e270: 66 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a  fter SCRIPT.  **
e280: 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68   completes, eith
e290: 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  er commit the tr
e2a0: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c  ansaction or rol
e2b0: 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53 43 52  l it back if SCR
e2c0: 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20  IPT.  ** throws 
e2d0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f  an exception.  O
e2e0: 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e  r if no new tran
e2f0: 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  sation was start
e300: 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  ed, do nothing..
e310: 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78    ** pass the ex
e320: 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68  ception on up th
e330: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
e340: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
e350: 77 61 73 20 69 6e 73 70 69 72 65 64 20 62 79 20  was inspired by 
e360: 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61  Dave Thomas's ta
e370: 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68  lk on Ruby at th
e380: 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65  e.  ** 2005 O'Re
e390: 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65  illy Open Source
e3a0: 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43   Convention (OSC
e3b0: 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ON)..  */.  case
e3c0: 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a   DB_TRANSACTION:
e3d0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 54 72 61   {.    int inTra
e3e0: 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ns;.    Tcl_Obj 
e3f0: 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f  *pScript;.    co
e400: 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e  nst char *zBegin
e410: 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20 20 20 20   = "BEGIN";.    
e420: 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
e430: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
e440: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
e450: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
e460: 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54  , "[TYPE] SCRIPT
e470: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
e480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e490: 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
e4a0: 33 20 29 7b 0a 20 20 20 20 20 20 70 53 63 72 69  3 ){.      pScri
e4b0: 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20  pt = objv[2];.  
e4c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
e4d0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
e4e0: 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d  ar *TTYPE_strs[]
e4f0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65   = {.        "de
e500: 66 65 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c  ferred",   "excl
e510: 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69  usive",  "immedi
e520: 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b  ate", 0.      };
e530: 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50  .      enum TTYP
e540: 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20  E_enum {.       
e550: 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c   TTYPE_DEFERRED,
e560: 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45   TTYPE_EXCLUSIVE
e570: 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54  , TTYPE_IMMEDIAT
e580: 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  E.      };.     
e590: 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20   int ttype;.    
e5a0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
e5b0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
e5c0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45  , objv[2], TTYPE
e5d0: 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74  _strs, "transact
e5e0: 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20  ion type",.     
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74 79           0, &tty
e610: 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pe) ){.        r
e620: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e640: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59  witch( (enum TTY
e650: 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b  PE_enum)ttype ){
e660: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54  .        case TT
e670: 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20  YPE_DEFERRED:   
e680: 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20   /* no-op */;   
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
e6a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
e6b0: 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56  e TTYPE_EXCLUSIV
e6c0: 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42  E:   zBegin = "B
e6d0: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b  EGIN EXCLUSIVE";
e6e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e6f0: 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45   case TTYPE_IMME
e700: 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20  DIATE:   zBegin 
e710: 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  = "BEGIN IMMEDIA
e720: 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  TE";  break;.   
e730: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69     }.      pScri
e740: 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
e750: 20 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73 20    }.    inTrans 
e760: 3d 20 21 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  = !sqlite3_get_a
e770: 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64  utocommit(pDb->d
e780: 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54  b);.    if( !inT
e790: 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 28 76  rans ){.      (v
e7a0: 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
e7b0: 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e  (pDb->db, zBegin
e7c0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
e7d0: 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45  }.    rc = Tcl_E
e7e0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
e7f0: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
e800: 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73 20 29    if( !inTrans )
e810: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
e820: 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 20 20 20 20  ar *zEnd;.      
e830: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f  if( rc==TCL_ERRO
e840: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e  R ){.        zEn
e850: 64 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a  d = "ROLLBACK";.
e860: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
e870: 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 43         zEnd = "C
e880: 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 20 20 7d 0a  OMMIT";.      }.
e890: 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
e8a0: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
e8b0: 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29  , zEnd, 0, 0, 0)
e8c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
e8d0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
e8e0: 2a 20 20 20 20 24 64 62 20 75 70 64 61 74 65 5f  *    $db update_
e8f0: 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
e900: 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61  **    $db rollba
e910: 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  ck_hook ?script?
e920: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
e930: 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20  UPDATE_HOOK: .  
e940: 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b  case DB_ROLLBACK
e950: 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a  _HOOK: {..    /*
e960: 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70   set ppHook to p
e970: 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65 48  oint at pUpdateH
e980: 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b  ook or pRollback
e990: 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20  Hook, depending 
e9a0: 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68  on .    ** wheth
e9b0: 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68  er [$db update_h
e9c0: 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c  ook] or [$db rol
e9d0: 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20  lback_hook] was 
e9e0: 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a  invoked..    */.
e9f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70      Tcl_Obj **pp
ea00: 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63  Hook; .    if( c
ea10: 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45  hoice==DB_UPDATE
ea20: 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  _HOOK ){.      p
ea30: 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55  pHook = &pDb->pU
ea40: 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d  pdateHook;.    }
ea50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 48 6f  else{.      ppHo
ea60: 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c  ok = &pDb->pRoll
ea70: 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a  backHook;.    }.
ea80: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
ea90: 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
eaa0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
eab0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
eac0: 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54  , objv, "?SCRIPT
ead0: 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75  ?");.       retu
eae0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
eaf0: 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70 70 48    }.    if( *ppH
eb00: 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ook ){.      Tcl
eb10: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
eb20: 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a  terp, *ppHook);.
eb30: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d        if( objc==
eb40: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
eb50: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 2a 70  _DecrRefCount(*p
eb60: 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20  pHook);.        
eb70: 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20  *ppHook = 0;.   
eb80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
eb90: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
eba0: 20 20 20 20 61 73 73 65 72 74 28 20 21 28 2a 70      assert( !(*p
ebb0: 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 20 20  pHook) );.      
ebc0: 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61 72 4c  if( Tcl_GetCharL
ebd0: 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29 3e 30  ength(objv[2])>0
ebe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 48   ){.        *ppH
ebf0: 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20  ook = objv[2];. 
ec00: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
ec10: 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
ec20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ec30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 70 64  .    sqlite3_upd
ec40: 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  ate_hook(pDb->db
ec50: 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  , (pDb->pUpdateH
ec60: 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64  ook?DbUpdateHand
ec70: 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20  ler:0), pDb);.  
ec80: 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61    sqlite3_rollba
ec90: 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  ck_hook(pDb->db,
eca0: 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
ecb0: 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61  ook?DbRollbackHa
ecc0: 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a  ndler:0),pDb);..
ecd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ece0: 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73    /*    $db vers
ecf0: 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ion.  **.  ** Re
ed00: 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e  turn the version
ed10: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73   string for this
ed20: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
ed30: 20 20 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f    case DB_VERSIO
ed40: 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  N: {.    Tcl_Set
ed50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
ed60: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c  char *)sqlite3_l
ed70: 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c  ibversion(), TCL
ed80: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72  _STATIC);.    br
ed90: 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f  eak;.  }...  } /
eda0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49  * End of the SWI
edb0: 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  TCH statement */
edc0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
edd0: 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  ./*.**   sqlite3
ede0: 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45   DBNAME FILENAME
edf0: 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45   ?MODE? ?-key KE
ee00: 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  Y?.**.** This is
ee10: 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f   the main Tcl co
ee20: 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65  mmand.  When the
ee30: 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f   "sqlite" Tcl co
ee40: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f  mmand is.** invo
ee50: 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ked, this routin
ee60: 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73  e runs to proces
ee70: 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a  s that command..
ee80: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
ee90: 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45  argument, DBNAME
eea0: 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72  , is an arbitrar
eeb0: 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  y name for a new
eec0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
eed0: 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63  nection.  This c
eee0: 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61  ommand creates a
eef0: 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   new command nam
ef00: 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61  ed.** DBNAME tha
ef10: 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e  t is used to con
ef20: 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63  trol that connec
ef30: 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62  tion.  The datab
ef40: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
ef50: 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65  n is deleted whe
ef60: 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d  n the DBNAME com
ef70: 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e  mand is deleted.
ef80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
ef90: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
efa0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  e name of the di
efb0: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
efc0: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c  tains.** the sql
efd0: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61  ite database tha
efe0: 74 20 69 73 20 74 6f 20 62 65 20 61 63 63 65 73  t is to be acces
eff0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  sed..**.** For t
f000: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2c  esting purposes,
f010: 20 77 65 20 61 6c 73 6f 20 73 75 70 70 6f 72 74   we also support
f020: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
f030: 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d  **.**  sqlite3 -
f040: 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20  encoding.**.**  
f050: 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20       Return the 
f060: 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
f070: 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f   LIKE and GLOB o
f080: 70 65 72 61 74 6f 72 73 2e 20 20 43 68 6f 69 63  perators.  Choic
f090: 65 73 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20  es.**       are 
f0a0: 55 54 46 2d 38 20 61 6e 64 20 69 73 6f 38 38 35  UTF-8 and iso885
f0b0: 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  9..**.**  sqlite
f0c0: 33 20 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a  3 -version.**.**
f0d0: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74 68         Return th
f0e0: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
f0f0: 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c   of the SQLite l
f100: 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73  ibrary..**.**  s
f110: 71 6c 69 74 65 33 20 2d 74 63 6c 2d 75 73 65 73  qlite3 -tcl-uses
f120: 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  -utf.**.**      
f130: 20 52 65 74 75 72 6e 20 22 31 22 20 69 66 20 63   Return "1" if c
f140: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61 20 54  ompiled with a T
f150: 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e 20 20  cl uses UTF-8.  
f160: 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a 2a 2a  Return "0" if.**
f170: 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55 73 65         not.  Use
f180: 64 20 62 79 20 74 65 73 74 73 20 74 6f 20 6d 61  d by tests to ma
f190: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69 62 72  ke sure the libr
f1a0: 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
f1b0: 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72 72 65   .**       corre
f1c0: 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
f1d0: 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20  int DbMain(void 
f1e0: 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  *cd, Tcl_Interp 
f1f0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
f200: 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  c,Tcl_Obj *const
f210: 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65  *objv){.  Sqlite
f220: 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70  Db *p;.  void *p
f230: 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Key = 0;.  int n
f240: 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  Key = 0;.  const
f250: 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63   char *zArg;.  c
f260: 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
f270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
f280: 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  e;.  Tcl_DString
f290: 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e   translatedFilen
f2a0: 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d  ame;.  if( objc=
f2b0: 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  =2 ){.    zArg =
f2c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f2d0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
f2e0: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
f2f0: 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e  p(zArg,"-version
f300: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
f310: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f320: 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76  interp,sqlite3_v
f330: 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20  ersion,0);.     
f340: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f350: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
f360: 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d  rcmp(zArg,"-has-
f370: 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69  codec")==0 ){.#i
f380: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
f390: 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f  CODEC.      Tcl_
f3a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f3b0: 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73  erp,"1",0);.#els
f3c0: 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  e.      Tcl_Appe
f3d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f3e0: 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20  "0",0);.#endif. 
f3f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f400: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
f410: 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
f420: 74 63 6c 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d  tcl-uses-utf")==
f430: 30 20 29 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f  0 ){.#ifdef TCL_
f440: 55 54 46 5f 4d 41 58 0a 20 20 20 20 20 20 54 63  UTF_MAX.      Tc
f450: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f460: 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65  nterp,"1",0);.#e
f470: 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  lse.      Tcl_Ap
f480: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f490: 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66  p,"0",0);.#endif
f4a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f4b0: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  L_OK;.    }.  }.
f4c0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c    if( objc==5 ||
f4d0: 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20   objc==6 ){.    
f4e0: 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
f4f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f500: 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b 0a 20 20  [objc-2], 0);.  
f510: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
f520: 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a  g,"-key")==0 ){.
f530: 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c        pKey = Tcl
f540: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
f550: 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31  mObj(objv[objc-1
f560: 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20  ], &nKey);.     
f570: 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20 20 20 20   objc -= 2;.    
f580: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  }.  }.  if( objc
f590: 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=3 && objc!=4 )
f5a0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
f5b0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
f5c0: 2c 20 6f 62 6a 76 2c 20 0a 23 69 66 64 65 66 20  , objv, .#ifdef 
f5d0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
f5e0: 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46  .      "HANDLE F
f5f0: 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79 20 43 4f  ILENAME ?-key CO
f600: 44 45 43 2d 4b 45 59 3f 22 0a 23 65 6c 73 65 0a  DEC-KEY?".#else.
f610: 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49        "HANDLE FI
f620: 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23  LENAME ?MODE?".#
f630: 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20  endif.    );.   
f640: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f650: 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67  R;.  }.  zErrMsg
f660: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c   = 0;.  p = (Sql
f670: 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63  iteDb*)Tcl_Alloc
f680: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
f690: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
f6a0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
f6b0: 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20  interp, "malloc 
f6c0: 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41  failed", TCL_STA
f6d0: 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
f6e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
f6f0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
f700: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46  izeof(*p));.  zF
f710: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
f720: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f730: 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 20  2], 0);.  zFile 
f740: 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46  = Tcl_TranslateF
f750: 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20  ileName(interp, 
f760: 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c 61 74  zFile, &translat
f770: 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73  edFilename);.  s
f780: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c  qlite3_open(zFil
f790: 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 54 63  e, &p->db);.  Tc
f7a0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 74  l_DStringFree(&t
f7b0: 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
f7c0: 65 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  e);.  if( SQLITE
f7d0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72  _OK!=sqlite3_err
f7e0: 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20  code(p->db) ){. 
f7f0: 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 74 72     zErrMsg = str
f800: 64 75 70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  dup(sqlite3_errm
f810: 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
f820: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
f830: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  >db);.    p->db 
f840: 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  = 0;.  }.#ifdef 
f850: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
f860: 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70  .  sqlite3_key(p
f870: 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  ->db, pKey, nKey
f880: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
f890: 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
f8a0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
f8b0: 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54  terp, zErrMsg, T
f8c0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
f8d0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
f8e0: 2a 29 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  *)p);.    free(z
f8f0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
f900: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f910: 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20   }.  p->maxStmt 
f920: 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53  = NUM_PREPARED_S
f930: 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  TMTS;.  p->inter
f940: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41  p = interp;.  zA
f950: 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
f960: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
f970: 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ], 0);.  Tcl_Cre
f980: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
f990: 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
f9a0: 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20  jCmd, (char*)p, 
f9b0: 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 0a 20  DbDeleteCmd);.. 
f9c0: 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20   /* If compiled 
f9d0: 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
f9e0: 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 6e   turned on, then
f9f0: 20 72 65 67 69 73 74 65 72 20 74 68 65 20 22 6d   register the "m
fa00: 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c 20  d5sum".  ** SQL 
fa10: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  function..  */.#
fa20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
fa30: 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  T.  {.    extern
fa40: 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74   void Md5_Regist
fa50: 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 69  er(sqlite3*);.#i
fa60: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44  fdef SQLITE_MEMD
fa70: 45 42 55 47 0a 20 20 20 20 69 6e 74 20 6d 61 6c  EBUG.    int mal
fa80: 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c 69 74 65  locfail = sqlite
fa90: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 0a 20  3_iMallocFail;. 
faa0: 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c     sqlite3_iMall
fab0: 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64  ocFail = 0;.#end
fac0: 69 66 0a 20 20 20 20 4d 64 35 5f 52 65 67 69 73  if.    Md5_Regis
fad0: 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23 69 66 64  ter(p->db);.#ifd
fae0: 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
faf0: 55 47 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  UG.    sqlite3_i
fb00: 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6d 61 6c  MallocFail = mal
fb10: 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64 69 66 0a  locfail;.#endif.
fb20: 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a 20 20 72    }.#endif  .  r
fb30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
fb40: 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61  ./*.** Provide a
fb50: 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53   dummy Tcl_InitS
fb60: 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75  tubs if we are u
fb70: 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  sing this as a s
fb80: 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79  tatic.** library
fb90: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45  ..*/.#ifndef USE
fba0: 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64  _TCL_STUBS.# und
fbb0: 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ef  Tcl_InitStub
fbc0: 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49  s.# define Tcl_I
fbd0: 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a  nitStubs(a,b,c).
fbe0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
fbf0: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
fc00: 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  a PACKAGE_VERSIO
fc10: 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  N macro defined.
fc20: 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a    This will be.*
fc30: 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61  * defined automa
fc40: 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54  tically by the T
fc50: 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75  EA makefile.  Bu
fc60: 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65  t other makefile
fc70: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69  s.** do not defi
fc80: 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ne it..*/.#ifnde
fc90: 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  f PACKAGE_VERSIO
fca0: 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41  N.# define PACKA
fcb0: 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54  GE_VERSION SQLIT
fcc0: 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66  E_VERSION.#endif
fcd0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
fce0: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
fcf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d  **.** This Tcl m
fd00: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f  odule contains o
fd10: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  nly a single new
fd20: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
fd30: 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20  ed "sqlite"..** 
fd40: 28 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20  (Hence there is 
fd50: 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54  no namespace.  T
fd60: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
fd70: 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65   in using a name
fd80: 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20  space.** if the 
fd90: 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73  extension only s
fda0: 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20  upplies one new 
fdb0: 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c  name!)  The "sql
fdc0: 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a  ite" command is.
fdd0: 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  ** used to open 
fde0: 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74  a new SQLite dat
fdf0: 61 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20  abase.  See the 
fe00: 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65  DbMain() routine
fe10: 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64   above.** for ad
fe20: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
fe30: 74 69 6f 6e 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20  tion..*/.EXTERN 
fe40: 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  int Sqlite3_Init
fe50: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
fe60: 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74  erp){.  Tcl_Init
fe70: 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38  Stubs(interp, "8
fe80: 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  .4", 0);.  Tcl_C
fe90: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
fea0: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
feb0: 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
fec0: 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
fed0: 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76  );.  Tcl_PkgProv
fee0: 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ide(interp, "sql
fef0: 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56  ite3", PACKAGE_V
ff00: 45 52 53 49 4f 4e 29 3b 0a 20 20 54 63 6c 5f 43  ERSION);.  Tcl_C
ff10: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
ff20: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22  interp, "sqlite"
ff30: 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
ff40: 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
ff50: 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  ;.  Tcl_PkgProvi
ff60: 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
ff70: 74 65 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52  te", PACKAGE_VER
ff80: 53 49 4f 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20  SION);.  return 
ff90: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e  TCL_OK;.}.EXTERN
ffa0: 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
ffb0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
ffc0: 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
ffd0: 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
ffe0: 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20  terp); }.EXTERN 
fff0: 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65  int Sqlite3_Safe
10000 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
10010 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
10020 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
10030 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
10040 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
10050 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
10060 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
10070 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10080 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 45 58  3_SUFFIX_ONLY.EX
10090 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f  TERN int Sqlite_
100a0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
100b0 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
100c0 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
100d0 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20  terp); }.EXTERN 
100e0 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e  int Tclsqlite_In
100f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
10100 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
10110 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
10120 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  rp); }.EXTERN in
10130 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e 69  t Sqlite_SafeIni
10140 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
10150 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
10160 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
10170 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66  nt Tclsqlite_Saf
10180 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
10190 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
101a0 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64  n TCL_OK; }.#end
101b0 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48  if..#ifdef TCLSH
101c0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
101d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10210 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
10220 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64   follows is used
10230 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61   to build standa
10240 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72  lone TCL interpr
10250 65 74 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eters.*/../*.** 
10260 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
10270 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20  SH is one, then 
10280 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73  put in code this
10290 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69   for the.** "mai
102a0 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  n" routine that 
102b0 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20  will initialize 
102c0 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70  Tcl and take inp
102d0 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64  ut from.** stand
102e0 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 23 69  ard input..*/.#i
102f0 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69  f TCLSH==1.stati
10300 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
10310 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65  [] =.  "set line
10320 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20   {}\n".  "while 
10330 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b  {![eof stdin]} {
10340 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69  \n".    "if {$li
10350 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  ne!=\"\"} {\n". 
10360 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
10370 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a  wline \"> \"\n".
10380 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
10390 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
103a0 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e  newline \"% \"\n
103b0 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20  ".    "}\n".    
103c0 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22  "flush stdout\n"
103d0 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e  .    "append lin
103e0 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
103f0 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f  ".    "if {[info
10400 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d   complete $line]
10410 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66  } {\n".      "if
10420 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65   {[catch {upleve
10430 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75  l #0 $line} resu
10440 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  lt]} {\n".      
10450 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c    "puts stderr \
10460 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c  "Error: $result\
10470 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c  "\n".      "} el
10480 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
10490 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
104a0 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c    "puts $result\
104b0 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  n".      "}\n". 
104c0 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b       "set line {
104d0 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65  }\n".    "} else
104e0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70   {\n".      "app
104f0 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a  end line \\n\n".
10500 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e      "}\n".  "}\n
10510 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ".;.#endif../*.*
10520 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
10530 43 4c 53 48 20 69 73 20 74 77 6f 2c 20 74 68 65  CLSH is two, the
10540 6e 20 67 65 74 20 74 68 65 20 6d 61 69 6e 20 6c  n get the main l
10550 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a  oop code out of.
10560 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ** the separate 
10570 66 69 6c 65 20 22 73 70 61 63 65 61 6e 61 6c 5f  file "spaceanal_
10580 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54  tcl.h"..*/.#if T
10590 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63  CLSH==2.static c
105a0 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20  har zMainloop[] 
105b0 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70 61  = .#include "spa
105c0 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a  ceanal_tcl.h".;.
105d0 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
105e0 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20  TCLSH_MAIN main 
105f0 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66    /* Needed to f
10600 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70  ake out mktclapp
10610 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41   */.int TCLSH_MA
10620 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  IN(int argc, cha
10630 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c  r **argv){.  Tcl
10640 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
10650 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75  .  Tcl_FindExecu
10660 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a  table(argv[0]);.
10670 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43    interp = Tcl_C
10680 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20  reateInterp();. 
10690 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
106a0 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51  terp);.#ifdef SQ
106b0 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20  LITE_TEST.  {.  
106c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
106d0 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
106e0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
106f0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10700 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f  etest2_Init(Tcl_
10710 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
10720 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
10730 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est3_Init(Tcl_In
10740 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
10750 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
10760 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t4_Init(Tcl_Inte
10770 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
10780 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35   int Sqlitetest5
10790 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
107a0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
107b0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49  nt Sqlitetest6_I
107c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
107d0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
107e0 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69   Sqlitetest7_Ini
107f0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10800 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10810 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28  qlitetest8_Init(
10820 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10830 20 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35    extern int Md5
10840 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10850 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10860 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65  nt Sqlitetestsse
10870 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10880 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10890 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
108a0 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
108b0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
108c0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74   int Sqlitetestt
108d0 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49  clvar_Init(Tcl_I
108e0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
108f0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
10900 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63  stschema_Init(Tc
10910 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10920 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10930 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e  etest_autoext_In
10940 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
10950 0a 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ..    Sqlitetest
10960 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
10970 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
10980 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10990 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
109a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
109b0 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
109c0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
109d0 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
109e0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
109f0 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
10a00 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
10a10 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72  test7_Init(inter
10a20 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
10a30 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st8_Init(interp)
10a40 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
10a50 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72  async_Init(inter
10a60 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
10a70 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e  sttclvar_Init(in
10a80 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
10a90 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74  etestschema_Init
10aa0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
10ab0 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74  litetest_autoext
10ac0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
10ad0 20 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65     Md5_Init(inte
10ae0 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  rp);.#ifdef SQLI
10af0 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74  TE_SSE.    Sqlit
10b00 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e  etestsse_Init(in
10b10 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  terp);.#endif.  
10b20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61  }.#endif.  if( a
10b30 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d  rgc>=2 || TCLSH=
10b40 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =2 ){.    int i;
10b50 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b  .    char zArgc[
10b60 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  32];.    sqlite3
10b70 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
10b80 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20  (zArgc), zArgc, 
10b90 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43  "%d", argc-(3-TC
10ba0 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  LSH));.    Tcl_S
10bb0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
10bc0 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f  gc", zArgc, TCL_
10bd0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
10be0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
10bf0 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76  erp,"argv0",argv
10c00 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  [1],TCL_GLOBAL_O
10c10 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  NLY);.    Tcl_Se
10c20 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
10c30 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42  v", "", TCL_GLOB
10c40 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f  AL_ONLY);.    fo
10c50 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61  r(i=3-TCLSH; i<a
10c60 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
10c70 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
10c80 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76  rp, "argv", argv
10c90 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54  [i],.          T
10ca0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c  CL_GLOBAL_ONLY |
10cb0 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e   TCL_LIST_ELEMEN
10cc0 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56  T | TCL_APPEND_V
10cd0 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ALUE);.    }.   
10ce0 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26   if( TCLSH==1 &&
10cf0 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e   Tcl_EvalFile(in
10d00 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d  terp, argv[1])!=
10d10 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
10d20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66  const char *zInf
10d30 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69  o = Tcl_GetVar(i
10d40 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66  nterp, "errorInf
10d50 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  o", TCL_GLOBAL_O
10d60 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NLY);.      if( 
10d70 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f  zInfo==0 ) zInfo
10d80 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c   = interp->resul
10d90 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  t;.      fprintf
10da0 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c  (stderr,"%s: %s\
10db0 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f  n", *argv, zInfo
10dc0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10dd0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
10de0 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43  f( argc<=1 || TC
10df0 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63  LSH==2 ){.    Tc
10e00 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74  l_GlobalEval(int
10e10 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b  erp, zMainloop);
10e20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
10e30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c  .}.#endif /* TCL
10e40 53 48 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  SH */..#endif /*
10e50 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 43 4c   !defined(NO_TCL
10e60 29 20 2a 2f 0a                                   ) */.