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

Artifact 22ab598cfaa6fda50dec9035852687114286d06e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 74  ite.**.** $Id: t
01a0: 63 6c 73 71 6c 69 74 65 2e 63 2c 76 20 31 2e 31  clsqlite.c,v 1.1
01b0: 36 33 20 32 30 30 36 2f 30 37 2f 31 30 20 32 31  63 2006/07/10 21
01c0: 3a 31 35 3a 35 32 20 64 72 68 20 45 78 70 20 24  :15:52 drh Exp $
01d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54  .*/.#ifndef NO_T
01e0: 43 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74  CL     /* Omit t
01f0: 68 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69  his whole file i
0200: 66 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c  f TCL is unavail
0210: 61 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  able */..#includ
0220: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0230: 23 69 6e 63 6c 75 64 65 20 22 68 61 73 68 2e 68  #include "hash.h
0240: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
0250: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0260: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0270: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0280: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0290: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
02a0: 3e 0a 0a 2f 2a 0a 20 2a 20 57 69 6e 64 6f 77 73  >../*. * Windows
02b0: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
02c0: 68 69 63 68 20 73 79 6d 62 6f 6c 73 20 74 6f 20  hich symbols to 
02d0: 65 78 70 6f 72 74 2e 20 20 55 6e 69 78 20 64 6f  export.  Unix do
02e0: 65 73 20 6e 6f 74 2e 0a 20 2a 20 42 55 49 4c 44  es not.. * BUILD
02f0: 5f 73 71 6c 69 74 65 20 73 68 6f 75 6c 64 20 62  _sqlite should b
0300: 65 20 75 6e 64 65 66 69 6e 65 64 20 66 6f 72 20  e undefined for 
0310: 55 6e 69 78 2e 0a 20 2a 2f 0a 23 69 66 64 65 66  Unix.. */.#ifdef
0320: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 0a 23 75   BUILD_sqlite.#u
0330: 6e 64 65 66 20 54 43 4c 5f 53 54 4f 52 41 47 45  ndef TCL_STORAGE
0340: 5f 43 4c 41 53 53 0a 23 64 65 66 69 6e 65 20 54  _CLASS.#define T
0350: 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53  CL_STORAGE_CLASS
0360: 20 44 4c 4c 45 58 50 4f 52 54 0a 23 65 6e 64 69   DLLEXPORT.#endi
0370: 66 20 2f 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74  f /* BUILD_sqlit
0380: 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4e 55  e */..#define NU
0390: 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  M_PREPARED_STMTS
03a0: 20 31 30 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f   10.#define MAX_
03b0: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31  PREPARED_STMTS 1
03c0: 30 30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c  00../*.** If TCL
03d0: 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e 64 20   uses UTF-8 and 
03e0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66 69 67  SQLite is config
03f0: 75 72 65 64 20 74 6f 20 75 73 65 20 69 73 6f 38  ured to use iso8
0400: 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20  859, then we.** 
0410: 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74 72 61  have to do a tra
0420: 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67 6f  nslation when go
0430: 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20  ing between the 
0440: 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20 0a 2a  two.  Set the .*
0450: 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f  * UTF_TRANSLATIO
0460: 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f 20 74  N_NEEDED macro t
0470: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
0480: 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a 2a  we need to do.**
0490: 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f   this translatio
04a0: 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  n.  .*/.#if defi
04b0: 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58 29  ned(TCL_UTF_MAX)
04c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
04d0: 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65 66 69  ITE_UTF8).# defi
04e0: 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ne UTF_TRANSLATI
04f0: 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e 64  ON_NEEDED 1.#end
0500: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51  if../*.** New SQ
0510: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  L functions can 
0520: 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43  be created as TC
0530: 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68  L scripts.  Each
0540: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a   such function.*
0550: 2a 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62  * is described b
0560: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  y an instance of
0570: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0580: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
0590: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 46  edef struct SqlF
05a0: 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72  unc SqlFunc;.str
05b0: 75 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20  uct SqlFunc {.  
05c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
05d0: 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  rp;   /* The TCL
05e0: 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78   interpret to ex
05f0: 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69  ecute the functi
0600: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  on */.  Tcl_Obj 
0610: 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20 2f 2a  *pScript;     /*
0620: 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70   The Tcl_Obj rep
0630: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
0640: 68 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69  he script */.  i
0650: 6e 74 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20  nt useEvalObjv; 
0660: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0670: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
0680: 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a  e Tcl_EvalObjv *
0690: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
06a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
06b0: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
06c0: 6f 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20  on */.  SqlFunc 
06d0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a  *pNext;       /*
06e0: 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f   Next function o
06f0: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68  n the list of th
0700: 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  em all */.};../*
0710: 0a 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f  .** New collatio
0720: 6e 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63  n sequences func
0730: 74 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61  tion can be crea
0740: 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70  ted as TCL scrip
0750: 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a  ts.  Each such.*
0760: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65  * function is de
0770: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0780: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0790: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
07a0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
07b0: 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20  ruct SqlCollate 
07c0: 53 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75  SqlCollate;.stru
07d0: 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a  ct SqlCollate {.
07e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
07f0: 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54  terp;   /* The T
0800: 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20  CL interpret to 
0810: 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63  execute the func
0820: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
0830: 7a 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20  zScript;        
0840: 2f 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f  /* The script to
0850: 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c   be run */.  Sql
0860: 43 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20  Collate *pNext; 
0870: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
0880: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
0890: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
08a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  ;../*.** Prepare
08b0: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  d statements are
08c0: 20 63 61 63 68 65 64 20 66 6f 72 20 66 61 73 74   cached for fast
08d0: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45  er execution.  E
08e0: 61 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  ach prepared.** 
08f0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73  statement is des
0900: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
0910: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0920: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0930: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0940: 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  uct SqlPreparedS
0950: 74 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64 53  tmt SqlPreparedS
0960: 74 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50  tmt;.struct SqlP
0970: 72 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20  reparedStmt {.  
0980: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
0990: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
09a0: 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20   in linked list 
09b0: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
09c0: 53 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a  Stmt *pPrev;  /*
09d0: 20 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65   Previous on the
09e0: 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
09f0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
0a00: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
0a10: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
0a20: 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20  .  int nSql;    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
0a40: 68 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a  hars in zSql[] *
0a50: 2f 0a 20 20 63 68 61 72 20 7a 53 71 6c 5b 31 5d  /.  char zSql[1]
0a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0a70: 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  Text of the SQL 
0a80: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a  statement */.};.
0a90: 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  ./*.** There is 
0aa0: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
0ab0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
0ac0: 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20 64  or each SQLite d
0ad0: 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20  atabase.** that 
0ae0: 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  has been opened 
0af0: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54 43  by the SQLite TC
0b00: 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  L interface..*/.
0b10: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0b20: 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44 62  qliteDb SqliteDb
0b30: 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ;.struct SqliteD
0b40: 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b {.  sqlite3 *d
0b50: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0b60: 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64   /* The "real" d
0b70: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
0b80: 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52 53 54  e. MUST BE FIRST
0b90: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
0ba0: 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20   *interp;       
0bb0: 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65   /* The interpre
0bc0: 74 65 72 20 75 73 65 64 20 66 6f 72 20 74 68 69  ter used for thi
0bd0: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
0be0: 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20  char *zBusy;    
0bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0c00: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
0c10: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
0c20: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20  r *zCommit;     
0c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
0c40: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62  ommit hook callb
0c50: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
0c60: 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20   char *zTrace;  
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0c80: 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63  he trace callbac
0c90: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0ca0: 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20  har *zProfile;  
0cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0cc0: 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63   profile callbac
0cd0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0ce0: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20  har *zProgress; 
0cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0d00: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
0d10: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
0d20: 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20  char *zAuth;    
0d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0d40: 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  e authorization 
0d50: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0d60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c   */.  char *zNul
0d70: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0d80: 20 2f 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73   /* Text to subs
0d90: 74 69 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51  titute for an SQ
0da0: 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  L NULL value */.
0db0: 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
0dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0dd0: 4c 69 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63  List of SQL func
0de0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  tions */.  Tcl_O
0df0: 62 6a 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b  bj *pUpdateHook;
0e00: 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
0e10: 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20  hook script (if 
0e20: 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  any) */.  Tcl_Ob
0e30: 6a 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  j *pRollbackHook
0e40: 3b 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  ;    /* Rollback
0e50: 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66   hook script (if
0e60: 20 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f   any) */.  SqlCo
0e70: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
0e80: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
0e90: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
0ea0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
0eb0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
0ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
0ed0: 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20  rn code of most 
0ee0: 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  recent sqlite3_e
0ef0: 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f  xec() */.  Tcl_O
0f00: 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64  bj *pCollateNeed
0f10: 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  ed;   /* Collati
0f20: 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70 74  on needed script
0f30: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
0f40: 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b  dStmt *stmtList;
0f50: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70   /* List of prep
0f60: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a  ared statements*
0f70: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
0f80: 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f  tmt *stmtLast; /
0f90: 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74  * Last statement
0fa0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
0fb0: 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20    int maxStmt;  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0fd0: 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d  The next maximum
0fe0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c   number of stmtL
0ff0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74  ist */.  int nSt
1000: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
1010: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1020: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73   statements in s
1030: 74 6d 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f  tmtList */.};../
1040: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65  *.** Look at the
1050: 20 73 63 72 69 70 74 20 70 72 65 66 69 78 20 69   script prefix i
1060: 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c  n pCmd.  We will
1070: 20 62 65 20 65 78 65 63 75 74 69 6e 67 20 74 68   be executing th
1080: 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74  is script.** aft
1090: 65 72 20 66 69 72 73 74 20 61 70 70 65 6e 64 69  er first appendi
10a0: 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61  ng one or more a
10b0: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20  rguments.  This 
10c0: 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
10d0: 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20 74  .** the script t
10e0: 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20 73  o see if it is s
10f0: 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45  afe to use Tcl_E
1100: 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65  valObjv() on the
1110: 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65   script.** rathe
1120: 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20  r than the more 
1130: 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c  general Tcl_Eval
1140: 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f  Ex().  Tcl_EvalO
1150: 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a  bjv() is much.**
1160: 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53   faster..**.** S
1170: 63 72 69 70 74 73 20 74 68 61 74 20 61 72 65 20  cripts that are 
1180: 73 61 66 65 20 74 6f 20 75 73 65 20 77 69 74 68  safe to use with
1190: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
11a0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
11b0: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f   command name fo
11c0: 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f  llowed by zero o
11d0: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
11e0: 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f   with no [...] o
11f0: 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20  r $.** or {...} 
1200: 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20  or ; to be seen 
1210: 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20  anywhere.  Most 
1220: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73  callback scripts
1230: 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a   consist.** of j
1240: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  ust a single pro
1250: 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20  cedure name and 
1260: 74 68 65 79 20 6d 65 65 74 20 74 68 69 73 20 72  they meet this r
1270: 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  equirement..*/.s
1280: 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f  tatic int safeTo
1290: 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f  UseEvalObjv(Tcl_
12a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
12b0: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a  Tcl_Obj *pCmd){.
12c0: 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72    /* We could tr
12d0: 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  y to do somethin
12e0: 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65  g with Tcl_Parse
12f0: 28 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  ().  But we will
1300: 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75   instead.  ** ju
1310: 73 74 20 64 6f 20 61 20 73 65 61 72 63 68 20 66  st do a search f
1320: 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61  or forbidden cha
1330: 72 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79  racters.  If any
1340: 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64 65   of the forbidde
1350: 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72  n.  ** character
1360: 73 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64  s appear in pCmd
1370: 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74  , we will report
1380: 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 75   the string as u
1390: 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f  nsafe..  */.  co
13a0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
13b0: 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f  nt n;.  z = Tcl_
13c0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
13d0: 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68  (pCmd, &n);.  wh
13e0: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
13f0: 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b      int c = *(z+
1400: 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  +);.    if( c=='
1410: 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20  $' || c=='[' || 
1420: 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20  c==';' ) return 
1430: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1440: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  1;.}../*.** Find
1450: 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75   an SqlFunc stru
1460: 63 74 75 72 65 20 77 69 74 68 20 74 68 65 20 67  cture with the g
1470: 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63  iven name.  Or c
1480: 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f  reate a new.** o
1490: 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ne if an existin
14a0: 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20  g one cannot be 
14b0: 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61  found.  Return a
14c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
14d0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
14e0: 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20  .static SqlFunc 
14f0: 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c  *findSqlFunc(Sql
1500: 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73  iteDb *pDb, cons
1510: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1520: 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70    SqlFunc *p, *p
1530: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
1540: 70 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a  pNew = (SqlFunc*
1550: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
1560: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c  of(*pNew) + strl
1570: 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b  en(zName) + 1 );
1580: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d  .  pNew->zName =
1590: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
15a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
15b0: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65  me[i]; i++){ pNe
15c0: 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f  w->zName[i] = to
15d0: 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b  lower(zName[i]);
15e0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65   }.  pNew->zName
15f0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  [i] = 0;.  for(p
1600: 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20  =pDb->pFunc; p; 
1610: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20  p=p->pNext){ .  
1620: 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e    if( strcmp(p->
1630: 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61  zName, pNew->zNa
1640: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
1650: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
1660: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74  pNew);.      ret
1670: 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn p;.    }.  }
1680: 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20  .  pNew->interp 
1690: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  = pDb->interp;. 
16a0: 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d   pNew->pScript =
16b0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   0;.  pNew->pNex
16c0: 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  t = pDb->pFunc;.
16d0: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
16e0: 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  New;.  return pN
16f0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  ew;.}../*.** Fin
1700: 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61  alize and free a
1710: 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65   list of prepare
1720: 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a  d statements.*/.
1730: 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73  static void flus
1740: 68 53 74 6d 74 43 61 63 68 65 28 20 53 71 6c 69  hStmtCache( Sqli
1750: 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20 20 53  teDb *pDb ){.  S
1760: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
1770: 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69  pPreStmt;..  whi
1780: 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69  le(  pDb->stmtLi
1790: 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
17a0: 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d  3_finalize( pDb-
17b0: 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74  >stmtList->pStmt
17c0: 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74   );.    pPreStmt
17d0: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
17e0: 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c  ;.    pDb->stmtL
17f0: 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ist = pDb->stmtL
1800: 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
1810: 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61 72 2a  Tcl_Free( (char*
1820: 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d  )pPreStmt );.  }
1830: 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20  .  pDb->nStmt = 
1840: 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61  0;.  pDb->stmtLa
1850: 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  st = 0;.}../*.**
1860: 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20   TCL calls this 
1870: 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61  procedure when a
1880: 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62 61  n sqlite3 databa
1890: 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  se command is.**
18a0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
18b0: 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74  tic void DbDelet
18c0: 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a  eCmd(void *db){.
18d0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
18e0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b  = (SqliteDb*)db;
18f0: 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68  .  flushStmtCach
1900: 65 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  e(pDb);.  sqlite
1910: 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29  3_close(pDb->db)
1920: 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e  ;.  while( pDb->
1930: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c  pFunc ){.    Sql
1940: 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44  Func *pFunc = pD
1950: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44  b->pFunc;.    pD
1960: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  b->pFunc = pFunc
1970: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
1980: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46  _DecrRefCount(pF
1990: 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20  unc->pScript);. 
19a0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
19b0: 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20  r*)pFunc);.  }. 
19c0: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f   while( pDb->pCo
19d0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c  llate ){.    Sql
19e0: 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74  Collate *pCollat
19f0: 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  e = pDb->pCollat
1a00: 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c  e;.    pDb->pCol
1a10: 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d  late = pCollate-
1a20: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f  >pNext;.    Tcl_
1a30: 46 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c  Free((char*)pCol
1a40: 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  late);.  }.  if(
1a50: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
1a60: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
1a70: 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69  >zBusy);.  }.  i
1a80: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
1a90: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
1aa0: 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d  Db->zTrace);.  }
1ab0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f  .  if( pDb->zPro
1ac0: 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f  file ){.    Tcl_
1ad0: 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69  Free(pDb->zProfi
1ae0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  le);.  }.  if( p
1af0: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
1b00: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1b10: 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Auth);.  }.  if(
1b20: 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20   pDb->zNull ){. 
1b30: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
1b40: 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69  >zNull);.  }.  i
1b50: 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48  f( pDb->pUpdateH
1b60: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
1b70: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
1b80: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  >pUpdateHook);. 
1b90: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52   }.  if( pDb->pR
1ba0: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20  ollbackHook ){. 
1bb0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1bc0: 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  unt(pDb->pRollba
1bd0: 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  ckHook);.  }.  i
1be0: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
1bf0: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63  Needed ){.    Tc
1c00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
1c10: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
1c20: 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46  ed);.  }.  Tcl_F
1c30: 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b  ree((char*)pDb);
1c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1c50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1c60: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
1c70: 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20   file is locked 
1c80: 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
1c90: 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a  to execute SQL..
1ca0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
1cb0: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
1cc0: 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73   *cd, int nTries
1cd0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
1ce0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1cf0: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  cd;.  int rc;.  
1d00: 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a  char zVal[30];..
1d10: 20 20 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c 20    sprintf(zVal, 
1d20: 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20  "%d", nTries);. 
1d30: 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61   rc = Tcl_VarEva
1d40: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
1d50: 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20  Db->zBusy, " ", 
1d60: 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zVal, (char*)0);
1d70: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
1d80: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
1d90: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
1da0: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
1db0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1dc0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1dd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1de0: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73  ne is invoked as
1df0: 20 74 68 65 20 27 70 72 6f 67 72 65 73 73 20 63   the 'progress c
1e00: 61 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65  allback' for the
1e10: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1e20: 61 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72  atic int DbProgr
1e30: 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  essHandler(void 
1e40: 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *cd){.  SqliteDb
1e50: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
1e60: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b  b*)cd;.  int rc;
1e70: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
1e80: 3e 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20  >zProgress );.  
1e90: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
1ea0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
1eb0: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66  zProgress);.  if
1ec0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc!=TCL_OK || 
1ed0: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
1ee0: 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  ngResult(pDb->in
1ef0: 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65  terp)) ){.    re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
1f10: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
1f20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1f30: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RACE./*.** This 
1f40: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f50: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
1f60: 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68  trace handler wh
1f70: 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20  enever a new.** 
1f80: 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20  block of SQL is 
1f90: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54  executed.  The T
1fa0: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
1fb0: 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63  ->zTrace is exec
1fc0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
1fd0: 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64  void DbTraceHand
1fe0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
1ff0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
2000: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
2010: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
2020: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2030: 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72  str;..  Tcl_DStr
2040: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2050: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2060: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54  nd(&str, pDb->zT
2070: 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  race, -1);.  Tcl
2080: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
2090: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
20a0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
20b0: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
20c0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
20d0: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
20e0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
20f0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
2100: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23  Db->interp);.}.#
2110: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
2120: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
2130: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2140: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
2150: 20 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66   the SQLite prof
2160: 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65  ile handler afte
2170: 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  r a statement.**
2180: 20 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65   SQL has execute
2190: 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69  d.  The TCL scri
21a0: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66  pt in pDb->zProf
21b0: 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64  ile is evaluated
21c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21d0: 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65   DbProfileHandle
21e0: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
21f0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71  t char *zSql, sq
2200: 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b  lite_uint64 tm){
2210: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
2220: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
2230: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2240: 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b  str;.  char zTm[
2250: 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  100];..  sqlite3
2260: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2270: 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25  (zTm)-1, zTm, "%
2280: 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c  lld", tm);.  Tcl
2290: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
22a0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
22b0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
22c0: 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29  b->zProfile, -1)
22d0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
22e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
22f0: 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f  r, zSql);.  Tcl_
2300: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
2310: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b  ment(&str, zTm);
2320: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
2330: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
2340: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
2350: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2360: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
2370: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
2380: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  ->interp);.}.#en
2390: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
23a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
23b0: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
23c0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
23d0: 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73  d.  The.** TCL s
23e0: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43  cript in pDb->zC
23f0: 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65  ommit is execute
2400: 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e  d.  If it return
2410: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a  s non-zero or.**
2420: 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e   if it throws an
2430: 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20   exception, the 
2440: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
2450: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65  olled back inste
2460: 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63  ad.** of being c
2470: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61  ommitted..*/.sta
2480: 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74  tic int DbCommit
2490: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
24a0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
24b0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
24c0: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
24d0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
24e0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
24f0: 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  >zCommit);.  if(
2500: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
2510: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
2520: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
2530: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
2540: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2550: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
2560: 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b   void DbRollback
2570: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c  Handler(void *cl
2580: 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c  ientData){.  Sql
2590: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
25a0: 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61  liteDb*)clientDa
25b0: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62  ta;.  assert(pDb
25c0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
25d0: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
25e0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
25f0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
2600: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30  pRollbackHook, 0
2610: 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63  ) ){.    Tcl_Bac
2620: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62  kgroundError(pDb
2630: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d  ->interp);.  }.}
2640: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  ..static void Db
2650: 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20  UpdateHandler(. 
2660: 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74   void *p, .  int
2670: 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   op,.  const cha
2680: 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74  r *zDb, .  const
2690: 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20   char *zTbl, .  
26a0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77  sqlite_int64 row
26b0: 69 64 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  id.){.  SqliteDb
26c0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
26d0: 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  b *)p;.  Tcl_Obj
26e0: 20 2a 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72   *pCmd;..  asser
26f0: 74 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48  t( pDb->pUpdateH
2700: 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ook );.  assert(
2710: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45   op==SQLITE_INSE
2720: 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45  RT || op==SQLITE
2730: 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53  _UPDATE || op==S
2740: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a  QLITE_DELETE );.
2750: 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75  .  pCmd = Tcl_Du
2760: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
2770: 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20  pUpdateHook);.  
2780: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2790: 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pCmd);.  Tcl_Li
27a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
27b0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
27c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20  NewStringObj(.  
27d0: 20 20 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f    ( (op==SQLITE_
27e0: 49 4e 53 45 52 54 29 3f 22 49 4e 53 45 52 54 22  INSERT)?"INSERT"
27f0: 3a 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44  :(op==SQLITE_UPD
2800: 41 54 45 29 3f 22 55 50 44 41 54 45 22 3a 22 44  ATE)?"UPDATE":"D
2810: 45 4c 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20  ELETE"), -1));. 
2820: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2830: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
2840: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
2850: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
2860: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2870: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
2880: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
2890: 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a  Obj(zTbl, -1));.
28a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
28b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
28c0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
28d0: 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20  ntObj(rowid));. 
28e0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
28f0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
2900: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
2910: 54 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  T);.}..static vo
2920: 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65  id tclCollateNee
2930: 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  ded(.  void *pCt
2940: 78 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  x,.  sqlite3 *db
2950: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63  ,.  int enc,.  c
2960: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2970: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
2980: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
2990: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
29a0: 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c  j *pScript = Tcl
29b0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44  _DuplicateObj(pD
29c0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
29d0: 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  d);.  Tcl_IncrRe
29e0: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
29f0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
2a00: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
2a10: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
2a20: 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20  tringObj(zName, 
2a30: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
2a40: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
2a50: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
2a60: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2a70: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a  nt(pScript);.}..
2a80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2a90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
2aa0: 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20  evaluate an SQL 
2ab0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
2ac0: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
2ad0: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
2ae0: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
2af0: 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28  t tclSqlCollate(
2b00: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
2b10: 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74   int nA,.  const
2b20: 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74   void *zA,.  int
2b30: 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nB,.  const voi
2b40: 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f  d *zB.){.  SqlCo
2b50: 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43  llate *p = (SqlC
2b60: 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20  ollate *)pCtx;. 
2b70: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
2b80: 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65  .  pCmd = Tcl_Ne
2b90: 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53  wStringObj(p->zS
2ba0: 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63  cript, -1);.  Tc
2bb0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
2bc0: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
2bd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2be0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
2bf0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2c00: 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54  bj(zA, nA));.  T
2c10: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c20: 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72  Element(p->inter
2c30: 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  p, pCmd, Tcl_New
2c40: 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42  StringObj(zB, nB
2c50: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
2c60: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
2c70: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
2c80: 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63  RECT);.  Tcl_Dec
2c90: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
2ca0: 0a 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28  .  return (atoi(
2cb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
2cc0: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29  ult(p->interp)))
2cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2ce0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2cf0: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
2d00: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d   SQL function im
2d10: 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69  plemented.** usi
2d20: 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a  ng TCL script..*
2d30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63  /.static void tc
2d40: 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33  lSqlFunc(sqlite3
2d50: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
2d60: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
2d70: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76  ite3_value**argv
2d80: 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20  ){.  SqlFunc *p 
2d90: 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
2da0: 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ata(context);.  
2db0: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20  Tcl_Obj *pCmd;. 
2dc0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
2dd0: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30  ;..  if( argc==0
2de0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2df0: 65 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d  ere are no argum
2e00: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
2e10: 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45  tion, call Tcl_E
2e20: 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a  valObjEx on the.
2e30: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62      ** script ob
2e40: 6a 65 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20  ject directly.  
2e50: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
2e60: 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  TCL compiler to 
2e70: 67 65 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20  generate.    ** 
2e80: 62 79 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65  bytecode for the
2e90: 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20   command on the 
2ea0: 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e  first invocation
2eb0: 20 61 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20   and thus make. 
2ec0: 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
2ed0: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63   invocations muc
2ee0: 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20  h faster. */.   
2ef0: 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69   pCmd = p->pScri
2f00: 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  pt;.    Tcl_Incr
2f10: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
2f20: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
2f30: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
2f40: 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20  , pCmd, 0);.    
2f50: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2f60: 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCmd);.  }else{
2f70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2f80: 20 61 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74   are arguments t
2f90: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20  o the function, 
2fa0: 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63  make a shallow c
2fb0: 6f 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  opy of the.    *
2fc0: 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c  * script object,
2fd0: 20 6c 61 70 70 65 6e 64 20 74 68 65 20 61 72 67   lappend the arg
2fe0: 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61  uments, then eva
2ff0: 6c 75 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a  luate the copy..
3000: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79      **.    ** By
3010: 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c   "shallow" copy,
3020: 20 77 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20   we mean a only 
3030: 74 68 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54  the outer list T
3040: 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63  cl_Obj is duplic
3050: 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ated..    ** The
3060: 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e   new Tcl_Obj con
3070: 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
3080: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c  o the original l
3090: 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20  ist elements. . 
30a0: 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
30b0: 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  when Tcl_EvalObj
30c0: 76 28 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73  v() is run and s
30d0: 68 69 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73  himmers the firs
30e0: 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  t element.    **
30f0: 20 6f 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20   of the list to 
3100: 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20  tclCmdNameType, 
3110: 74 68 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72  that alternate r
3120: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69  epresentation wi
3130: 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65  ll.    ** be pre
3140: 73 65 72 76 65 64 20 61 6e 64 20 72 65 75 73 65  served and reuse
3150: 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e  d on the next in
3160: 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  vocation..    */
3170: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
3180: 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  Arg;.    int nAr
3190: 67 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c  g;.    if( Tcl_L
31a0: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
31b0: 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  s(p->interp, p->
31c0: 70 53 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20  pScript, &nArg, 
31d0: 26 61 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20  &aArg) ){.      
31e0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
31f0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
3200: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3210: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
3220: 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ); .      return
3230: 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20  ;.    }     .   
3240: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c   pCmd = Tcl_NewL
3250: 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72  istObj(nArg, aAr
3260: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  g);.    Tcl_Incr
3270: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
3280: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
3290: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
32a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
32b0: 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20  pIn = argv[i];. 
32c0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
32d0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
32e0: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56  .      /* Set pV
32f0: 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  al to contain th
3300: 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i'th column of
3310: 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20   this row. */.  
3320: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
3330: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
3340: 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  In) ){.        c
3350: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
3360: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
3370: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
3380: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e  _value_bytes(pIn
3390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
33a0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
33b0: 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f  rrayObj(sqlite3_
33c0: 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c  value_blob(pIn),
33d0: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
33e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
33f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
3400: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
3410: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
3420: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
3430: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
3440: 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  4(pIn);.        
3450: 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38    if( v>=-214748
3460: 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34  3647 && v<=21474
3470: 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20  83647 ){.       
3480: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
3490: 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  NewIntObj(v);.  
34a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
34b0: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
34c0: 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  = Tcl_NewWideInt
34d0: 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Obj(v);.        
34e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
34f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
3500: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
3510: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
3520: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
3530: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
3540: 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20  ouble(pIn);.    
3550: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
3560: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29  _NewDoubleObj(r)
3570: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
3580: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
3590: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
35a0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20  _NULL: {.       
35b0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
35c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30  wStringObj("", 0
35d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
35e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
35f0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
3600: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
3610: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
3620: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
3630: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
3640: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
3650: 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74  bj((char *)sqlit
3660: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49  e3_value_text(pI
3670: 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  n), bytes);.    
3680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36a0: 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69       rc = Tcl_Li
36b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
36c0: 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  nt(p->interp, pC
36d0: 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20  md, pVal);.     
36e0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
36f0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3700: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20  unt(pCmd);.     
3710: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3720: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
3730: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
3740: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
3750: 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72   -1); .        r
3760: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
3770: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d     }.    if( !p-
3780: 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a  >useEvalObjv ){.
3790: 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61        /* Tcl_Eva
37a0: 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75  lObjEx() will au
37b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c  tomatically call
37c0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
37d0: 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a  if pCmd.      **
37e0: 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f   is a list witho
37f0: 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70 72  ut a string repr
3800: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20  esentation.  To 
3810: 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f  prevent this fro
3820: 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65  m.      ** happe
3830: 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20  ning, make sure 
3840: 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64  pCmd has a valid
3850: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
3860: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3870: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43  Tcl_GetString(pC
3880: 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  md);.    }.    r
3890: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
38a0: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
38b0: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
38c0: 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  CT);.    Tcl_Dec
38d0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
38e0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26  .  }..  if( rc &
38f0: 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e  & rc!=TCL_RETURN
3900: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
3910: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
3920: 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72  text, Tcl_GetStr
3930: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
3940: 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65  erp), -1); .  }e
3950: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  lse{.    Tcl_Obj
3960: 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74   *pVar = Tcl_Get
3970: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
3980: 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  erp);.    int n;
3990: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20  .    u8 *data;. 
39a0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d     char *zType =
39b0: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f   pVar->typePtr ?
39c0: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e   pVar->typePtr->
39d0: 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 63  name : "";.    c
39e0: 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d  har c = zType[0]
39f0: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27  ;.    if( c=='b'
3a00: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
3a10: 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30  ,"bytearray")==0
3a20: 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d   && pVar->bytes=
3a30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  =0 ){.      /* O
3a40: 6e 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f  nly return a BLO
3a50: 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63  B type if the Tc
3a60: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20  l variable is a 
3a70: 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20  bytearray and.  
3a80: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74      ** has no st
3a90: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
3aa0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61  ion. */.      da
3ab0: 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ta = Tcl_GetByte
3ac0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61  ArrayFromObj(pVa
3ad0: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71  r, &n);.      sq
3ae0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
3af0: 62 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c  b(context, data,
3b00: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
3b10: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
3b20: 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20   if( (c=='b' && 
3b30: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
3b40: 6f 6c 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20  olean")==0) ||. 
3b50: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27           (c=='i'
3b60: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
3b70: 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20  ,"int")==0) ){. 
3b80: 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46       Tcl_GetIntF
3b90: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
3ba0: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
3bb0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
3bc0: 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d  ntext, n);.    }
3bd0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20  else if( c=='d' 
3be0: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
3bf0: 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "double")==0 ){.
3c00: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a        double r;.
3c10: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
3c20: 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56  bleFromObj(0, pV
3c30: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73  ar, &r);.      s
3c40: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
3c50: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29  uble(context, r)
3c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3c70: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
3c80: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
3c90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
3ca0: 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20  l_WideInt v;.   
3cb0: 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e     Tcl_GetWideIn
3cc0: 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72  tFromObj(0, pVar
3cd0: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &v);.      sql
3ce0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
3cf0: 34 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20  4(context, v);. 
3d00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3d10: 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  data = (unsigned
3d20: 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53   char *)Tcl_GetS
3d30: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61  tringFromObj(pVa
3d40: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71  r, &n);.      sq
3d50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
3d60: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
3d70: 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49   *)data, n, SQLI
3d80: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
3d90: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
3da0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3db0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a  AUTHORIZATION./*
3dc0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
3dd0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
3de0: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70  unction.  It app
3df0: 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e 74  ends the authent
3e00: 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20  ication.** type 
3e10: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f  code and the two
3e20: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43   arguments to zC
3e30: 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65  md[] then invoke
3e40: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
3e50: 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  on the interpret
3e60: 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69  er.  The reply i
3e70: 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65  s examined to de
3e80: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a  termine if the.*
3e90: 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  * authentication
3ea0: 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65   fails or succee
3eb0: 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
3ec0: 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28  t auth_callback(
3ed0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20  .  void *pArg,. 
3ee0: 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e   int code,.  con
3ef0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a  st char *zArg1,.
3f00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
3f10: 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg2,.  const cha
3f20: 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73  r *zArg3,.  cons
3f30: 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b  t char *zArg4.){
3f40: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a  .  char *zCode;.
3f50: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
3f60: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  r;.  int rc;.  c
3f70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c  onst char *zRepl
3f80: 79 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  y;.  SqliteDb *p
3f90: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3fa0: 70 41 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28  pArg;..  switch(
3fb0: 20 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73   code ){.    cas
3fc0: 65 20 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20  e SQLITE_COPY   
3fd0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
3fe0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22  de="SQLITE_COPY"
3ff0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4000: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
4010: 49 4e 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f  INDEX      : zCo
4020: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
4030: 45 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  E_INDEX"; break;
4040: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4050: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20  _CREATE_TABLE   
4060: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4070: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22  TE_CREATE_TABLE"
4080: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4090: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
40a0: 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f  TEMP_INDEX : zCo
40b0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
40c0: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62  E_TEMP_INDEX"; b
40d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
40e0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
40f0: 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d  P_TABLE : zCode=
4100: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
4110: 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  EMP_TABLE"; brea
4120: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4130: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
4140: 52 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53  RIGGER: zCode="S
4150: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
4160: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
4170: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
4180: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
4190: 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  IEW  : zCode="SQ
41a0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
41b0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
41c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
41d0: 52 45 41 54 45 5f 54 52 49 47 47 45 52 20 20 20  REATE_TRIGGER   
41e0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
41f0: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 22  _CREATE_TRIGGER"
4200: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4210: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
4220: 56 49 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f  VIEW       : zCo
4230: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
4240: 45 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  E_VIEW"; break;.
4250: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4260: 44 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20  DELETE          
4270: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
4280: 45 5f 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b  E_DELETE"; break
4290: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
42a0: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20  E_DROP_INDEX    
42b0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
42c0: 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b  ITE_DROP_INDEX";
42d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
42e0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
42f0: 4c 45 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  LE        : zCod
4300: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
4310: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
4320: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
4330: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  OP_TEMP_INDEX   
4340: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4350: 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22  DROP_TEMP_INDEX"
4360: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4370: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
4380: 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f  MP_TABLE   : zCo
4390: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
43a0: 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  TEMP_TABLE"; bre
43b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
43c0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
43d0: 49 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53  IGGER : zCode="S
43e0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
43f0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
4400: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4410: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20  _DROP_TEMP_VIEW 
4420: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4430: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
4440: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
4450: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
4460: 54 52 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a  TRIGGER      : z
4470: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
4480: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
4490: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
44a0: 54 45 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20  TE_DROP_VIEW    
44b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
44c0: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b  LITE_DROP_VIEW";
44d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
44e0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20   SQLITE_INSERT  
44f0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4500: 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e="SQLITE_INSERT
4510: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4520: 73 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  se SQLITE_PRAGMA
4530: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
4540: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47  ode="SQLITE_PRAG
4550: 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  MA"; break;.    
4560: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
4580: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
4590: 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  AD"; break;.    
45a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45  case SQLITE_SELE
45b0: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CT            : 
45c0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45  zCode="SQLITE_SE
45d0: 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LECT"; break;.  
45e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
45f0: 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20  ANSACTION       
4600: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4610: 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72  TRANSACTION"; br
4620: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4630: 4c 49 54 45 5f 55 50 44 41 54 45 20 20 20 20 20  LITE_UPDATE     
4640: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
4650: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20  SQLITE_UPDATE"; 
4660: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4670: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20  SQLITE_ATTACH   
4680: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
4690: 3d 22 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22  ="SQLITE_ATTACH"
46a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
46b0: 65 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20  e SQLITE_DETACH 
46c0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
46d0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43  de="SQLITE_DETAC
46e0: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  H"; break;.    c
46f0: 61 73 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52  ase SQLITE_ALTER
4700: 5f 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a  _TABLE       : z
4710: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54  Code="SQLITE_ALT
4720: 45 52 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  ER_TABLE"; break
4730: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
4740: 45 5f 52 45 49 4e 44 45 58 20 20 20 20 20 20 20  E_REINDEX       
4750: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
4760: 49 54 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72  ITE_REINDEX"; br
4770: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4780: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20  LITE_ANALYZE    
4790: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
47a0: 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b  SQLITE_ANALYZE";
47b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
47c0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
47d0: 54 41 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64  TABLE     : zCod
47e0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
47f0: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
4800: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4810: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20  _DROP_VTABLE    
4820: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4830: 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b  TE_DROP_VTABLE";
4840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
4850: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
4860: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
4870: 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b  e="????"; break;
4880: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69  .  }.  Tcl_DStri
4890: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
48a0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
48b0: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75  d(&str, pDb->zAu
48c0: 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  th, -1);.  Tcl_D
48d0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
48e0: 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29  ent(&str, zCode)
48f0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
4900: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
4910: 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31  r, zArg1 ? zArg1
4920: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
4930: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
4940: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f  nt(&str, zArg2 ?
4950: 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20   zArg2 : "");.  
4960: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
4970: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
4980: 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22  Arg3 ? zArg3 : "
4990: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
49a0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
49b0: 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72  str, zArg4 ? zAr
49c0: 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d  g4 : "");.  rc =
49d0: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
49e0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
49f0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
4a00: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
4a10: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
4a20: 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65   zReply = Tcl_Ge
4a30: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
4a40: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  b->interp);.  if
4a50: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
4a60: 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20  "SQLITE_OK")==0 
4a70: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
4a80: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
4a90: 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79  f( strcmp(zReply
4aa0: 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d  ,"SQLITE_DENY")=
4ab0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
4ac0: 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65  QLITE_DENY;.  }e
4ad0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
4ae0: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47  Reply,"SQLITE_IG
4af0: 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20  NORE")==0 ){.   
4b00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e   rc = SQLITE_IGN
4b10: 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ORE;.  }else{.  
4b20: 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a    rc = 999;.  }.
4b30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
4b40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4b50: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
4b60: 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65  ON */../*.** zTe
4b70: 78 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  xt is a pointer 
4b80: 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
4b90: 20 76 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f   via an sqlite3_
4ba0: 72 65 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a  result_text().**
4bb0: 20 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65   or similar inte
4bc0: 72 66 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74  rface. This rout
4bd0: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 54 63  ine returns a Tc
4be0: 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c  l string object,
4bf0: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63   .** reference c
4c00: 6f 75 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63  ount set to 0, c
4c10: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
4c20: 78 74 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61  xt. If a transla
4c30: 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20  tion.** between 
4c40: 69 73 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d  iso8859 and UTF-
4c50: 38 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69  8 is required, i
4c60: 74 20 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a  t is preformed..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  */.static Tcl_Ob
4c80: 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63  j *dbTextToObj(c
4c90: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
4ca0: 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
4cb0: 61 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54  al;.#ifdef UTF_T
4cc0: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
4cd0: 44 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  D.  Tcl_DString 
4ce0: 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72  dCol;.  Tcl_DStr
4cf0: 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a  ingInit(&dCol);.
4d00: 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f    Tcl_ExternalTo
4d10: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c  UtfDString(NULL,
4d20: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f   zText, -1, &dCo
4d30: 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c  l);.  pVal = Tcl
4d40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
4d50: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
4d60: 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63  dCol), -1);.  Tc
4d70: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
4d80: 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56  Col);.#else.  pV
4d90: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
4da0: 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29  ngObj(zText, -1)
4db0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4dc0: 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pVal;.}../*.**
4dd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
4de0: 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65  ads a line of te
4df0: 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c  xt from FILE in,
4e00: 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74   stores.** the t
4e10: 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ext in memory ob
4e20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
4e30: 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73  oc() and returns
4e40: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
4e50: 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c   the text.  NULL
4e60: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20   is returned at 
4e70: 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20  end of file, or 
4e80: 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66  if malloc().** f
4e90: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails..**.** The 
4ea0: 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b  interface is lik
4eb0: 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74  e "readline" but
4ec0: 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   no command-line
4ed0: 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64   editing.** is d
4ee0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65  one..**.** copie
4ef0: 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66  d from shell.c f
4f00: 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f  rom '.import' co
4f10: 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20  mmand.*/.static 
4f20: 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c  char *local_getl
4f30: 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70  ine(char *zPromp
4f40: 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  t, FILE *in){.  
4f50: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69  char *zLine;.  i
4f60: 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  nt nLine;.  int 
4f70: 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20  n;.  int eol;.. 
4f80: 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20   nLine = 100;.  
4f90: 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  zLine = malloc( 
4fa0: 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a  nLine );.  if( z
4fb0: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
4fc0: 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65   0;.  n = 0;.  e
4fd0: 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ol = 0;.  while(
4fe0: 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28   !eol ){.    if(
4ff0: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
5000: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
5010: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
5020: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
5030: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
5040: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
5050: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
5060: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
5070: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
5080: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
5090: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
50a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
50b0: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
50c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
50d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
50e0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
50f0: 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  eol = 1;.      b
5100: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5110: 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20  while( zLine[n] 
5120: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ n++; }.    if
5130: 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e  ( n>0 && zLine[n
5140: 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  -1]=='\n' ){.   
5150: 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c     n--;.      zL
5160: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
5170: 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d    eol = 1;.    }
5180: 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72  .  }.  zLine = r
5190: 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e  ealloc( zLine, n
51a0: 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  +1 );.  return z
51b0: 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Line;.}../*.** T
51c0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
51d0: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
51e0: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
51f0: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
5200: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
5210: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
5220: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
5230: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
5240: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
5250: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
5260: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
5270: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
5280: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
5290: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
52a0: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
52b0: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
52c0: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
52d0: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
52e0: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
52f0: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
5300: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
5310: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
5320: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
5330: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
5340: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
5350: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
5360: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
5370: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
5380: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
5390: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
53a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
53b0: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
53c0: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
53d0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
53e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
53f0: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
5400: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5410: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
5420: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
5430: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
5440: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
5450: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
5460: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
5470: 20 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 20       "busy",    
5480: 20 20 20 20 20 20 20 20 20 20 22 63 61 63 68 65            "cache
5490: 22 2c 0a 20 20 20 20 22 63 68 61 6e 67 65 73 22  ",.    "changes"
54a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6c  ,            "cl
54b0: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
54c0: 20 20 22 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20    "collate",.   
54d0: 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64   "collation_need
54e0: 65 64 22 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68  ed",   "commit_h
54f0: 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 63 6f 6d  ook",       "com
5500: 70 6c 65 74 65 22 2c 0a 20 20 20 20 22 63 6f 70  plete",.    "cop
5510: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
5520: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
5530: 78 74 65 6e 73 69 6f 6e 22 2c 22 65 72 72 6f 72  xtension","error
5540: 63 6f 64 65 22 2c 0a 20 20 20 20 22 65 76 61 6c  code",.    "eval
5550: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5560: 20 22 65 78 69 73 74 73 22 2c 20 20 20 20 20 20   "exists",      
5570: 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22        "function"
5580: 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65  ,.    "last_inse
5590: 72 74 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c  rt_rowid",  "nul
55a0: 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20  lvalue",        
55b0: 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20   "onecolumn",.  
55c0: 20 20 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20    "profile",    
55d0: 20 20 20 20 20 20 20 20 22 70 72 6f 67 72 65 73          "progres
55e0: 73 22 2c 20 20 20 20 20 20 20 20 20 20 22 72 65  s",          "re
55f0: 6b 65 79 22 2c 0a 20 20 20 20 22 72 6f 6c 6c 62  key",.    "rollb
5600: 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20  ack_hook",      
5610: 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20  "timeout",      
5620: 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e       "total_chan
5630: 67 65 73 22 2c 0a 20 20 20 20 22 74 72 61 63 65  ges",.    "trace
5640: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5650: 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20  "transaction",  
5660: 20 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f       "update_hoo
5670: 6b 22 2c 0a 20 20 20 20 22 76 65 72 73 69 6f 6e  k",.    "version
5680: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ",            0 
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20     .  };.  enum 
56b0: 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42  DB_enum {.    DB
56c0: 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20  _AUTHORIZER,    
56d0: 20 20 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20      DB_BUSY,    
56e0: 20 20 20 20 20 20 20 20 20 44 42 5f 43 41 43 48           DB_CACH
56f0: 45 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45  E,.    DB_CHANGE
5700: 53 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  S,           DB_
5710: 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
5720: 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20    DB_COLLATE,.  
5730: 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e    DB_COLLATION_N
5740: 45 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49  EEDED,  DB_COMMI
5750: 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f  T_HOOK,      DB_
5760: 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42  COMPLETE,.    DB
5770: 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20  _COPY,          
5780: 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f      DB_ENABLE_LO
5790: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f  AD_EXTENSION,DB_
57a0: 45 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44  ERRORCODE,.    D
57b0: 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20  B_EVAL,         
57c0: 20 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20       DB_EXISTS, 
57d0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e            DB_FUN
57e0: 43 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 4c 41  CTION,.    DB_LA
57f0: 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c  ST_INSERT_ROWID,
5800: 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20   DB_NULLVALUE,  
5810: 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55        DB_ONECOLU
5820: 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 4f 46 49  MN,.    DB_PROFI
5830: 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 44 42  LE,           DB
5840: 5f 50 52 4f 47 52 45 53 53 2c 20 20 20 20 20 20  _PROGRESS,      
5850: 20 20 20 44 42 5f 52 45 4b 45 59 2c 0a 20 20 20     DB_REKEY,.   
5860: 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
5870: 4b 2c 20 20 20 20 20 44 42 5f 54 49 4d 45 4f 55  K,     DB_TIMEOU
5880: 54 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 54  T,          DB_T
5890: 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 0a 20 20  OTAL_CHANGES,.  
58a0: 20 20 44 42 5f 54 52 41 43 45 2c 20 20 20 20 20    DB_TRACE,     
58b0: 20 20 20 20 20 20 20 20 44 42 5f 54 52 41 4e 53          DB_TRANS
58c0: 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 44 42 5f  ACTION,      DB_
58d0: 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 0a 20 20 20  UPDATE_HOOK,.   
58e0: 20 44 42 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20   DB_VERSION,    
58f0: 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20 2f 2a        .  };.  /*
5900: 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72 61   don't leave tra
5910: 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20  iling commas on 
5920: 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66  DB_enum, it conf
5930: 75 73 65 73 20 74 68 65 20 41 49 58 20 78 6c 63  uses the AIX xlc
5940: 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20   compiler */..  
5950: 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20  if( objc<2 ){.  
5960: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
5970: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
5980: 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20  jv, "SUBCOMMAND 
5990: 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
59a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
59b0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
59c0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
59d0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73  p, objv[1], DB_s
59e0: 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30  trs, "option", 0
59f0: 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20 20  , &choice) ){.  
5a00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5a10: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  OR;.  }..  switc
5a20: 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d  h( (enum DB_enum
5a30: 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a  )choice ){..  /*
5a40: 20 20 20 20 24 64 62 20 61 75 74 68 6f 72 69 7a      $db authoriz
5a50: 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  er ?CALLBACK?.  
5a60: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
5a70: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
5a80: 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20 65  k to authorize e
5a90: 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69 6f  ach SQL operatio
5aa0: 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a 20  n as it is.  ** 
5ab0: 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72 67  compiled.  5 arg
5ac0: 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65 6e  uments are appen
5ad0: 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ded to the callb
5ae0: 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69 73  ack before it is
5af0: 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20  .  ** invoked:. 
5b00: 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54   **.  **   (1) T
5b10: 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  he authorization
5b20: 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49 54   type (ex: SQLIT
5b30: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 20  E_CREATE_TABLE, 
5b40: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e  SQLITE_INSERT, .
5b50: 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20 46  ..).  **   (2) F
5b60: 69 72 73 74 20 64 65 73 63 72 69 70 74 69 76 65  irst descriptive
5b70: 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20 6f   name (depends o
5b80: 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
5b90: 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33 29  type).  **   (3)
5ba0: 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70 74   Second descript
5bb0: 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20  ive name.  **   
5bc0: 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  (4) Name of the 
5bd0: 64 61 74 61 62 61 73 65 20 28 65 78 3a 20 22 6d  database (ex: "m
5be0: 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20 20  ain", "temp").  
5bf0: 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f 66  **   (5) Name of
5c00: 20 74 72 69 67 67 65 72 20 74 68 61 74 20 69 73   trigger that is
5c10: 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65 73   doing the acces
5c20: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  s.  **.  ** The 
5c30: 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20  callback should 
5c40: 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65  return on of the
5c50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e   following strin
5c60: 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20  gs: SQLITE_OK,. 
5c70: 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   ** SQLITE_IGNOR
5c80: 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e  E, or SQLITE_DEN
5c90: 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  Y.  Any other re
5ca0: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 6e  turn value is an
5cb0: 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a   error..  **.  *
5cc0: 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f 64  * If this method
5cd0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   is invoked with
5ce0: 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 74   no arguments, t
5cf0: 68 65 20 63 75 72 72 65 6e 74 20 61 75 74 68 6f  he current autho
5d00: 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61  rization.  ** ca
5d10: 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69 73  llback string is
5d20: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
5d30: 20 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f 52    case DB_AUTHOR
5d40: 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20 53  IZER: {.#ifdef S
5d50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
5d60: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c  RIZATION.    Tcl
5d70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5d80: 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a 61  terp, "authoriza
5d90: 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62  tion not availab
5da0: 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
5db0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
5dc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
5dd0: 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  se.    if( objc>
5de0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
5df0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
5e00: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
5e10: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
5e20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5e30: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
5e40: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
5e50: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
5e60: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
5e70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5e80: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68  terp, pDb->zAuth
5e90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
5ea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
5eb0: 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20  har *zAuth;.    
5ec0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
5ed0: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
5ee0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
5ef0: 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b  ree(pDb->zAuth);
5f00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
5f10: 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74  Auth = Tcl_GetSt
5f20: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
5f30: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
5f40: 20 20 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c    if( zAuth && l
5f50: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
5f60: 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c  pDb->zAuth = Tcl
5f70: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
5f80: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  );.        strcp
5f90: 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41  y(pDb->zAuth, zA
5fa0: 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  uth);.      }els
5fb0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
5fc0: 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  zAuth = 0;.     
5fd0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
5fe0: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
5ff0: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
6000: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
6010: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
6020: 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c  horizer(pDb->db,
6030: 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20   auth_callback, 
6040: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
6050: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
6060: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
6070: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
6080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6090: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
60a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
60b0: 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43  db busy ?CALLBAC
60c0: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
60d0: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
60e0: 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c  llback if an SQL
60f0: 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d   statement attem
6100: 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  pts to open.  **
6110: 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61   a locked databa
6120: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
6130: 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a  case DB_BUSY: {.
6140: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
6150: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
6160: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6170: 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42   2, objv, "CALLB
6180: 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
6190: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
61a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
61b0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
61c0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
61d0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
61e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
61f0: 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b   pDb->zBusy, 0);
6200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6210: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
6220: 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74  zBusy;.      int
6230: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
6240: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
6250: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
6260: 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20  Db->zBusy);.    
6270: 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20    }.      zBusy 
6280: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6290: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
62a0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
62b0: 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20   zBusy && len>0 
62c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
62d0: 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zBusy = Tcl_Allo
62e0: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
62f0: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
6300: 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 29 3b  ->zBusy, zBusy);
6310: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6320: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
6330: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6340: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
6350: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  sy ){.        pD
6360: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
6370: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
6380: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
6390: 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79  (pDb->db, DbBusy
63a0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
63b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
63c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
63d0: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
63e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
63f0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6400: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
6410: 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a  $db cache flush.
6420: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63    **     $db cac
6430: 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20  he size n.  **. 
6440: 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72   ** Flush the pr
6450: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6460: 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74   cache, or set t
6470: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
6480: 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64  r of.  ** cached
6490: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
64a0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48  /.  case DB_CACH
64b0: 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  E: {.    char *s
64c0: 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e  ubCmd;.    int n
64d0: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  ;..    if( objc<
64e0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
64f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
6500: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
6510: 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67  ache option ?arg
6520: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
6530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6540: 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20   }.    subCmd = 
6550: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6560: 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30  mObj( objv[2], 0
6570: 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62   );.    if( *sub
6580: 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63  Cmd=='f' && strc
6590: 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68  mp(subCmd,"flush
65a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
65b0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
65c0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
65d0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
65e0: 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29  , objv, "flush")
65f0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6600: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6620: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
6630: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a   pDb );.      }.
6640: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73      }else if( *s
6650: 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74  ubCmd=='s' && st
6660: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a  rcmp(subCmd,"siz
6670: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
6680: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
6690: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
66a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
66b0: 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e  2, objv, "size n
66c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
66d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
66e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
66f0: 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52     if( TCL_ERROR
6700: 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ==Tcl_GetIntFrom
6710: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
6720: 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  [3], &n) ){.    
6730: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
6740: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
6750: 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20  "cannot convert 
6760: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
6770: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
6780: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
6790: 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74  ],0), "\" to int
67a0: 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20  eger", 0);.     
67b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
67c0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
67d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
67e0: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20  if( n<0 ){.     
67f0: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
6800: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
6810: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b            n = 0;
6820: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6830: 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41   if( n>MAX_PREPA
6840: 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20  RED_STMTS ){.   
6850: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58           n = MAX
6860: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b  _PREPARED_STMTS;
6870: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6880: 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53         pDb->maxS
6890: 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  tmt = n;.       
68a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
68b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
68c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
68d0: 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f  terp, "bad optio
68e0: 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  n \"", .        
68f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
6900: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 30  romObj(objv[0],0
6910: 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20  ), "\": must be 
6920: 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 20  flush or size", 
6930: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
6940: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6950: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
6960: 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
6970: 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  hanges.  **.  **
6980: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
6990: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
69a0: 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  were modified, i
69b0: 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65  nserted, or dele
69c0: 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  ted by.  ** the 
69d0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45  most recent INSE
69e0: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
69f0: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
6a00: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20  not including . 
6a10: 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20   ** any changes 
6a20: 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72 20  made by trigger 
6a30: 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20  programs..  */. 
6a40: 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53   case DB_CHANGES
6a50: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
6a60: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66  *pResult;.    if
6a70: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
6a80: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
6a90: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
6aa0: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
6ab0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6ac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73  ;.    }.    pRes
6ad0: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
6ae0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
6af0: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
6b00: 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74  j(pResult, sqlit
6b10: 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  e3_changes(pDb->
6b20: 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
6b30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
6b40: 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a  b close.  **.  *
6b50: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64  * Shutdown the d
6b60: 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
6b70: 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a  ase DB_CLOSE: {.
6b80: 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f      Tcl_DeleteCo
6b90: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63  mmand(interp, Tc
6ba0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
6bb0: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b  bj(objv[0], 0));
6bc0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6bd0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
6be0: 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20  db collate NAME 
6bf0: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
6c00: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
6c10: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
6c20: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
6c30: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
6c40: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
6c50: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
6c60: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
6c70: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
6c80: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
6c90: 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20  _COLLATE: {.    
6ca0: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c  SqlCollate *pCol
6cb0: 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  late;.    char *
6cc0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  zName;.    char 
6cd0: 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e  *zScript;.    in
6ce0: 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69  t nScript;.    i
6cf0: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
6d00: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
6d10: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
6d20: 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49  objv, "NAME SCRI
6d30: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
6d40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6d50: 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
6d60: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6d70: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
6d80: 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20  ;.    zScript = 
6d90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6da0: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e  mObj(objv[3], &n
6db0: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f  Script);.    pCo
6dc0: 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c  llate = (SqlColl
6dd0: 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  ate*)Tcl_Alloc( 
6de0: 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65  sizeof(*pCollate
6df0: 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20  ) + nScript + 1 
6e00: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
6e10: 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ate==0 ) return 
6e20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70  TCL_ERROR;.    p
6e30: 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20  Collate->interp 
6e40: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43  = interp;.    pC
6e50: 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20  ollate->pNext = 
6e60: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20  pDb->pCollate;. 
6e70: 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63     pCollate->zSc
6e80: 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70  ript = (char*)&p
6e90: 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20  Collate[1];.    
6ea0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20  pDb->pCollate = 
6eb0: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 73 74  pCollate;.    st
6ec0: 72 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a  rcpy(pCollate->z
6ed0: 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 29  Script, zScript)
6ee0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
6ef0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
6f00: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
6f10: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  e, SQLITE_UTF8, 
6f20: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74  .        pCollat
6f30: 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65  e, tclSqlCollate
6f40: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ) ){.      Tcl_S
6f50: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
6f60: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
6f70: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
6f80: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
6f90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
6fa0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6fb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6fc0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
6fd0: 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65   collation_neede
6fe0: 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  d SCRIPT.  **.  
6ff0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
7000: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
7010: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
7020: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
7030: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
7040: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
7050: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
7060: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
7070: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
7080: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
7090: 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  DED: {.    if( o
70a0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
70b0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
70c0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
70d0: 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20  , "SCRIPT");.   
70e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
70f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
7100: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
7110: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20  Needed ){.      
7120: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
7130: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
7140: 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eded);.    }.   
7150: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
7160: 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  eded = Tcl_Dupli
7170: 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29  cateObj(objv[2])
7180: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
7190: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
71a0: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
71b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
71c0: 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64  on_needed(pDb->d
71d0: 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61  b, pDb, tclColla
71e0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62  teNeeded);.    b
71f0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
7200: 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f     $db commit_ho
7210: 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ok ?CALLBACK?.  
7220: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
7230: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
7240: 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f  k just before co
7250: 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20 53  mmitting every S
7260: 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  QL transaction..
7270: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
7280: 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65  back throws an e
7290: 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75  xception or retu
72a0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
72b0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  en the.  ** tran
72c0: 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74  saction is abort
72d0: 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b  ed.  If CALLBACK
72e0: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
72f0: 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ing, the callbac
7300: 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  k.  ** is disabl
7310: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
7320: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20  DB_COMMIT_HOOK: 
7330: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
7340: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
7350: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
7360: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
7370: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
7380: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7390: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
73a0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
73b0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
73c0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
73d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
73e0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
73f0: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  mit, 0);.      }
7400: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7410: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
7420: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
7430: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
7440: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
7450: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
7460: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  zCommit);.      
7470: 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20  }.      zCommit 
7480: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
7490: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
74a0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
74b0: 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e   zCommit && len>
74c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
74d0: 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f  ->zCommit = Tcl_
74e0: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
74f0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
7500: 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a  (pDb->zCommit, z
7510: 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  Commit);.      }
7520: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
7530: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a  b->zCommit = 0;.
7540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7550: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
7560: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
7570: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
7580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7590: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
75a0: 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e  >db, DbCommitHan
75b0: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
75c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
75d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
75e0: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c  hook(pDb->db, 0,
75f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
7600: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
7610: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
7620: 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a  omplete SQL.  **
7630: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  .  ** Return TRU
7640: 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f  E if SQL is a co
7650: 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
7660: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41  ment.  Return FA
7670: 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69  LSE if.  ** addi
7680: 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20  tional lines of 
7690: 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65 64  input are needed
76a0: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
76b0: 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62  ar to the.  ** b
76c0: 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f  uilt-in "info co
76d0: 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20  mplete" command 
76e0: 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63  of Tcl..  */.  c
76f0: 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a  ase DB_COMPLETE:
7700: 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
7710: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a  E_OMIT_COMPLETE.
7720: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
7730: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  sult;.    int is
7740: 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66  Complete;.    if
7750: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
7760: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
7770: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
7780: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
7790: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
77a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
77b0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69  sComplete = sqli
77c0: 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63  te3_complete( Tc
77d0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
77e0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29  bj(objv[2], 0) )
77f0: 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  ;.    pResult = 
7800: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
7810: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
7820: 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_SetBooleanObj(
7830: 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c  pResult, isCompl
7840: 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ete);.#endif.   
7850: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
7860: 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20 63 6f  *    $db copy co
7870: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
7880: 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20   table filename 
7890: 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c  ?SEPARATOR? ?NUL
78a0: 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a  LINDICATOR?.  **
78b0: 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  .  ** Copy data 
78c0: 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20  into table from 
78d0: 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e  filename, option
78e0: 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41 52  ally using SEPAR
78f0: 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c  ATOR.  ** as col
7900: 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e 20  umn separators. 
7910: 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e   If a column con
7920: 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72  tains a null str
7930: 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a  ing, or the.  **
7940: 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e   value of NULLIN
7950: 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20  DICATOR, a NULL 
7960: 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20  is inserted for 
7970: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  the column..  **
7980: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
7990: 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  thm is one of th
79a0: 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63  e sqlite conflic
79b0: 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20  t algorithms:.  
79c0: 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20  **    rollback, 
79d0: 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
79e0: 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a  ore, replace.  *
79f0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
7a00: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
7a10: 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
7a20: 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  ed, not necessar
7a30: 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73  ily same.  ** as
7a40: 20 27 64 62 20 63 68 61 6e 67 65 73 27 20 64 75   'db changes' du
7a50: 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  e to conflict-al
7a60: 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65 64  gorithm selected
7a70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
7a80: 20 63 6f 64 65 20 69 73 20 62 61 73 69 63 61 6c   code is basical
7a90: 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ly an implementa
7aa0: 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74  tion/enhancement
7ab0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
7ac0: 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69  ite3 shell.c ".i
7ad0: 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a  mport" command..
7ae0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
7af0: 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73 20  ommand usage is 
7b00: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
7b10: 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50 59  e sqlite2.x COPY
7b20: 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a   statement,.  **
7b30: 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20 66   which imports f
7b40: 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61 20  ile data into a 
7b50: 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  table using the 
7b60: 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59 20  PostgreSQL COPY 
7b70: 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  file format:.  *
7b80: 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24 63 6f  *   $db copy $co
7b90: 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c  nflit_algo $tabl
7ba0: 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65  e_name $filename
7bb0: 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63   \t \\N.  */.  c
7bc0: 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20  ase DB_COPY: {. 
7bd0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b     char *zTable;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7bf0: 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
7c00: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
7c10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  .    char *zFile
7c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c30: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
7c40: 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61  m which to extra
7c50: 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 63  ct data */.    c
7c60: 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20  har *zConflict; 
7c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7c80: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
7c90: 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ithm to use */. 
7ca0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
7cb0: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f  *pStmt;        /
7cc0: 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
7cd0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cf0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
7d00: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7d30: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
7d40: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
7d50: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
7d60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7d70: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
7d80: 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
7d90: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7db0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
7dc0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7df0: 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20  bytes in zSep[] 
7e00: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c  */.    int nNull
7e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7e30: 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d  bytes in zNull[]
7e40: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
7e50: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
7e60: 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
7e70: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63  atement */.    c
7e80: 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20  har *zLine;     
7e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
7ea0: 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69  single line of i
7eb0: 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69  nput from the fi
7ec0: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
7ed0: 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  *azCol;         
7ee0: 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d        /* zLine[]
7ef0: 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20   broken up into 
7f00: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63  columns */.    c
7f10: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
7f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
7f30: 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e  w to commit chan
7f40: 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20  ges */.    FILE 
7f50: 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  *in;            
7f60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
7f70: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
7f80: 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20  int lineno = 0; 
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7fa0: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  ine number of in
7fb0: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
7fc0: 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30  char zLineNum[80
7fd0: 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ];          /* L
7fe0: 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74  ine number print
7ff0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54   buffer */.    T
8000: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
8010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
8020: 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  terp result */..
8030: 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a      char *zSep;.
8040: 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b      char *zNull;
8050: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20  .    if( objc<5 
8060: 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20  || objc>7 ){.   
8070: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
8080: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
8090: 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20 22  bjv, .         "
80a0: 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54  CONFLICT-ALGORIT
80b0: 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d  HM TABLE FILENAM
80c0: 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  E ?SEPARATOR? ?N
80d0: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b  ULLINDICATOR?");
80e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
80f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8100: 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29     if( objc>=6 )
8110: 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 54  {.      zSep = T
8120: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8130: 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b  Obj(objv[5], 0);
8140: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8150: 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20    zSep = "\t";. 
8160: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
8170: 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e  c>=7 ){.      zN
8180: 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ull = Tcl_GetStr
8190: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
81a0: 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  6], 0);.    }els
81b0: 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d  e{.      zNull =
81c0: 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   "";.    }.    z
81d0: 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47  Conflict = 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 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
8200: 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
8210: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
8220: 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[3], 0);.    
8230: 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
8240: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8250: 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53  v[4], 0);.    nS
8260: 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65 70  ep = strlen(zSep
8270: 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73  );.    nNull = s
8280: 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20 20  trlen(zNull);.  
8290: 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
82a0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
82b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
82c0: 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
82d0: 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
82e0: 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 20 30  red for copy", 0
82f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8300: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8310: 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65 33 53  .    if(sqlite3S
8320: 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  trICmp(zConflict
8330: 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d  , "rollback") !=
8340: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c   0 &&.       sql
8350: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e  ite3StrICmp(zCon
8360: 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20  flict, "abort"  
8370: 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
8380: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
8390: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69  (zConflict, "fai
83a0: 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a  l"    ) != 0 &&.
83b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
83c0: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
83d0: 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20   "ignore"  ) != 
83e0: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
83f0: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
8400: 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20  lict, "replace" 
8410: 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20  ) != 0 ) {.     
8420: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8430: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8440: 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74  : \"", zConflict
8450: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
8460: 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67  \", conflict-alg
8470: 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f  orithm must be o
8480: 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c  ne of: rollback,
8490: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
84a0: 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
84b0: 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22  ore, or replace"
84c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
84d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
84e0: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
84f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
8500: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25  SELECT * FROM '%
8510: 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  q'", zTable);.  
8520: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
8530: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
8540: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8550: 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20  "Error: no such 
8560: 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65  table: ", zTable
8570: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
8580: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8590: 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
85a0: 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20  strlen(zSql);.  
85b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
85c0: 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20  repare(pDb->db, 
85d0: 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74 2c  zSql, 0, &pStmt,
85e0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
85f0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
8600: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
8610: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8620: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
8630: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
8640: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
8650: 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30  ;.      nCol = 0
8660: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8670: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
8680: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
8690: 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Stmt);.    }.   
86a0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
86b0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
86c0: 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20  ( nCol==0 ) {.  
86d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
86e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
86f0: 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  zSql = malloc( n
8700: 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c  Byte + 50 + nCol
8710: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
8720: 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ql==0 ) {.      
8730: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8740: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
8750: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
8760: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
8770: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8780: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
8790: 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35  snprintf(nByte+5
87a0: 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
87b0: 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27   OR %q INTO '%q'
87c0: 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20   VALUES(?",.    
87d0: 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20       zConflict, 
87e0: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
87f0: 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20   strlen(zSql);. 
8800: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43     for(i=1; i<nC
8810: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
8820: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b  zSql[j++] = ',';
8830: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
8840: 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20   = '?';.    }.  
8850: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29    zSql[j++] = ')
8860: 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d  ';.    zSql[j] =
8870: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
8880: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
8890: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 26  ->db, zSql, 0, &
88a0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66  pStmt, 0);.    f
88b0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
88c0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
88d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
88e0: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
88f0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
8900: 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
8910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
8920: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
8930: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8940: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8950: 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c   in = fopen(zFil
8960: 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66  e, "rb");.    if
8970: 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( in==0 ){.     
8980: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8990: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
89a0: 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69  : cannot open fi
89b0: 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55  le: ", zFile, NU
89c0: 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
89d0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
89e0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
89f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8a00: 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
8a10: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
8a20: 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
8a30: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
8a40: 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
8a50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8a60: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
8a70: 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
8a80: 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65  0);.      fclose
8a90: 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (in);.      retu
8aa0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8ab0: 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71    }.    (void)sq
8ac0: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
8ad0: 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  db, "BEGIN", 0, 
8ae0: 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d  0, 0);.    zComm
8af0: 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20  it = "COMMIT";. 
8b00: 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65     while( (zLine
8b10: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
8b20: 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20  (0, in))!=0 ){. 
8b30: 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20       char *z;.  
8b40: 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20      i = 0;.     
8b50: 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
8b60: 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e   azCol[0] = zLin
8b70: 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
8b80: 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a  , z=zLine; *z; z
8b90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
8ba0: 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20   *z==zSep[0] && 
8bb0: 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c  strncmp(z, zSep,
8bc0: 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20   nSep)==0 ){.   
8bd0: 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20         *z = 0;. 
8be0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
8bf0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43          if( i<nC
8c00: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
8c10: 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b    azCol[i] = &z[
8c20: 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20  nSep];.         
8c30: 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a     z += nSep-1;.
8c40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8c60: 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f      if( i+1!=nCo
8c70: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  l ){.        cha
8c80: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20  r *zErr;.       
8c90: 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 32   zErr = malloc(2
8ca0: 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a 46 69 6c  00 + strlen(zFil
8cb0: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e));.        if(
8cc0: 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20   zErr ){.       
8cd0: 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72 2c     sprintf(zErr,
8ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45  .             "E
8cf0: 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64  rror: %s line %d
8d00: 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f  : expected %d co
8d10: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75  lumns of data bu
8d20: 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20  t found %d",.   
8d30: 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 2c            zFile,
8d40: 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69   lineno, nCol, i
8d50: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  +1);.          T
8d60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8d70: 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29  interp, zErr, 0)
8d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
8d90: 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (zErr);.        
8da0: 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69  }.        zCommi
8db0: 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a  t = "ROLLBACK";.
8dc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
8de0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
8df0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  +){.        /* c
8e00: 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61  heck for null da
8e10: 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20  ta, if so, bind 
8e20: 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  as null */.     
8e30: 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e 30 20     if ((nNull>0 
8e40: 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b  && strcmp(azCol[
8e50: 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20 7c  i], zNull)==0) |
8e60: 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69  | strlen(azCol[i
8e70: 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20 20  ])==0) {.       
8e80: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
8e90: 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29  null(pStmt, i+1)
8ea0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8eb0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8ec0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
8ed0: 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69  mt, i+1, azCol[i
8ee0: 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ], -1, SQLITE_ST
8ef0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d  ATIC);.        }
8f00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8f10: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
8f20: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
8f30: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
8f40: 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  mt);.      free(
8f50: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  zLine);.      if
8f60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8f70: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
8f80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8f90: 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  rp,"Error: ", sq
8fa0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8fb0: 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
8fc0: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f     zCommit = "RO
8fd0: 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20  LLBACK";.       
8fe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8ff0: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61      }.    free(a
9000: 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73  zCol);.    fclos
9010: 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(in);.    sqlit
9020: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
9030: 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  t);.    (void)sq
9040: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
9050: 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20  db, zCommit, 0, 
9060: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20  0, 0);..    if( 
9070: 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43  zCommit[0] == 'C
9080: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75  ' ){.      /* su
9090: 63 63 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c  ccess, set resul
90a0: 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c  t as number of l
90b0: 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a  ines processed *
90c0: 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20  /.      pResult 
90d0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
90e0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
90f0: 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
9100: 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29  pResult, lineno)
9110: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
9120: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
9130: 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65        /* failure
9140: 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20  , append lineno 
9150: 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a  where failed */.
9160: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c        sprintf(zL
9170: 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65  ineNum,"%d",line
9180: 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  no);.      Tcl_A
9190: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
91a0: 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69  rp,", failed whi
91b0: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69  le processing li
91c0: 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30  ne: ",zLineNum,0
91d0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
91e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
91f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
9200: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
9210: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
9220: 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20  nsion BOOLEAN.  
9230: 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65  **.  ** Turn the
9240: 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69   extension loadi
9250: 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72  ng feature on or
9260: 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66   off.  It if off
9270: 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74   by.  ** default
9280: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
9290: 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
92a0: 45 4e 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e  ENSION: {.    in
92b0: 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28  t onoff;.    if(
92c0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
92d0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
92e0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
92f0: 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a  jv, "BOOLEAN");.
9300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9310: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9320: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
9330: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
9340: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e  rp, objv[2], &on
9350: 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  off) ){.      re
9360: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9370: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9380: 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
9390: 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  tension(pDb->db,
93a0: 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65   onoff);.    bre
93b0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
93c0: 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63  **    $db errorc
93d0: 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ode.  **.  ** Re
93e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63  turn the numeric
93f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
9400: 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79   was returned by
9410: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9420: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
9430: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20  lite3_exec()..  
9440: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52  */.  case DB_ERR
9450: 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63  ORCODE: {.    Tc
9460: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
9470: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
9480: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  tObj(sqlite3_err
9490: 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b  code(pDb->db)));
94a0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
94b0: 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20     .  /*.  **   
94c0: 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f   $db eval $sql ?
94d0: 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f  array? ?{  ...co
94e0: 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20  de... }?.  **   
94f0: 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24   $db onecolumn $
9500: 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  sql.  **.  ** Th
9510: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
9520: 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75  in $sql is evalu
9530: 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20  ated.  For each 
9540: 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20  row, the values 
9550: 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20  are.  ** placed 
9560: 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  in elements of t
9570: 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22  he array named "
9580: 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f  array" and ...co
9590: 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65  de... is execute
95a0: 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
95b0: 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72  y" and "code" ar
95c0: 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  e omitted, then 
95d0: 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65  no callback is e
95e0: 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20  very invoked..  
95f0: 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73  ** If "array" is
9600: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
9610: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
9620: 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20  s are placed in 
9630: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74  variables.  ** t
9640: 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  hat have the sam
9650: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69  e name as the fi
9660: 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62  elds extracted b
9670: 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  y the query..  *
9680: 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f  *.  ** The oneco
9690: 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74  lumn method is t
96a0: 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  he equivalent of
96b0: 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65  :.  **     linde
96c0: 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c  x [$db eval $sql
96d0: 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ] 0.  */.  case 
96e0: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20  DB_ONECOLUMN:.  
96f0: 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20  case DB_EVAL:.  
9700: 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20  case DB_EXISTS: 
9710: 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
9720: 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20   *zSql;      /* 
9730: 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  Next SQL stateme
9740: 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f  nt to execute */
9750: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
9760: 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57  *zLeft;     /* W
9770: 68 61 74 20 69 73 20 6c 65 66 74 20 61 66 74 65  hat is left afte
9780: 72 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20  r first stmt in 
9790: 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69  zSql */.    sqli
97a0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
97b0: 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53     /* Compiled S
97c0: 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20  QL statment */. 
97d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72     Tcl_Obj *pArr
97e0: 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ay;       /* Nam
97f0: 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20  e of array into 
9800: 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61 72  which results ar
9810: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
9820: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
9830: 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70  t;      /* Scrip
9840: 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63  t to run for eac
9850: 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  h result set */.
9860: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70      Tcl_Obj **ap
9870: 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61  Parm;      /* Pa
9880: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65  rameters that ne
9890: 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66  ed a Tcl_DecrRef
98a0: 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69  Count() */.    i
98b0: 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20  nt nParm;       
98c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
98d0: 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65 64 20  of entries used 
98e0: 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20  in apParm[] */. 
98f0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72     Tcl_Obj *aPar
9900: 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61  m[10];    /* Sta
9910: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 70  tic space for ap
9920: 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f  Parm[] in the co
9930: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
9940: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20   Tcl_Obj *pRet; 
9950: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
9960: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
9970: 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72  */.    SqlPrepar
9980: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
9990: 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ;  /* Pointer to
99a0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
99b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
99c0: 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63   rc2;..    if( c
99d0: 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29  hoice==DB_EVAL )
99e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
99f0: 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a  <3 || objc>5 ){.
9a00: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
9a10: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9a20: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f   2, objv, "SQL ?
9a30: 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52  ARRAY-NAME? ?SCR
9a40: 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20  IPT?");.        
9a50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9a60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9a70: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
9a80: 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  j();.      Tcl_I
9a90: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
9aa0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9ab0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
9ac0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
9ad0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
9ae0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
9af0: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  L");.        ret
9b00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9b10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9b20: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53   choice==DB_EXIS
9b30: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  TS ){.        pR
9b40: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  et = Tcl_NewBool
9b50: 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20  eanObj(0);.     
9b60: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
9b70: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
9b80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9b90: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
9ba0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9bb0: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
9bc0: 20 70 41 72 72 61 79 20 3d 20 70 53 63 72 69 70   pArray = pScrip
9bd0: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
9be0: 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
9bf0: 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 30        pArray = 0
9c00: 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  ;.      pScript 
9c10: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d  = objv[3];.    }
9c20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72  else{.      pArr
9c30: 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  ay = objv[3];.  
9c40: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53      if( Tcl_GetS
9c50: 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d  tring(pArray)[0]
9c60: 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d 20 30  ==0 ) pArray = 0
9c70: 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  ;.      pScript 
9c80: 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d  = objv[4];.    }
9c90: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
9ca0: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b  fCount(objv[2]);
9cb0: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  .    zSql = Tcl_
9cc0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9cd0: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
9ce0: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c    while( rc==TCL
9cf0: 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29  _OK && zSql[0] )
9d00: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9d30: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
9d40: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
9d50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9d60: 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74   of bind paramet
9d70: 65 72 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74  ers in the pStmt
9d80: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   */.      int nC
9d90: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
9da0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9db0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9dc0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
9dd0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61       Tcl_Obj **a
9de0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20  pColName = 0;   
9df0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
9e00: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  mn names */.    
9e10: 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20    int len;      
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e30: 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66  String length of
9e40: 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20   zSql */.  .    
9e50: 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
9e60: 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74   a SQL statement
9e70: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
9e80: 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  y been compiled 
9e90: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69  and.      ** whi
9ea0: 63 68 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ch matches the n
9eb0: 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ext sequence of 
9ec0: 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  SQL..      */.  
9ed0: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
9ee0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20       pPreStmt = 
9ef0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
9f00: 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
9f10: 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69  n(zSql);.      i
9f20: 66 28 20 70 50 72 65 53 74 6d 74 20 26 26 20 73  f( pPreStmt && s
9f30: 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70  qlite3_expired(p
9f40: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 20  PreStmt->pStmt) 
9f50: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  ){.        flush
9f60: 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a  StmtCache(pDb);.
9f70: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
9f80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
9f90: 20 20 20 20 66 6f 72 28 3b 20 70 50 72 65 53 74      for(; pPreSt
9fa0: 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72  mt; pPreStmt=pPr
9fb0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  eStmt->pNext){. 
9fc0: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70         int n = p
9fd0: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20  PreStmt->nSql;. 
9fe0: 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 3d         if( len>=
9ff0: 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  n .            &
a000: 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d  & memcmp(pPreStm
a010: 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e  t->zSql, zSql, n
a020: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
a030: 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20   && (zSql[n]==0 
a040: 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b  || zSql[n-1]==';
a050: 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ').        ){.  
a060: 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20          pStmt = 
a070: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b  pPreStmt->pStmt;
a080: 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65 66 74  .          zLeft
a090: 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d   = &zSql[pPreStm
a0a0: 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20  t->nSql];..     
a0b0: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70       /* When a p
a0c0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a0d0: 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69  t is found, unli
a0e0: 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20  nk it from the. 
a0f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68           ** cach
a100: 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  e list.  It will
a110: 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20   later be added 
a120: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
a130: 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  nning.          
a140: 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ** of the cache 
a150: 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  list in order to
a160: 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72   implement LRU r
a170: 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20  eplacement..    
a180: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a190: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
a1a0: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
a1b0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
a1c0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
a1d0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
a1e0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
a1f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62  .            pDb
a200: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
a210: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
a220: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a230: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
a240: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
a250: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
a260: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
a270: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b  pPreStmt->pPrev;
a280: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
a290: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
a2a0: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50  b->stmtLast = pP
a2b0: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20  reStmt->pPrev;. 
a2c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a2d0: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d       pDb->nStmt-
a2e0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  -;.          bre
a2f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
a300: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
a310: 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64  * If no prepared
a320: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66   statement was f
a330: 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20 74  ound.  Compile t
a340: 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20 20 20  he SQL text.    
a350: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
a360: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
a370: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
a380: 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  !=sqlite3_prepar
a390: 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
a3a0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c   -1, &pStmt, &zL
a3b0: 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eft) ){.        
a3c0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
a3d0: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
a3e0: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  tToObj(sqlite3_e
a3f0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29  rrmsg(pDb->db)))
a400: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
a410: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a420: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a440: 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  f( pStmt==0 ){. 
a450: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c           if( SQL
a460: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
a470: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
a480: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a490: 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  /* A compile-tim
a4a0: 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73  e error in the s
a4b0: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20  tatement.       
a4c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a4d0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
a4e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54  sult(interp, dbT
a4f0: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
a500: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
a510: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
a520: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
a530: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a540: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
a550: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
a560: 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  /* The statement
a570: 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43   was a no-op.  C
a580: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e  ontinue to the n
a590: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ext statement.  
a5a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
a5b0: 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a  the SQL string..
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
a5d0: 20 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20             zSql 
a5e0: 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  = zLeft;.       
a5f0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a600: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a610: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
a620: 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d 30  ert( pPreStmt==0
a630: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
a640: 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65     /* Bind value
a650: 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20  s to parameters 
a660: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
a670: 24 20 6f 72 20 3a 0a 20 20 20 20 20 20 2a 2f 20  $ or :.      */ 
a680: 20 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73   .      nVar = s
a690: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
a6a0: 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d  meter_count(pStm
a6b0: 74 29 3b 0a 20 20 20 20 20 20 6e 50 61 72 6d 20  t);.      nParm 
a6c0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  = 0;.      if( n
a6d0: 56 61 72 3e 73 69 7a 65 6f 66 28 61 50 61 72 6d  Var>sizeof(aParm
a6e0: 29 2f 73 69 7a 65 6f 66 28 61 50 61 72 6d 5b 30  )/sizeof(aParm[0
a6f0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  ]) ){.        ap
a700: 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a  Parm = (Tcl_Obj*
a710: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61 72  *)Tcl_Alloc(nVar
a720: 2a 73 69 7a 65 6f 66 28 61 70 50 61 72 6d 5b 30  *sizeof(apParm[0
a730: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
a740: 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d  {.        apParm
a750: 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20 20 20 20   = aParm;.      
a760: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  }.      for(i=1;
a770: 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a   i<=nVar; i++){.
a780: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a790: 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74  ar *zVar = sqlit
a7a0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
a7b0: 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  r_name(pStmt, i)
a7c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 56  ;.        if( zV
a7d0: 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30  ar!=0 && (zVar[0
a7e0: 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30  ]=='$' || zVar[0
a7f0: 5d 3d 3d 27 3a 27 29 20 29 7b 0a 20 20 20 20 20  ]==':') ){.     
a800: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
a810: 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32  ar = Tcl_GetVar2
a820: 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72  Ex(interp, &zVar
a830: 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  [1], 0, 0);.    
a840: 20 20 20 20 20 20 69 66 28 20 70 56 61 72 20 29        if( pVar )
a850: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
a860: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t n;.           
a870: 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20   u8 *data;.     
a880: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 79         char *zTy
a890: 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65 50  pe = pVar->typeP
a8a0: 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50  tr ? pVar->typeP
a8b0: 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20  tr->name : "";. 
a8c0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
a8d0: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
a8e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
a8f0: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
a900: 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22  Type,"bytearray"
a910: 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79  )==0 && pVar->by
a920: 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tes==0 ){.      
a930: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
a940: 6c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65  load a BLOB type
a950: 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69   if the Tcl vari
a960: 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72  able is a bytear
a970: 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ray and.        
a980: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20        ** has no 
a990: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
a9a0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
a9b0: 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54          data = T
a9c0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
a9d0: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
a9e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a9f0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
aa00: 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61  b(pStmt, i, data
aa10: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
aa20: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
aa30: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
aa40: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
aa50: 20 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b           apParm[
aa60: 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b  nParm++] = pVar;
aa70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
aa80: 73 65 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26  se if( (c=='b' &
aa90: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
aaa0: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29 20 7c 7c  boolean")==0) ||
aab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aac0: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
aad0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
aae0: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
aaf0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e         Tcl_GetIn
ab00: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
ab10: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
ab20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ab30: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
ab40: 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , i, n);.       
ab50: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
ab60: 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28  =='d' && strcmp(
ab70: 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d  zType,"double")=
ab80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ab90: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
abb0: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
abc0: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26  (interp, pVar, &
abd0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
abe0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
abf0: 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20  ouble(pStmt, i, 
ac00: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
ac10: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 77 27  }else if( c=='w'
ac20: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
ac30: 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 20 29  ,"wideInt")==0 )
ac40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ac50: 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20  Tcl_WideInt v;. 
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
ac70: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
ac80: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
ac90: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
aca0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
acb0: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c  _int64(pStmt, i,
acc0: 20 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   v);.           
acd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ace0: 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e        data = (un
acf0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63  signed char *)Tc
ad00: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
ad10: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ad30: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
ad40: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
ad50: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
ad60: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
ad70: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
ad80: 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20  efCount(pVar);. 
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50               apP
ada0: 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70  arm[nParm++] = p
adb0: 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Var;.           
adc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
add0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
ade0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
adf0: 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a 20  l( pStmt, i );. 
ae00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ae10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
ae20: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63      /* Compute c
ae30: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
ae40: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
ae50: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
ae60: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
ae70: 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20  f( pScript ){.  
ae80: 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20        apColName 
ae90: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c  = (Tcl_Obj**)Tcl
aea0: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  _Alloc( sizeof(T
aeb0: 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b  cl_Obj*)*nCol );
aec0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 43  .        if( apC
aed0: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61  olName==0 ) brea
aee0: 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  k;.        for(i
aef0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
af00: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 6f  {.          apCo
af10: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78  lName[i] = dbTex
af20: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  tToObj(sqlite3_c
af30: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
af40: 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,i));.          
af50: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
af60: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
af70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
af80: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  }..      /* If r
af90: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
afa0: 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72   stored in an ar
afb0: 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68  ray variable, th
afc0: 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 20 20  en create.      
afd0: 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20  ** the array(*) 
afe0: 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61  entry for that a
aff0: 72 72 61 79 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rray.      */.  
b000: 20 20 20 20 69 66 28 20 70 41 72 72 61 79 20 29      if( pArray )
b010: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  {.        Tcl_Ob
b020: 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63  j *pColList = Tc
b030: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
b040: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74      Tcl_Obj *pSt
b050: 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  ar = Tcl_NewStri
b060: 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a  ngObj("*", -1);.
b070: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
b080: 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73  RefCount(pColLis
b090: 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t);.        for(
b0a0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
b0b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
b0c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b0d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43  ement(interp, pC
b0e0: 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d  olList, apColNam
b0f0: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  e[i]);.        }
b100: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
b110: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
b120: 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70  pArray, pStar, p
b130: 43 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20  ColList,0);.    
b140: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
b150: 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a  ount(pColList);.
b160: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
b170: 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b  RefCount(pStar);
b180: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
b190: 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 53  /* Execute the S
b1a0: 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  QL.      */.    
b1b0: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c    while( rc==TCL
b1c0: 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20 26 26 20  _OK && pStmt && 
b1d0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
b1e0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
b1f0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
b200: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
b210: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
b220: 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  Obj *pVal;.     
b230: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
b240: 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63  /* Set pVal to c
b250: 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20  ontain the i'th 
b260: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72  column of this r
b270: 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ow. */.         
b280: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
b290: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
b2a0: 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  mt, i) ){.      
b2b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b2c0: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
b2d0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
b2e0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
b2f0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
b300: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
b310: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
b320: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c  ByteArrayObj(sql
b330: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
b340: 28 70 53 74 6d 74 2c 20 69 29 2c 20 62 79 74 65  (pStmt, i), byte
b350: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
b360: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b380: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b390: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
b3a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69          sqlite_i
b3b0: 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33  nt64 v = sqlite3
b3c0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
b3d0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
b3e0: 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32         if( v>=-2
b3f0: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
b400: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
b420: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  al = Tcl_NewIntO
b430: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
b440: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b450: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
b460: 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
b470: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20  tObj(v);.       
b480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b490: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b4a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b4b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
b4c0: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
b4d0: 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c             doubl
b4e0: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  e r = sqlite3_co
b4f0: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
b500: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
b510: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
b520: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b  NewDoubleObj(r);
b530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
b540: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b550: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b560: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
b570: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
b580: 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54    pVal = dbTextT
b590: 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  oObj(pDb->zNull)
b5a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b5b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b5c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b5d0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b5e0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
b5f0: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 28 63 68   dbTextToObj((ch
b600: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
b610: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
b620: 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i));.           
b630: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b650: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
b660: 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a   if( pScript ){.
b670: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b680: 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20  pArray==0 ){.   
b690: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f             Tcl_O
b6a0: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
b6b0: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
b6c0: 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  0, pVal, 0);.   
b6d0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
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 70 41 72 72 61 79 2c 20 61 70 43  erp, pArray, apC
b710: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c  olName[i], pVal,
b720: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b730: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
b740: 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44  se if( choice==D
b750: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20  B_ONECOLUMN ){. 
b760: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
b770: 74 28 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20 20  t( pRet==0 );.  
b780: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
b790: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
b7a0: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 56         pRet = pV
b7b0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
b7c0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
b7d0: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
b7e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b7f0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45      rc = TCL_BRE
b800: 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AK;.            
b810: 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  i = nCol;.      
b820: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68      }else if( ch
b830: 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20  oice==DB_EXISTS 
b840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  ){.            T
b850: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b860: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  pRet);.         
b870: 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
b880: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 3b 0a  wBooleanObj(1);.
b890: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
b8a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
b8b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
b8c0: 72 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a  rc = TCL_BREAK;.
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20              i = 
b8e0: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  nCol;.          
b8f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b900: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
b910: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
b920: 72 70 2c 20 70 52 65 74 2c 20 70 56 61 6c 29 3b  rp, pRet, pVal);
b930: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b940: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
b950: 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b    if( pScript ){
b960: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
b970: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
b980: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
b990: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
b9a0: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
b9b0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
b9c0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
b9d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b9e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b9f0: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
ba00: 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  EAK ){.        r
ba10: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
ba20: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72    }..      /* Fr
ba30: 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ee the column na
ba40: 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  me objects */.  
ba50: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
ba60: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
ba70: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
ba80: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
ba90: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43  DecrRefCount(apC
baa0: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
bab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63      }.        Tc
bac0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70  l_Free((char*)ap
bad0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
bae0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  }..      /* Free
baf0: 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e   the bound strin
bb00: 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d  g and blob param
bb10: 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 66  eters */.      f
bb20: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b  or(i=0; i<nParm;
bb30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54   i++){.        T
bb40: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
bb50: 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20  apParm[i]);.    
bb60: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70    }.      if( ap
bb70: 50 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20  Parm!=aParm ){. 
bb80: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
bb90: 28 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a  (char*)apParm);.
bba0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
bbb0: 2a 20 52 65 73 65 74 20 74 68 65 20 73 74 61 74  * Reset the stat
bbc0: 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72  ement.  If the r
bbd0: 65 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53 51  esult code is SQ
bbe0: 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68 65  LITE_SCHEMA, the
bbf0: 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68  n.      ** flush
bc00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
bc10: 61 63 68 65 20 61 6e 64 20 74 72 79 20 74 68 65  ache and try the
bc20: 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e   statement again
bc30: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
bc40: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
bc50: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
bc60: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 53 43     if( SQLITE_SC
bc70: 48 45 4d 41 3d 3d 72 63 32 20 29 7b 0a 20 20 20  HEMA==rc2 ){.   
bc80: 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 61 20       /* After a 
bc90: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 66  schema change, f
bca0: 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 20 61  lush the cache a
bcb0: 6e 64 20 74 72 79 20 74 6f 20 72 75 6e 20 74 68  nd try to run th
bcc0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61  e.        ** sta
bcd0: 74 65 6d 65 6e 74 20 61 67 61 69 6e 0a 20 20 20  tement again.   
bce0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
bcf0: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
bd00: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 73  pDb );.        s
bd10: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
bd20: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
bd30: 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54  if( pPreStmt ) T
bd40: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
bd50: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
bd60: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
bd70: 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49    }else if( SQLI
bd80: 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20  TE_OK!=rc2 ){.  
bd90: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75        /* If a ru
bda0: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63  n-time error occ
bdb0: 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20  urs, report the 
bdc0: 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72  error and stop r
bdd0: 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  eading.        *
bde0: 2a 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20  * the SQL.      
bdf0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c    */.        Tcl
be00: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
be10: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
be20: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
be30: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
be40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
be50: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
be60: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
be70: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
be80: 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c  ( pPreStmt ) Tcl
be90: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72  _Free((char*)pPr
bea0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  eStmt);.        
beb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
bec0: 73 65 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53  se if( pDb->maxS
bed0: 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt<=0 ){.      
bee0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
bef0: 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c  e is turned off,
bf00: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65   deallocated the
bf10: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
bf20: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
bf30: 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63  mt ) Tcl_Free((c
bf40: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  har*)pPreStmt);.
bf50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
bf60: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
bf70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bf80: 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68        /* Everyth
bf90: 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74  ing worked and t
bfa0: 68 65 20 63 61 63 68 65 20 69 73 20 6f 70 65 72  he cache is oper
bfb0: 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20  ational..       
bfc0: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
bfd0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
bfe0: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 77 65   structure if we
bff0: 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20   need one..     
c000: 20 20 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72     ** (If we alr
c010: 65 61 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65  eady have one we
c020: 20 63 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20   can just reuse 
c030: 69 74 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a  it.).        */.
c040: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
c050: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
c060: 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74       len = zLeft
c070: 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20   - zSql;.       
c080: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
c090: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
c0a0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
c0b0: 66 28 2a 70 50 72 65 53 74 6d 74 29 20 2b 20 6c  f(*pPreStmt) + l
c0c0: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  en );.          
c0d0: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
c0e0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c0f0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OR;.          pP
c100: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20  reStmt->pStmt = 
c110: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20  pStmt;.         
c120: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20   pPreStmt->nSql 
c130: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  = len;.         
c140: 20 6d 65 6d 63 70 79 28 70 50 72 65 53 74 6d 74   memcpy(pPreStmt
c150: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65  ->zSql, zSql, le
c160: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  n);.          pP
c170: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 5b 6c 65 6e  reStmt->zSql[len
c180: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 0;.        }
c190: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ..        /* Add
c1a0: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
c1b0: 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62  atement to the b
c1c0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
c1d0: 63 61 63 68 65 20 6c 69 73 74 0a 20 20 20 20 20  cache list.     
c1e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50     */.        pP
c1f0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20  reStmt->pNext = 
c200: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
c210: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
c220: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
c230: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
c240: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tList ){.       
c250: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d    pDb->stmtList-
c260: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
c270: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
c280: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
c290: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
c2a0: 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e         if( pDb->
c2b0: 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  stmtLast==0 ){. 
c2c0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
c2d0: 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29   pDb->nStmt==0 )
c2e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
c2f0: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
c300: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Stmt;.        }e
c310: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
c320: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
c330: 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  t>0 );.        }
c340: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53  .        pDb->nS
c350: 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20  tmt++;.   .     
c360: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
c370: 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d   too many statem
c380: 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65  ent in cache, re
c390: 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73  move the surplus
c3a0: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
c3b0: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
c3c0: 63 61 63 68 65 20 6c 69 73 74 2e 0a 20 20 20 20  cache list..    
c3d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77      */.        w
c3e0: 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74  hile( pDb->nStmt
c3f0: 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b  >pDb->maxStmt ){
c400: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c410: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d  e3_finalize(pDb-
c420: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74  >stmtLast->pStmt
c430: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
c440: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62  ->stmtLast = pDb
c450: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65  ->stmtLast->pPre
c460: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
c470: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62  _Free((char*)pDb
c480: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78  ->stmtLast->pNex
c490: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  t);.          pD
c4a0: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65  b->stmtLast->pNe
c4b0: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
c4c0: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
c4d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c4e0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63  }..      /* Proc
c4f0: 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  eed to the next 
c500: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
c510: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
c520: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
c530: 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ecrRefCount(objv
c540: 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  [2]);..    if( p
c550: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Ret ){.      if(
c560: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
c570: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
c580: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c590: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pRet);.      }. 
c5a0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
c5b0: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
c5c0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
c5d0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
c5e0: 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41   $db function NA
c5f0: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
c600: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
c610: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61   SQL function ca
c620: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
c630: 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69  ever that functi
c640: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65  on is.  ** calle
c650: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
c660: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
c670: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
c680: 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49    case DB_FUNCTI
c690: 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e  ON: {.    SqlFun
c6a0: 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63  c *pFunc;.    Tc
c6b0: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
c6c0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
c6d0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  .    if( objc!=4
c6e0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
c6f0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
c700: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
c710: 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  E SCRIPT");.    
c720: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c730: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  OR;.    }.    zN
c740: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
c750: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
c760: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 53 63 72  2], 0);.    pScr
c770: 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ipt = objv[3];. 
c780: 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53     pFunc = findS
c790: 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d  qlFunc(pDb, zNam
c7a0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  e);.    if( pFun
c7b0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  c==0 ) return TC
c7c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28  L_ERROR;.    if(
c7d0: 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
c7e0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
c7f0: 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d  rRefCount(pFunc-
c800: 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  >pScript);.    }
c810: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72  .    pFunc->pScr
c820: 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20  ipt = pScript;. 
c830: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
c840: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
c850: 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c    pFunc->useEval
c860: 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65  Objv = safeToUse
c870: 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c  EvalObjv(interp,
c880: 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72   pScript);.    r
c890: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
c8a0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d  te_function(pDb-
c8b0: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  >db, zName, -1, 
c8c0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
c8d0: 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53       pFunc, tclS
c8e0: 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
c8f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c900: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
c910: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
c920: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
c930: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
c940: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
c950: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
c960: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65  OLATILE);.    }e
c970: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75  lse{.      /* Mu
c980: 73 74 20 66 6c 75 73 68 20 61 6e 79 20 63 61 63  st flush any cac
c990: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  hed statements *
c9a0: 2f 0a 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d  /.      flushStm
c9b0: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
c9c0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
c9d0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
c9e0: 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
c9f0: 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
ca00: 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
ca10: 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
ca20: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
ca30: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
ca40: 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
ca50: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
ca60: 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
ca70: 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
ca80: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
ca90: 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
caa0: 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
cab0: 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
cac0: 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
cad0: 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
cae0: 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
caf0: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
cb00: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
cb10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cb20: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
cb30: 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
cb40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
cb50: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
cb60: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
cb70: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
cb80: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
cb90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
cba0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
cbb0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
cbc0: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
cbd0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
cbe0: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
cbf0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
cc00: 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
cc10: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
cc20: 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
cc30: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
cc40: 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a    strncpy(pDb->z
cc50: 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e  Null, zNull, len
cc60: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
cc70: 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30  zNull[len] = '\0
cc80: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ';.      }else{.
cc90: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
cca0: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
ccb0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
ccc0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
ccd0: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70  p, dbTextToObj(p
cce0: 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20  Db->zNull));.   
ccf0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
cd00: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c  *.  **     $db l
cd10: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
cd20: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75   .  **.  ** Retu
cd30: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
cd40: 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44  ich is the ROWID
cd50: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
cd60: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a  cent insert..  *
cd70: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54  /.  case DB_LAST
cd80: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b  _INSERT_ROWID: {
cd90: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
cda0: 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57  esult;.    Tcl_W
cdb0: 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20  ideInt rowid;.  
cdc0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
cdd0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
cde0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
cdf0: 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
ce00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ce10: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ce20: 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
ce30: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
ce40: 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  d(pDb->db);.    
ce50: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
ce60: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
ce70: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57  p);.    Tcl_SetW
ce80: 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  ideIntObj(pResul
ce90: 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62  t, rowid);.    b
cea0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
ceb0: 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43    ** The DB_ONEC
cec0: 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20  OLUMN method is 
ced0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65  implemented toge
cee0: 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 56 41  ther with DB_EVA
cef0: 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20  L..  */..  /*   
cf00: 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e   $db progress ?N
cf10: 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20   CALLBACK?.  ** 
cf20: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
cf30: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
cf40: 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20  every N virtual 
cf50: 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20  machine opcodes 
cf60: 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a  while executing.
cf70: 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
cf80: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
cf90: 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28  GRESS: {.    if(
cfa0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
cfb0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
cfc0: 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
cfd0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cfe0: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  (interp, pDb->zP
cff0: 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20  rogress, 0);.   
d000: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
d010: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
d020: 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72      char *zProgr
d030: 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ess;.      int l
d040: 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b  en;.      int N;
d050: 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  .      if( TCL_O
d060: 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
d070: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
d080: 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 09 72 65  v[2], &N) ){..re
d090: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d0a0: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
d0b0: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
d0c0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  s ){.        Tcl
d0d0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67  _Free(pDb->zProg
d0e0: 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ress);.      }. 
d0f0: 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d       zProgress =
d100: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
d110: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
d120: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
d130: 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e  zProgress && len
d140: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
d150: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54  b->zProgress = T
d160: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
d170: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
d180: 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65  cpy(pDb->zProgre
d190: 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 29 3b 0a  ss, zProgress);.
d1a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d1b0: 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
d1c0: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ess = 0;.      }
d1d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d1e0: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
d1f0: 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28  LLBACK.      if(
d200: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
d210: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
d220: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
d230: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d240: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
d250: 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62  r(pDb->db, N, Db
d260: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c  ProgressHandler,
d270: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
d280: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d290: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
d2a0: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  dler(pDb->db, 0,
d2b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
d2c0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
d2d0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
d2e0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d2f0: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c   2, objv, "N CAL
d300: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
d310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d320: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
d330: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
d340: 64 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c  db profile ?CALL
d350: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
d360: 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74  Make arrangement
d370: 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  s to invoke the 
d380: 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65  CALLBACK routine
d390: 20 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20   after each SQL 
d3a0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
d3b0: 68 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68  hat has run.  Th
d3c0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
d3d0: 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74  L and the amount
d3e0: 20 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20   of elapse time 
d3f0: 61 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65  are.  ** appende
d400: 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65  d to CALLBACK be
d410: 66 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20  fore the script 
d420: 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63  is run..  */.  c
d430: 61 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20  ase DB_PROFILE: 
d440: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
d450: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
d460: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d470: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
d480: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
d490: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d4a0: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
d4b0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
d4c0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
d4d0: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ile ){.        T
d4e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d4f0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
d500: 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  ofile, 0);.     
d510: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d520: 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69      char *zProfi
d530: 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  le;.      int le
d540: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
d550: 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
d560: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
d570: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  Db->zProfile);. 
d580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
d590: 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  ofile = Tcl_GetS
d5a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
d5b0: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
d5c0: 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20     if( zProfile 
d5d0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
d5e0: 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c      pDb->zProfil
d5f0: 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
d600: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
d610: 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50    strcpy(pDb->zP
d620: 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65  rofile, zProfile
d630: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d640: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
d650: 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  ofile = 0;.     
d660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
d670: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
d680: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
d690: 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
d6a0: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
d6b0: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
d6c0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44  lite3_profile(pD
d6d0: 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65  b->db, DbProfile
d6e0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
d6f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d700: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
d710: 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ile(pDb->db, 0, 
d720: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
d730: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
d740: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
d750: 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79  **     $db rekey
d760: 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   KEY.  **.  ** C
d770: 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70  hange the encryp
d780: 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  tion key on the 
d790: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64  currently open d
d7a0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
d7b0: 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b  case DB_REKEY: {
d7c0: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  .    int nKey;. 
d7d0: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20     void *pKey;. 
d7e0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
d7f0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
d800: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d810: 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29   2, objv, "KEY")
d820: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
d830: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
d840: 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47      pKey = Tcl_G
d850: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
d860: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65  bj(objv[2], &nKe
d870: 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  y);.#ifdef SQLIT
d880: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
d890: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b  rc = sqlite3_rek
d8a0: 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79  ey(pDb->db, pKey
d8b0: 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  , nKey);.    if(
d8c0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
d8d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d8e0: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
d8f0: 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  Str(rc), 0);.   
d900: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
d910: 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  R;.    }.#endif.
d920: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
d930: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
d940: 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53  b timeout MILLES
d950: 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a  ECONDS.  **.  **
d960: 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e   Delay for the n
d970: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
d980: 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20  conds specified 
d990: 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c  when a file is l
d9a0: 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ocked..  */.  ca
d9b0: 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b  se DB_TIMEOUT: {
d9c0: 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20  .    int ms;.   
d9d0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
d9e0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
d9f0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
da00: 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
da10: 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72  CONDS");.      r
da20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
da30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
da40: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
da50: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
da60: 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
da70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
da80: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
da90: 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29  out(pDb->db, ms)
daa0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
dab0: 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
dac0: 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e    $db total_chan
dad0: 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
dae0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
daf0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
db00: 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
db10: 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
db20: 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
db30: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
db40: 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20   was created..  
db50: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54  */.  case DB_TOT
db60: 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  AL_CHANGES: {.  
db70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
db80: 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
db90: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
dba0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
dbb0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
dbc0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
dbd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
dbe0: 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
dbf0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
dc00: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
dc10: 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
dc20: 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74  ult, sqlite3_tot
dc30: 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  al_changes(pDb->
dc40: 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
dc50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
dc60: 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43  b trace ?CALLBAC
dc70: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
dc80: 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
dc90: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
dca0: 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f  LBACK routine fo
dcb0: 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
dcc0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69  ment.  ** that i
dcd0: 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
dce0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
dcf0: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
dd00: 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a  CALLBACK before.
dd10: 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75    ** it is execu
dd20: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
dd30: 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20   DB_TRACE: {.   
dd40: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
dd50: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
dd60: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
dd70: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
dd80: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
dd90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dda0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
ddb0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
ddc0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
ddd0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
dde0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ddf0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29   pDb->zTrace, 0)
de00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
de10: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
de20: 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69  *zTrace;.      i
de30: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
de40: 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
de50: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
de60: 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a  e(pDb->zTrace);.
de70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
de80: 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  race = Tcl_GetSt
de90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
dea0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
deb0: 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20    if( zTrace && 
dec0: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
ded0: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54   pDb->zTrace = T
dee0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
def0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
df00: 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c  cpy(pDb->zTrace,
df10: 20 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20   zTrace);.      
df20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
df30: 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a  Db->zTrace = 0;.
df40: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
df50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
df60: 45 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  E.      if( pDb-
df70: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
df80: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
df90: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
dfa0: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70   sqlite3_trace(p
dfb0: 44 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65 48  Db->db, DbTraceH
dfc0: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
dfd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dfe0: 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
dff0: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
e000: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
e010: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
e020: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
e030: 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d  b transaction [-
e040: 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69  deferred|-immedi
e050: 61 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20  ate|-exclusive] 
e060: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
e070: 20 53 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   Start a new tra
e080: 6e 73 61 63 74 69 6f 6e 20 28 69 66 20 77 65 20  nsaction (if we 
e090: 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
e0a0: 69 6e 20 74 68 65 20 6d 69 64 73 74 20 6f 66 20  in the midst of 
e0b0: 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  a.  ** transacti
e0c0: 6f 6e 29 20 61 6e 64 20 65 78 65 63 75 74 65 20  on) and execute 
e0d0: 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 53  the TCL script S
e0e0: 43 52 49 50 54 2e 20 20 41 66 74 65 72 20 53 43  CRIPT.  After SC
e0f0: 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  RIPT.  ** comple
e100: 74 65 73 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d  tes, either comm
e110: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
e120: 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61  on or roll it ba
e130: 63 6b 20 69 66 20 53 43 52 49 50 54 0a 20 20 2a  ck if SCRIPT.  *
e140: 2a 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  * throws an exce
e150: 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f  ption.  Or if no
e160: 20 6e 65 77 20 74 72 61 6e 73 61 74 69 6f 6e 20   new transation 
e170: 77 61 73 20 73 74 61 72 74 65 64 2c 20 64 6f 20  was started, do 
e180: 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61  nothing..  ** pa
e190: 73 73 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  ss the exception
e1a0: 20 6f 6e 20 75 70 20 74 68 65 20 73 74 61 63 6b   on up the stack
e1b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
e1c0: 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73   command was ins
e1d0: 70 69 72 65 64 20 62 79 20 44 61 76 65 20 54 68  pired by Dave Th
e1e0: 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52  omas's talk on R
e1f0: 75 62 79 20 61 74 20 74 68 65 0a 20 20 2a 2a 20  uby at the.  ** 
e200: 32 30 30 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70  2005 O'Reilly Op
e210: 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e  en Source Conven
e220: 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20  tion (OSCON)..  
e230: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41  */.  case DB_TRA
e240: 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  NSACTION: {.    
e250: 69 6e 74 20 69 6e 54 72 61 6e 73 3b 0a 20 20 20  int inTrans;.   
e260: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
e270: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
e280: 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22 42 45 47  r *zBegin = "BEG
e290: 49 4e 22 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  IN";.    if( obj
e2a0: 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=3 && objc!=4 
e2b0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
e2c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
e2d0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50  , 2, objv, "[TYP
e2e0: 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20  E] SCRIPT");.   
e2f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e300: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
e310: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
e320: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
e330: 6a 76 5b 32 5d 3b 0a 20 20 20 20 7d 20 65 6c 73  jv[2];.    } els
e340: 65 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  e {.      static
e350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59   const char *TTY
e360: 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  PE_strs[] = {.  
e370: 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64 22        "deferred"
e380: 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c  ,   "exclusive",
e390: 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30    "immediate", 0
e3a0: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
e3b0: 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20  enum TTYPE_enum 
e3c0: 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45 5f  {.        TTYPE_
e3d0: 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f  DEFERRED, TTYPE_
e3e0: 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45  EXCLUSIVE, TTYPE
e3f0: 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20  _IMMEDIATE.     
e400: 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74   };.      int tt
e410: 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ype;.      if( T
e420: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
e430: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
e440: 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20  2], TTYPE_strs, 
e450: 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70  "transaction typ
e460: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a    0, &ttype) ){.
e490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
e4a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
e4b0: 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  }.      switch( 
e4c0: 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d  (enum TTYPE_enum
e4d0: 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  )ttype ){.      
e4e0: 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45 46    case TTYPE_DEF
e4f0: 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d  ERRED:    /* no-
e500: 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20  op */;          
e510: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e520: 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
e530: 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42  _EXCLUSIVE:   zB
e540: 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58  egin = "BEGIN EX
e550: 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b  CLUSIVE";  break
e560: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
e570: 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20  TYPE_IMMEDIATE: 
e580: 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
e590: 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62  N IMMEDIATE";  b
e5a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e5b0: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
e5c0: 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  jv[3];.    }.   
e5d0: 20 69 6e 54 72 61 6e 73 20 3d 20 21 73 71 6c 69   inTrans = !sqli
e5e0: 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
e5f0: 69 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  it(pDb->db);.   
e600: 20 69 66 28 20 21 69 6e 54 72 61 6e 73 20 29 7b   if( !inTrans ){
e610: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c  .      (void)sql
e620: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
e630: 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c  b, zBegin, 0, 0,
e640: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
e650: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
e660: 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  x(interp, pScrip
e670: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  t, 0);.    if( !
e680: 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  inTrans ){.     
e690: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
e6a0: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  d;.      if( rc=
e6b0: 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20  =TCL_ERROR ){.  
e6c0: 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 52 4f        zEnd = "RO
e6d0: 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 7d  LLBACK";.      }
e6e0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
e6f0: 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b  zEnd = "COMMIT";
e700: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 28  .      }.      (
e710: 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65  void)sqlite3_exe
e720: 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c  c(pDb->db, zEnd,
e730: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
e740: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
e750: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
e760: 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73  b update_hook ?s
e770: 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24  cript?.  **    $
e780: 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  db rollback_hook
e790: 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20   ?script?.  */. 
e7a0: 20 63 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f   case DB_UPDATE_
e7b0: 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42  HOOK: .  case DB
e7c0: 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20  _ROLLBACK_HOOK: 
e7d0: 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70  {..    /* set pp
e7e0: 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74  Hook to point at
e7f0: 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20   pUpdateHook or 
e800: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64  pRollbackHook, d
e810: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20  epending on .   
e820: 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62   ** whether [$db
e830: 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72   update_hook] or
e840: 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68   [$db rollback_h
e850: 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64  ook] was invoked
e860: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  ..    */.    Tcl
e870: 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a  _Obj **ppHook; .
e880: 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
e890: 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29  DB_UPDATE_HOOK )
e8a0: 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d  {.      ppHook =
e8b0: 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f   &pDb->pUpdateHo
e8c0: 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ok;.    }else{. 
e8d0: 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70       ppHook = &p
e8e0: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
e8f0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  k;.    }..    if
e900: 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
e910: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 54  c!=3 ){.       T
e920: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
e930: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
e940: 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
e950: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
e960: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
e970: 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a   if( *ppHook ){.
e980: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
e990: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a  Result(interp, *
e9a0: 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69  ppHook);.      i
e9b0: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
e9c0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
e9d0: 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b  fCount(*ppHook);
e9e0: 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b  .        *ppHook
e9f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
ea00: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
ea10: 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==3 ){.      ass
ea20: 65 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20  ert( !(*ppHook) 
ea30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  );.      if( Tcl
ea40: 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28 6f  _GetCharLength(o
ea50: 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20  bjv[2])>0 ){.   
ea60: 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f       *ppHook = o
ea70: 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  bjv[2];.        
ea80: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
ea90: 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20  (*ppHook);.     
eaa0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71   }.    }..    sq
eab0: 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
eac0: 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d  k(pDb->db, (pDb-
ead0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55  >pUpdateHook?DbU
eae0: 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c  pdateHandler:0),
eaf0: 20 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   pDb);.    sqlit
eb00: 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
eb10: 28 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70  (pDb->db,(pDb->p
eb20: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52  RollbackHook?DbR
eb30: 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30  ollbackHandler:0
eb40: 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65  ),pDb);..    bre
eb50: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
eb60: 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a   $db version.  *
eb70: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
eb80: 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  e version string
eb90: 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
eba0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
ebb0: 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20  DB_VERSION: {.  
ebc0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
ebd0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
ebe0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
ebf0: 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  on(), TCL_STATIC
ec00: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
ec10: 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f  }...  } /* End o
ec20: 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74 61  f the SWITCH sta
ec30: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75  tement */.  retu
ec40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ec50: 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45    sqlite3 DBNAME
ec60: 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f   FILENAME ?MODE?
ec70: 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a 2a   ?-key KEY?.**.*
ec80: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61  * This is the ma
ec90: 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20  in Tcl command. 
eca0: 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74   When the "sqlit
ecb0: 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69  e" Tcl command i
ecc0: 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68  s.** invoked, th
ecd0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
ece0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  to process that 
ecf0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  command..**.** T
ed00: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
ed10: 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e  t, DBNAME, is an
ed20: 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20   arbitrary name 
ed30: 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74  for a new.** dat
ed40: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ed50: 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  .  This command 
ed60: 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f  creates a new co
ed70: 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44  mmand named.** D
ed80: 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73  BNAME that is us
ed90: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  ed to control th
eda0: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  at connection.  
edb0: 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  The database.** 
edc0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65  connection is de
edd0: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44  leted when the D
ede0: 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73  BNAME command is
edf0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
ee00: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
ee10: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
ee20: 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
ee30: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
ee40: 2a 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  * the sqlite dat
ee50: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 74 6f  abase that is to
ee60: 20 62 65 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a   be accessed..**
ee70: 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20  .** For testing 
ee80: 70 75 72 70 6f 73 65 73 2c 20 77 65 20 61 6c 73  purposes, we als
ee90: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20 66 6f  o support the fo
eea0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
eeb0: 73 71 6c 69 74 65 33 20 2d 65 6e 63 6f 64 69 6e  sqlite3 -encodin
eec0: 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65  g.**.**       Re
eed0: 74 75 72 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e  turn the encodin
eee0: 67 20 75 73 65 64 20 62 79 20 4c 49 4b 45 20 61  g used by LIKE a
eef0: 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  nd GLOB operator
ef00: 73 2e 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20  s.  Choices.**  
ef10: 20 20 20 20 20 61 72 65 20 55 54 46 2d 38 20 61       are UTF-8 a
ef20: 6e 64 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a  nd iso8859..**.*
ef30: 2a 20 20 73 71 6c 69 74 65 33 20 2d 76 65 72 73  *  sqlite3 -vers
ef40: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ion.**.**       
ef50: 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69  Return the versi
ef60: 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  on number of the
ef70: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
ef80: 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20  .**.**  sqlite3 
ef90: 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a 2a  -tcl-uses-utf.**
efa0: 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e  .**       Return
efb0: 20 22 31 22 20 69 66 20 63 6f 6d 70 69 6c 65 64   "1" if compiled
efc0: 20 77 69 74 68 20 61 20 54 63 6c 20 75 73 65 73   with a Tcl uses
efd0: 20 55 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20   UTF-8.  Return 
efe0: 22 30 22 20 69 66 0a 2a 2a 20 20 20 20 20 20 20  "0" if.**       
eff0: 6e 6f 74 2e 20 20 55 73 65 64 20 62 79 20 74 65  not.  Used by te
f000: 73 74 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sts to make sure
f010: 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73   the library was
f020: 20 63 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20 20   compiled .**   
f030: 20 20 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a      correctly..*
f040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d  /.static int DbM
f050: 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  ain(void *cd, Tc
f060: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f070: 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
f080: 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
f090: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a  .  SqliteDb *p;.
f0a0: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30    void *pKey = 0
f0b0: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30  ;.  int nKey = 0
f0c0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
f0d0: 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45  zArg;.  char *zE
f0e0: 72 72 4d 73 67 3b 0a 20 20 63 6f 6e 73 74 20 63  rrMsg;.  const c
f0f0: 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 69 66  har *zFile;.  if
f100: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
f110: 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
f120: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f130: 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  v[1], 0);.    if
f140: 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
f150: 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a  version")==0 ){.
f160: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
f170: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71  Result(interp,sq
f180: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29  lite3_version,0)
f190: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
f1a0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
f1b0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
f1c0: 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d  ,"-has-codec")==
f1d0: 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
f1e0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
f1f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f200: 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30  ult(interp,"1",0
f210: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54  );.#else.      T
f220: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f230: 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23  interp,"0",0);.#
f240: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
f250: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
f260: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
f270: 7a 41 72 67 2c 22 2d 74 63 6c 2d 75 73 65 73 2d  zArg,"-tcl-uses-
f280: 75 74 66 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  utf")==0 ){.#ifd
f290: 65 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 0a 20  ef TCL_UTF_MAX. 
f2a0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
f2b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22  esult(interp,"1"
f2c0: 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ,0);.#else.     
f2d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f2e0: 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b  t(interp,"0",0);
f2f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
f300: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
f310: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a   }.  }.  if( obj
f320: 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20  c==5 || objc==6 
f330: 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63  ){.    zArg = Tc
f340: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f350: 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c  bj(objv[objc-2],
f360: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   0);.    if( str
f370: 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29  cmp(zArg,"-key")
f380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65  ==0 ){.      pKe
f390: 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
f3a0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
f3b0: 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65 79 29  [objc-1], &nKey)
f3c0: 3b 0a 20 20 20 20 20 20 6f 62 6a 63 20 2d 3d 20  ;.      objc -= 
f3d0: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
f3e0: 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62  f( objc!=3 && ob
f3f0: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
f400: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f410: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a  terp, 1, objv, .
f420: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
f430: 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22 48  S_CODEC.      "H
f440: 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f  ANDLE FILENAME ?
f450: 2d 6b 65 79 20 43 4f 44 45 43 2d 4b 45 59 3f 22  -key CODEC-KEY?"
f460: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 48 41  .#else.      "HA
f470: 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d  NDLE FILENAME ?M
f480: 4f 44 45 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20  ODE?".#endif.   
f490: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   );.    return T
f4a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f4b0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
f4c0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63   = (SqliteDb*)Tc
f4d0: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
f4e0: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
f4f0: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
f500: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f510: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20  malloc failed", 
f520: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
f530: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f540: 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  R;.  }.  memset(
f550: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
f560: 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  );.  zFile = Tcl
f570: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f580: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
f590: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46   sqlite3_open(zF
f5a0: 69 6c 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  ile, &p->db);.  
f5b0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
f5c0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
f5d0: 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72  ->db) ){.    zEr
f5e0: 72 4d 73 67 20 3d 20 73 74 72 64 75 70 28 73 71  rMsg = strdup(sq
f5f0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
f600: 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  db));.    sqlite
f610: 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a  3_close(p->db);.
f620: 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20      p->db = 0;. 
f630: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
f640: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c  _HAS_CODEC.  sql
f650: 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20  ite3_key(p->db, 
f660: 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e  pKey, nKey);.#en
f670: 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d  dif.  if( p->db=
f680: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  =0 ){.    Tcl_Se
f690: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
f6a0: 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c  zErrMsg, TCL_VOL
f6b0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f  ATILE);.    Tcl_
f6c0: 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a  Free((char*)p);.
f6d0: 20 20 20 20 66 72 65 65 28 7a 45 72 72 4d 73 67      free(zErrMsg
f6e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f6f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
f700: 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f  ->maxStmt = NUM_
f710: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a  PREPARED_STMTS;.
f720: 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
f730: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f740: 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c  jv[1], 0);.  Tcl
f750: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
f760: 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20  d(interp, zArg, 
f770: 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a  DbObjCmd, (char*
f780: 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29  )p, DbDeleteCmd)
f790: 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6d 70 69  ;..  /* If compi
f7a0: 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
f7b0: 54 45 53 54 20 74 75 72 6e 65 64 20 6f 6e 2c 20  TEST turned on, 
f7c0: 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 74 68  then register th
f7d0: 65 20 22 6d 64 35 73 75 6d 22 0a 20 20 2a 2a 20  e "md5sum".  ** 
f7e0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  SQL function..  
f7f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
f800: 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78  _TEST.  {.    ex
f810: 74 65 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65  tern void Md5_Re
f820: 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 2a 29  gister(sqlite3*)
f830: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f840: 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 69 6e 74  MEMDEBUG.    int
f850: 20 6d 61 6c 6c 6f 63 66 61 69 6c 20 3d 20 73 71   mallocfail = sq
f860: 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
f870: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  l;.    sqlite3_i
f880: 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 30 3b 0a  MallocFail = 0;.
f890: 23 65 6e 64 69 66 0a 20 20 20 20 4d 64 35 5f 52  #endif.    Md5_R
f8a0: 65 67 69 73 74 65 72 28 70 2d 3e 64 62 29 3b 0a  egister(p->db);.
f8b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45  #ifdef SQLITE_ME
f8c0: 4d 44 45 42 55 47 0a 20 20 20 20 73 71 6c 69 74  MDEBUG.    sqlit
f8d0: 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d  e3_iMallocFail =
f8e0: 20 6d 61 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e   mallocfail;.#en
f8f0: 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20  dif.  }.#endif  
f900: 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
f910: 6e 74 65 72 70 3b 0a 20 20 72 65 74 75 72 6e 20  nterp;.  return 
f920: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
f930: 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79   Provide a dummy
f940: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69   Tcl_InitStubs i
f950: 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
f960: 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a  his as a static.
f970: 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ** library..*/.#
f980: 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  ifndef USE_TCL_S
f990: 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63  TUBS.# undef  Tc
f9a0: 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65  l_InitStubs.# de
f9b0: 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75  fine Tcl_InitStu
f9c0: 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  bs(a,b,c).#endif
f9d0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
f9e0: 65 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b  e we have a PACK
f9f0: 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  AGE_VERSION macr
fa00: 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73  o defined.  This
fa10: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69   will be.** defi
fa20: 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ned automaticall
fa30: 79 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b  y by the TEA mak
fa40: 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65  efile.  But othe
fa50: 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64  r makefiles.** d
fa60: 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e  o not define it.
fa70: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b  .*/.#ifndef PACK
fa80: 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65  AGE_VERSION.# de
fa90: 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52  fine PACKAGE_VER
faa0: 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53  SION SQLITE_VERS
fab0: 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ION.#endif../*.*
fac0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
fad0: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20  s module..**.** 
fae0: 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20  This Tcl module 
faf0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20  contains only a 
fb00: 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63  single new Tcl c
fb10: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71  ommand named "sq
fb20: 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65  lite"..** (Hence
fb30: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d   there is no nam
fb40: 65 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69  espace.  There i
fb50: 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73  s no point in us
fb60: 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a  ing a namespace.
fb70: 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73  ** if the extens
fb80: 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65  ion only supplie
fb90: 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29  s one new name!)
fba0: 20 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63    The "sqlite" c
fbb0: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65  ommand is.** use
fbc0: 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  d to open a new 
fbd0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
fbe0: 20 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e    See the DbMain
fbf0: 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65  () routine above
fc00: 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
fc10: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
fc20: 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71  */.EXTERN int Sq
fc30: 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
fc40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
fc50: 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28    Tcl_InitStubs(
fc60: 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30  interp, "8.4", 0
fc70: 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
fc80: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
fc90: 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63  , "sqlite3", (Tc
fca0: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
fcb0: 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54  Main, 0, 0);.  T
fcc0: 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
fcd0: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
fce0: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
fcf0: 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
fd00: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
fd10: 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c  , "sqlite", (Tcl
fd20: 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
fd30: 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
fd40: 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
fd50: 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50  erp, "sqlite", P
fd60: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
fd70: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
fd80: 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ;.}.EXTERN int T
fd90: 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  clsqlite3_Init(T
fda0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fdb0: 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
fdc0: 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
fdd0: 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71   }.EXTERN int Sq
fde0: 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54  lite3_SafeInit(T
fdf0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fe00: 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
fe10: 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
fe20: 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49  Tclsqlite3_SafeI
fe30: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
fe40: 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
fe50: 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64  TCL_OK; }..#ifnd
fe60: 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46  ef SQLITE_3_SUFF
fe70: 49 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69  IX_ONLY.EXTERN i
fe80: 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54  nt Sqlite_Init(T
fe90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fea0: 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
feb0: 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
fec0: 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
fed0: 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c  lsqlite_Init(Tcl
fee0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
fef0: 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
ff00: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
ff10: 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
ff20: 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
ff30: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
ff40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
ff50: 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
ff60: 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28  sqlite_SafeInit(
ff70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
ff80: 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
ff90: 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK; }.#endif..#i
ffa0: 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a  fdef TCLSH./****
ffb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
10000 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
10010 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  ws is used to bu
10020 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54  ild standalone T
10030 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a  CL interpreters.
10040 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  */../*.** If the
10050 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
10060 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e  one, then put in
10070 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74   code this for t
10080 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75  he.** "main" rou
10090 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69  tine that will i
100a0 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e  nitialize Tcl an
100b0 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f  d take input fro
100c0 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  m.** standard in
100d0 70 75 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53  put..*/.#if TCLS
100e0 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72  H==1.static char
100f0 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20   zMainloop[] =. 
10100 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22   "set line {}\n"
10110 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66  .  "while {![eof
10120 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20   stdin]} {\n".  
10130 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22    "if {$line!=\"
10140 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  \"} {\n".      "
10150 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
10160 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d  \"> \"\n".    "}
10170 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
10180 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e   "puts -nonewlin
10190 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20  e \"% \"\n".    
101a0 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68  "}\n".    "flush
101b0 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22   stdout\n".    "
101c0 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74  append line [get
101d0 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20  s stdin]\n".    
101e0 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c  "if {[info compl
101f0 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22  ete $line]} {\n"
10200 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74  .      "if {[cat
10210 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24  ch {uplevel #0 $
10220 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b  line} result]} {
10230 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
10240 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72  s stderr \"Error
10250 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20  : $result\"\n". 
10260 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b       "} elseif {
10270 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b  $result!=\"\"} {
10280 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
10290 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20  s $result\n".   
102a0 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22     "}\n".      "
102b0 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
102c0 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a     "} else {\n".
102d0 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69        "append li
102e0 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d  ne \\n\n".    "}
102f0 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65  \n".  "}\n".;.#e
10300 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
10310 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69  he macro TCLSH i
10320 73 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20  s two, then get 
10330 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f  the main loop co
10340 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65  de out of.** the
10350 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 20 22   separate file "
10360 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22  spaceanal_tcl.h"
10370 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ..*/.#if TCLSH==
10380 32 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d  2.static char zM
10390 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e  ainloop[] = .#in
103a0 63 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c  clude "spaceanal
103b0 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66  _tcl.h".;.#endif
103c0 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f  ..#define TCLSH_
103d0 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e  MAIN main   /* N
103e0 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75  eeded to fake ou
103f0 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e  t mktclapp */.in
10400 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74  t TCLSH_MAIN(int
10410 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
10420 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  gv){.  Tcl_Inter
10430 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
10440 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28  _FindExecutable(
10450 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65  argv[0]);.  inte
10460 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49  rp = Tcl_CreateI
10470 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74  nterp();.  Sqlit
10480 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
10490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
104a0 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65  EST.  {.    exte
104b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
104c0 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t1_Init(Tcl_Inte
104d0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
104e0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32   int Sqlitetest2
104f0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10500 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10510 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49  nt Sqlitetest3_I
10520 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
10530 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
10540 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
10550 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
10560 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
10570 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
10580 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10590 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
105a0 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63  itetest6_Init(Tc
105b0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
105c0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
105d0 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f  etest7_Init(Tcl_
105e0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
105f0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
10600 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est8_Init(Tcl_In
10610 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
10620 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28  rn int Md5_Init(
10630 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10640 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
10650 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28  itetestsse_Init(
10660 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10670 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
10680 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69  itetestasync_Ini
10690 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
106a0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
106b0 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f  qlitetesttclvar_
106c0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
106d0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
106e0 74 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65  t Sqlitetestsche
106f0 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ma_Init(Tcl_Inte
10700 72 70 2a 29 3b 0a 0a 20 20 20 20 53 71 6c 69 74  rp*);..    Sqlit
10710 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65  etest1_Init(inte
10720 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
10730 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70  est2_Init(interp
10740 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
10750 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t3_Init(interp);
10760 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 34  .    Sqlitetest4
10770 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
10780 20 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49     Sqlitetest5_I
10790 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
107a0 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69   Sqlitetest6_Ini
107b0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
107c0 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28  qlitetest7_Init(
107d0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
107e0 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 69 6e  itetest8_Init(in
107f0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
10800 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
10810 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
10820 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e  itetesttclvar_In
10830 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
10840 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61  Sqlitetestschema
10850 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
10860 20 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65     Md5_Init(inte
10870 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  rp);.#ifdef SQLI
10880 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74  TE_SSE.    Sqlit
10890 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e  etestsse_Init(in
108a0 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  terp);.#endif.  
108b0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61  }.#endif.  if( a
108c0 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d  rgc>=2 || TCLSH=
108d0 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =2 ){.    int i;
108e0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
108f0 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61  interp,"argv0",a
10900 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41  rgv[1],TCL_GLOBA
10910 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
10920 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
10930 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47  argv", "", TCL_G
10940 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
10950 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20   for(i=3-TCLSH; 
10960 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
10970 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
10980 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61  nterp, "argv", a
10990 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  rgv[i],.        
109a0 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c    TCL_GLOBAL_ONL
109b0 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45  Y | TCL_LIST_ELE
109c0 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e  MENT | TCL_APPEN
109d0 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a  D_VALUE);.    }.
109e0 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31      if( TCLSH==1
109f0 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65   && Tcl_EvalFile
10a00 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
10a10 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  )!=TCL_OK ){.   
10a20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10a30 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61  Info = Tcl_GetVa
10a40 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  r(interp, "error
10a50 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  Info", TCL_GLOBA
10a60 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69  L_ONLY);.      i
10a70 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49  f( zInfo==0 ) zI
10a80 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65  nfo = interp->re
10a90 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69  sult;.      fpri
10aa0 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
10ab0 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49  %s\n", *argv, zI
10ac0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nfo);.      retu
10ad0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
10ae0 20 20 69 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c    if( argc<=1 ||
10af0 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20   TCLSH==2 ){.   
10b00 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
10b10 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f  interp, zMainloo
10b20 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
10b30 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
10b40 54 43 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64 69 66  TCLSH */..#endif
10b50 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   /* !defined(NO_
10b60 54 43 4c 29 20 2a 2f 0a                          TCL) */.