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

Artifact 64c4a41dac9dae0d2258b06c4229e995d5fa7cc4:


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 34 20 32 30 30 36 2f 30 37 2f 31 32 20 30 30  64 2006/07/12 00
01c0: 3a 31 38 3a 34 31 20 64 72 68 20 45 78 70 20 24  :18:41 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 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54   }else if( rc==T
c5d0: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  CL_OK ){.      T
c5e0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
c5f0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20  nterp);.    }.  
c600: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
c610: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
c620: 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 53 43  function NAME SC
c630: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
c640: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
c650: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
c660: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20  NAME.  Whenever 
c670: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
c680: 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e  .  ** called, in
c690: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
c6a0: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
c6b0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
c6c0: 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e DB_FUNCTION: {
c6d0: 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
c6e0: 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  unc;.    Tcl_Obj
c6f0: 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
c700: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
c710: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
c720: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
c730: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
c740: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
c750: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
c760: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c770: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
c780: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
c790: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
c7a0: 29 3b 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d  );.    pScript =
c7b0: 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 70 46   objv[3];.    pF
c7c0: 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e  unc = findSqlFun
c7d0: 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  c(pDb, zName);. 
c7e0: 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20     if( pFunc==0 
c7f0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c800: 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  OR;.    if( pFun
c810: 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20  c->pScript ){.  
c820: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
c830: 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72  ount(pFunc->pScr
c840: 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ipt);.    }.    
c850: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d  pFunc->pScript =
c860: 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63   pScript;.    Tc
c870: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
c880: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75  Script);.    pFu
c890: 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  nc->useEvalObjv 
c8a0: 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  = safeToUseEvalO
c8b0: 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72  bjv(interp, pScr
c8c0: 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ipt);.    rc = s
c8d0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
c8e0: 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  nction(pDb->db, 
c8f0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
c900: 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
c910: 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e  pFunc, tclSqlFun
c920: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  c, 0, 0);.    if
c930: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c940: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
c950: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54  L_ERROR;.      T
c960: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
c970: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
c980: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
c990: 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
c9a0: 4c 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  LE);.    }else{.
c9b0: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 66 6c        /* Must fl
c9c0: 75 73 68 20 61 6e 79 20 63 61 63 68 65 64 20 73  ush any cached s
c9d0: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
c9e0: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
c9f0: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 7d 0a  e( pDb );.    }.
ca00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ca10: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
ca20: 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52  b nullvalue ?STR
ca30: 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ING?.  **.  ** C
ca40: 68 61 6e 67 65 20 74 65 78 74 20 75 73 65 64 20  hange text used 
ca50: 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65  when a NULL come
ca60: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
ca70: 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54  database. If ?ST
ca80: 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f  RING?.  ** is no
ca90: 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
caa0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69  the current stri
cab0: 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c  ng used for NULL
cac0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
cad0: 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73 20  ** If STRING is 
cae0: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54  present, then ST
caf0: 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64  RING is returned
cb00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61  ..  **.  */.  ca
cb10: 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a  se DB_NULLVALUE:
cb20: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
cb30: 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
cb40: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
cb50: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
cb60: 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41  2, objv, "NULLVA
cb70: 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  LUE");.      ret
cb80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cb90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
cba0: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e  c==3 ){.      in
cbb0: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61  t len;.      cha
cbc0: 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47  r *zNull = Tcl_G
cbd0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
cbe0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
cbf0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
cc00: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
cc10: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e  Tcl_Free(pDb->zN
cc20: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
cc30: 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26      if( zNull &&
cc40: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
cc50: 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54    pDb->zNull = T
cc60: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
cc70: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
cc80: 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  ncpy(pDb->zNull,
cc90: 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20   zNull, len);.  
cca0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
ccb0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
ccc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ccd0: 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
cce0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
ccf0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
cd00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
cd10: 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a  TextToObj(pDb->z
cd20: 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65 61  Null));.    brea
cd30: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
cd40: 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69  *     $db last_i
cd50: 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a  nsert_rowid .  *
cd60: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e  *.  ** Return an
cd70: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
cd80: 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20  s the ROWID for 
cd90: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
cda0: 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63  insert..  */.  c
cdb0: 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45  ase DB_LAST_INSE
cdc0: 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20  RT_ROWID: {.    
cdd0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
cde0: 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e  ;.    Tcl_WideIn
cdf0: 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28  t rowid;.    if(
ce00: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
ce10: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
ce20: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
ce30: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
ce40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ce50: 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64  .    }.    rowid
ce60: 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f   = sqlite3_last_
ce70: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62  insert_rowid(pDb
ce80: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75  ->db);.    pResu
ce90: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
cea0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
ceb0: 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e     Tcl_SetWideIn
cec0: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f  tObj(pResult, ro
ced0: 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  wid);.    break;
cee0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
cef0: 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  The DB_ONECOLUMN
cf00: 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65   method is imple
cf10: 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20  mented together 
cf20: 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20  with DB_EVAL..  
cf30: 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  */..  /*    $db 
cf40: 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c  progress ?N CALL
cf50: 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a  BACK?.  ** .  **
cf60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
cf70: 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79  n callback every
cf80: 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   N virtual machi
cf90: 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65  ne opcodes while
cfa0: 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20   executing.  ** 
cfb0: 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
cfc0: 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53  case DB_PROGRESS
cfd0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
cfe0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
cff0: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
d000: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
d010: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d020: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
d030: 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ss, 0);.      }.
d040: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
d050: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
d060: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
d070: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
d080: 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
d090: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
d0a0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
d0b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
d0c0: 20 26 4e 29 20 29 7b 0a 09 72 65 74 75 72 6e 20   &N) ){..return 
d0d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
d0e0: 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   };.      if( pD
d0f0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
d100: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
d110: 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29  (pDb->zProgress)
d120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d130: 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
d140: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
d150: 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b  (objv[3], &len);
d160: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67  .      if( zProg
d170: 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b  ress && len>0 ){
d180: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
d190: 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c  rogress = Tcl_Al
d1a0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
d1b0: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
d1c0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a  Db->zProgress, z
d1d0: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
d1e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d1f0: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
d200: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
d210: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d220: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
d230: 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  K.      if( pDb-
d240: 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
d250: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
d260: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
d270: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
d280: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
d290: 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72  ->db, N, DbProgr
d2a0: 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  essHandler, pDb)
d2b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d2c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
d2d0: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
d2e0: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30  pDb->db, 0, 0, 0
d2f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
d300: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
d310: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d320: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
d330: 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b  bjv, "N CALLBACK
d340: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
d350: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d360: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
d370: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
d380: 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  ofile ?CALLBACK?
d390: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
d3a0: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
d3b0: 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
d3c0: 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65  ACK routine afte
d3d0: 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
d3e0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68  ment.  ** that h
d3f0: 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78  as run.  The tex
d400: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64  t of the SQL and
d410: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65   the amount of e
d420: 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20  lapse time are. 
d430: 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20   ** appended to 
d440: 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
d450: 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75  the script is ru
d460: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
d470: 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20  B_PROFILE: {.   
d480: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
d490: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
d4a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
d4b0: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
d4c0: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
d4d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d4e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
d4f0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
d500: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
d510: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
d520: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d530: 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  p, pDb->zProfile
d540: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
d560: 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20  har *zProfile;. 
d570: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
d580: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
d590: 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
d5a0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
d5b0: 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20  Profile);.      
d5c0: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65  }.      zProfile
d5d0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
d5e0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
d5f0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
d600: 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65  ( zProfile && le
d610: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
d620: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54  Db->zProfile = T
d630: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
d640: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
d650: 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  cpy(pDb->zProfil
d660: 65 2c 20 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  e, zProfile);.  
d670: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d680: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
d690: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
d6a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d6b0: 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66  T_TRACE.      if
d6c0: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
d6d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
d6e0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
d6f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d700: 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62  _profile(pDb->db
d710: 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c  , DbProfileHandl
d720: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
d730: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
d740: 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70  qlite3_profile(p
d750: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
d760: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
d770: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
d780: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
d790: 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a    $db rekey KEY.
d7a0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65    **.  ** Change
d7b0: 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20   the encryption 
d7c0: 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65  key on the curre
d7d0: 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61  ntly open databa
d7e0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
d7f0: 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20  DB_REKEY: {.    
d800: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f  int nKey;.    vo
d810: 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66  id *pKey;.    if
d820: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
d830: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d840: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
d850: 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20  bjv, "KEY");.   
d860: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d870: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
d880: 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
d890: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
d8a0: 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23  jv[2], &nKey);.#
d8b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
d8c0: 5f 43 4f 44 45 43 0a 20 20 20 20 72 63 20 3d 20  _CODEC.    rc = 
d8d0: 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44  sqlite3_rekey(pD
d8e0: 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  b->db, pKey, nKe
d8f0: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  y);.    if( rc )
d900: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
d910: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d920: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
d930: 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  c), 0);.      rc
d940: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
d950: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
d960: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
d970: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d    **     $db tim
d980: 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44  eout MILLESECOND
d990: 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61  S.  **.  ** Dela
d9a0: 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  y for the number
d9b0: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
d9c0: 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20   specified when 
d9d0: 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64  a file is locked
d9e0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
d9f0: 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20  _TIMEOUT: {.    
da00: 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20  int ms;.    if( 
da10: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
da20: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
da30: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
da40: 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53  v, "MILLISECONDS
da50: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
da60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
da70: 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  }.    if( Tcl_Ge
da80: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
da90: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73  rp, objv[2], &ms
daa0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
dab0: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
dac0: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70  3_busy_timeout(p
dad0: 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20  Db->db, ms);.   
dae0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20   break;.  }.  . 
daf0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
db00: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20   total_changes. 
db10: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
db20: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
db30: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
db40: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
db50: 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a   or deleted .  *
db60: 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61  * since the data
db70: 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20  base handle was 
db80: 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  created..  */.  
db90: 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48  case DB_TOTAL_CH
dba0: 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
dbb0: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
dbc0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
dbd0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
dbe0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
dbf0: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
dc00: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
dc10: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
dc20: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
dc30: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
dc40: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
dc50: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
dc60: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
dc70: 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
dc80: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
dc90: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
dca0: 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ce ?CALLBACK?.  
dcb0: 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
dcc0: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
dcd0: 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
dce0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63   routine for eac
dcf0: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
dd00: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65    ** that is exe
dd10: 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74  cuted.  The text
dd20: 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61   of the SQL is a
dd30: 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
dd40: 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  ACK before.  ** 
dd50: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
dd60: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
dd70: 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  RACE: {.    if( 
dd80: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
dd90: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
dda0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
ddb0: 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
ddc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ddd0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
dde0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
ddf0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
de00: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
de10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
de20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
de30: 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20  >zTrace, 0);.   
de40: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
de50: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61        char *zTra
de60: 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ce;.      int le
de70: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
de80: 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
de90: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
dea0: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20  ->zTrace);.     
deb0: 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20   }.      zTrace 
dec0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
ded0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
dee0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
def0: 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30   zTrace && len>0
df00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
df10: 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c  >zTrace = Tcl_Al
df20: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
df30: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 70          strcpy(p
df40: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61  Db->zTrace, zTra
df50: 63 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ce);.      }else
df60: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
df70: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
df80: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
df90: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
dfa0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
dfb0: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ce ){.        pD
dfc0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
dfd0: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
dfe0: 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
dff0: 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  b, DbTraceHandle
e000: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
e010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
e020: 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
e030: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
e040: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
e050: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
e060: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
e070: 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72  nsaction [-defer
e080: 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d  red|-immediate|-
e090: 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50  exclusive] SCRIP
e0a0: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72  T.  **.  ** Star
e0b0: 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
e0c0: 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e  ion (if we are n
e0d0: 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ot already in th
e0e0: 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a  e midst of a.  *
e0f0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61  * transaction) a
e100: 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54  nd execute the T
e110: 43 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54  CL script SCRIPT
e120: 2e 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a  .  After SCRIPT.
e130: 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20    ** completes, 
e140: 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68  either commit th
e150: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
e160: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66   roll it back if
e170: 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72   SCRIPT.  ** thr
e180: 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
e190: 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20  .  Or if no new 
e1a0: 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73  transation was s
e1b0: 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69  tarted, do nothi
e1c0: 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68  ng..  ** pass th
e1d0: 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75  e exception on u
e1e0: 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  p the stack..  *
e1f0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
e200: 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64  and was inspired
e210: 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27   by Dave Thomas'
e220: 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61  s talk on Ruby a
e230: 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20  t the.  ** 2005 
e240: 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f  O'Reilly Open So
e250: 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20  urce Convention 
e260: 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (OSCON)..  */.  
e270: 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54  case DB_TRANSACT
e280: 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  ION: {.    int i
e290: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f  nTrans;.    Tcl_
e2a0: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20  Obj *pScript;.  
e2b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
e2c0: 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a  egin = "BEGIN";.
e2d0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
e2e0: 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
e2f0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e300: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
e310: 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43  objv, "[TYPE] SC
e320: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
e330: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e340: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
e350: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70  jc==3 ){.      p
e360: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d  Script = objv[2]
e370: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
e380: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
e390: 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
e3a0: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
e3b0: 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
e3c0: 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
e3d0: 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
e3e0: 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
e3f0: 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
e400: 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
e410: 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
e420: 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
e430: 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
e440: 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
e450: 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
e460: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
e470: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
e480: 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
e490: 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
e4c0: 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
e4d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e4e0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
e4f0: 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
e500: 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
e510: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
e520: 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
e530: 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
e540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e550: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e560: 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
e570: 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
e580: 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
e590: 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
e5a0: 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
e5b0: 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
e5c0: 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
e5d0: 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
e5e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e5f0: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
e600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 54 72  ;.    }.    inTr
e610: 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33 5f 67  ans = !sqlite3_g
e620: 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44  et_autocommit(pD
e630: 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  b->db);.    if( 
e640: 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  !inTrans ){.    
e650: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
e660: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42  exec(pDb->db, zB
e670: 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
e680: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54      }.    rc = T
e690: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
e6a0: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
e6b0: 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61  ;.    if( !inTra
e6c0: 6e 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ns ){.      cons
e6d0: 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20  t char *zEnd;.  
e6e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
e6f0: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20  ERROR ){.       
e700: 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43   zEnd = "ROLLBAC
e710: 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  K";.      } else
e720: 20 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20   {.        zEnd 
e730: 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20  = "COMMIT";.    
e740: 20 20 7d 0a 20 20 20 20 20 20 28 76 6f 69 64 29    }.      (void)
e750: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
e760: 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30  ->db, zEnd, 0, 0
e770: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
e780: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
e790: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64  .  **    $db upd
e7a0: 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74  ate_hook ?script
e7b0: 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f  ?.  **    $db ro
e7c0: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72  llback_hook ?scr
e7d0: 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ipt?.  */.  case
e7e0: 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a   DB_UPDATE_HOOK:
e7f0: 20 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c   .  case DB_ROLL
e800: 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20  BACK_HOOK: {..  
e810: 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20    /* set ppHook 
e820: 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64  to point at pUpd
e830: 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c  ateHook or pRoll
e840: 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64  backHook, depend
e850: 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77  ing on .    ** w
e860: 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61  hether [$db upda
e870: 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62  te_hook] or [$db
e880: 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20   rollback_hook] 
e890: 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20  was invoked..   
e8a0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
e8b0: 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69  **ppHook; .    i
e8c0: 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50  f( choice==DB_UP
e8d0: 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20  DATE_HOOK ){.   
e8e0: 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62     ppHook = &pDb
e8f0: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20  ->pUpdateHook;. 
e900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e910: 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
e920: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20  RollbackHook;.  
e930: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
e940: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
e950: 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72  ){.       Tcl_Wr
e960: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e970: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
e980: 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20  RIPT?");.       
e990: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e9a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e9b0: 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20  *ppHook ){.     
e9c0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
e9d0: 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f  t(interp, *ppHoo
e9e0: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62  k);.      if( ob
e9f0: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc==3 ){.       
ea00: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
ea10: 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
ea20: 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b      *ppHook = 0;
ea30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ea40: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
ea50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ea60: 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20  !(*ppHook) );.  
ea70: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43      if( Tcl_GetC
ea80: 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32  harLength(objv[2
ea90: 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>0 ){.        
eaa0: 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32  *ppHook = objv[2
eab0: 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  ];.        Tcl_I
eac0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ncrRefCount(*ppH
ead0: 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ook);.      }.  
eae0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
eaf0: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62  _update_hook(pDb
eb00: 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64  ->db, (pDb->pUpd
eb10: 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65  ateHook?DbUpdate
eb20: 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
eb30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f  ;.    sqlite3_ro
eb40: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d  llback_hook(pDb-
eb50: 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  >db,(pDb->pRollb
eb60: 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61  ackHook?DbRollba
eb70: 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62  ckHandler:0),pDb
eb80: 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  );..    break;. 
eb90: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
eba0: 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a  version.  **.  *
ebb0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72  * Return the ver
ebc0: 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20  sion string for 
ebd0: 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20  this database.. 
ebe0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45   */.  case DB_VE
ebf0: 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c  RSION: {.    Tcl
ec00: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
ec10: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
ec20: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c  e3_libversion(),
ec30: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
ec40: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20    break;.  }... 
ec50: 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65   } /* End of the
ec60: 20 53 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e   SWITCH statemen
ec70: 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  t */.  return rc
ec80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c  ;.}../*.**   sql
ec90: 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45  ite3 DBNAME FILE
eca0: 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d 6b 65  NAME ?MODE? ?-ke
ecb0: 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54 68 69  y KEY?.**.** Thi
ecc0: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63  s is the main Tc
ecd0: 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e  l command.  When
ece0: 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54 63   the "sqlite" Tc
ecf0: 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20  l command is.** 
ed00: 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f  invoked, this ro
ed10: 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72  utine runs to pr
ed20: 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61  ocess that comma
ed30: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  nd..**.** The fi
ed40: 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42  rst argument, DB
ed50: 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69  NAME, is an arbi
ed60: 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61  trary name for a
ed70: 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65   new.** database
ed80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
ed90: 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74  is command creat
eda0: 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64  es a new command
edb0: 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45   named.** DBNAME
edc0: 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
edd0: 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f   control that co
ede0: 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64  nnection.  The d
edf0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
ee00: 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64  ction is deleted
ee10: 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45   when the DBNAME
ee20: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65   command is dele
ee30: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
ee40: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
ee50: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
ee60: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
ee70: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
ee80: 20 73 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   sqlite database
ee90: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 61   that is to be a
eea0: 63 63 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  ccessed..**.** F
eeb0: 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
eec0: 73 65 73 2c 20 77 65 20 61 6c 73 6f 20 73 75 70  ses, we also sup
eed0: 70 6f 72 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  port the followi
eee0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  ng:.**.**  sqlit
eef0: 65 33 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a 2a 0a  e3 -encoding.**.
ef00: 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20  **       Return 
ef10: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  the encoding use
ef20: 64 20 62 79 20 4c 49 4b 45 20 61 6e 64 20 47 4c  d by LIKE and GL
ef30: 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 43  OB operators.  C
ef40: 68 6f 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20  hoices.**       
ef50: 61 72 65 20 55 54 46 2d 38 20 61 6e 64 20 69 73  are UTF-8 and is
ef60: 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20 73 71  o8859..**.**  sq
ef70: 6c 69 74 65 33 20 2d 76 65 72 73 69 6f 6e 0a 2a  lite3 -version.*
ef80: 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72  *.**       Retur
ef90: 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  n the version nu
efa0: 6d 62 65 72 20 6f 66 20 74 68 65 20 53 51 4c 69  mber of the SQLi
efb0: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a  te library..**.*
efc0: 2a 20 20 73 71 6c 69 74 65 33 20 2d 74 63 6c 2d  *  sqlite3 -tcl-
efd0: 75 73 65 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20  uses-utf.**.**  
efe0: 20 20 20 20 20 52 65 74 75 72 6e 20 22 31 22 20       Return "1" 
eff0: 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  if compiled with
f000: 20 61 20 54 63 6c 20 75 73 65 73 20 55 54 46 2d   a Tcl uses UTF-
f010: 38 2e 20 20 52 65 74 75 72 6e 20 22 30 22 20 69  8.  Return "0" i
f020: 66 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20  f.**       not. 
f030: 20 55 73 65 64 20 62 79 20 74 65 73 74 73 20 74   Used by tests t
f040: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
f050: 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
f060: 69 6c 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 63  iled .**       c
f070: 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
f080: 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76  tic int DbMain(v
f090: 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  oid *cd, Tcl_Int
f0a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
f0b0: 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63   objc,Tcl_Obj *c
f0c0: 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71  onst*objv){.  Sq
f0d0: 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69  liteDb *p;.  voi
f0e0: 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69  d *pKey = 0;.  i
f0f0: 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63  nt nKey = 0;.  c
f100: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
f110: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
f120: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
f130: 7a 46 69 6c 65 3b 0a 20 20 69 66 28 20 6f 62 6a  zFile;.  if( obj
f140: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==2 ){.    zArg
f150: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f160: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
f170: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   0);.    if( str
f180: 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69  cmp(zArg,"-versi
f190: 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  on")==0 ){.     
f1a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f1b0: 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33  t(interp,sqlite3
f1c0: 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20  _version,0);.   
f1d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
f1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f1f0: 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61  strcmp(zArg,"-ha
f200: 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a  s-codec")==0 ){.
f210: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
f220: 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63  S_CODEC.      Tc
f230: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f240: 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65  nterp,"1",0);.#e
f250: 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  lse.      Tcl_Ap
f260: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f270: 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66  p,"0",0);.#endif
f280: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f290: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
f2a0: 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
f2b0: 22 2d 74 63 6c 2d 75 73 65 73 2d 75 74 66 22 29  "-tcl-uses-utf")
f2c0: 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 54 43  ==0 ){.#ifdef TC
f2d0: 4c 5f 55 54 46 5f 4d 41 58 0a 20 20 20 20 20 20  L_UTF_MAX.      
f2e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f2f0: 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a  (interp,"1",0);.
f300: 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f  #else.      Tcl_
f310: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f320: 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64  erp,"0",0);.#end
f330: 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
f340: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
f350: 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20  }.  if( objc==5 
f360: 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20  || objc==6 ){.  
f370: 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
f380: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f390: 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20 30 29 3b 0a  jv[objc-2], 0);.
f3a0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
f3b0: 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29  Arg,"-key")==0 )
f3c0: 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54  {.      pKey = T
f3d0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
f3e0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63  romObj(objv[objc
f3f0: 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20  -1], &nKey);.   
f400: 20 20 20 6f 62 6a 63 20 2d 3d 20 32 3b 0a 20 20     objc -= 2;.  
f410: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62    }.  }.  if( ob
f420: 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
f430: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
f440: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f450: 20 31 2c 20 6f 62 6a 76 2c 20 0a 23 69 66 64 65   1, objv, .#ifde
f460: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
f470: 45 43 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45  EC.      "HANDLE
f480: 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 6b 65 79 20   FILENAME ?-key 
f490: 43 4f 44 45 43 2d 4b 45 59 3f 22 0a 23 65 6c 73  CODEC-KEY?".#els
f4a0: 65 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20  e.      "HANDLE 
f4b0: 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 22  FILENAME ?MODE?"
f4c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20  .#endif.    );. 
f4d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f4e0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d  ROR;.  }.  zErrM
f4f0: 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53  sg = 0;.  p = (S
f500: 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c  qliteDb*)Tcl_All
f510: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
f520: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
f530: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
f540: 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f  t(interp, "mallo
f550: 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53  c failed", TCL_S
f560: 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
f570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f580: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
f590: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
f5a0: 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
f5b0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f5c0: 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 73 71 6c 69  v[2], 0);.  sqli
f5d0: 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  te3_open(zFile, 
f5e0: 26 70 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20 53  &p->db);.  if( S
f5f0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
f600: 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  3_errcode(p->db)
f610: 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20   ){.    zErrMsg 
f620: 3d 20 73 74 72 64 75 70 28 73 71 6c 69 74 65 33  = strdup(sqlite3
f630: 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
f640: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
f650: 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70  se(p->db);.    p
f660: 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69  ->db = 0;.  }.#i
f670: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
f680: 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f  CODEC.  sqlite3_
f690: 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c  key(p->db, pKey,
f6a0: 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20   nKey);.#endif. 
f6b0: 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
f6c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
f6d0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d  lt(interp, zErrM
f6e0: 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  sg, TCL_VOLATILE
f6f0: 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  );.    Tcl_Free(
f700: 28 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 66  (char*)p);.    f
f710: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
f720: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f730: 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78  OR;.  }.  p->max
f740: 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41  Stmt = NUM_PREPA
f750: 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 7a 41 72  RED_STMTS;.  zAr
f760: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
f770: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
f780: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
f790: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
f7a0: 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a  erp, zArg, DbObj
f7b0: 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44  Cmd, (char*)p, D
f7c0: 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 0a 20 20  bDeleteCmd);..  
f7d0: 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77  /* If compiled w
f7e0: 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 20  ith SQLITE_TEST 
f7f0: 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65 6e 20  turned on, then 
f800: 72 65 67 69 73 74 65 72 20 74 68 65 20 22 6d 64  register the "md
f810: 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c 20 66  5sum".  ** SQL f
f820: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  unction..  */.#i
f830: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
f840: 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  .  {.    extern 
f850: 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74 65  void Md5_Registe
f860: 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 69 66  r(sqlite3*);.#if
f870: 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  def SQLITE_MEMDE
f880: 42 55 47 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c  BUG.    int mall
f890: 6f 63 66 61 69 6c 20 3d 20 73 71 6c 69 74 65 33  ocfail = sqlite3
f8a0: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 0a 20 20  _iMallocFail;.  
f8b0: 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f    sqlite3_iMallo
f8c0: 63 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  cFail = 0;.#endi
f8d0: 66 0a 20 20 20 20 4d 64 35 5f 52 65 67 69 73 74  f.    Md5_Regist
f8e0: 65 72 28 70 2d 3e 64 62 29 3b 0a 23 69 66 64 65  er(p->db);.#ifde
f8f0: 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  f SQLITE_MEMDEBU
f900: 47 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d  G.    sqlite3_iM
f910: 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6d 61 6c 6c  allocFail = mall
f920: 6f 63 66 61 69 6c 3b 0a 23 65 6e 64 69 66 0a 20  ocfail;.#endif. 
f930: 20 7d 0a 23 65 6e 64 69 66 20 20 0a 20 20 70 2d   }.#endif  .  p-
f940: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
f950: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
f960: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  K;.}../*.** Prov
f970: 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f  ide a dummy Tcl_
f980: 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65 20  InitStubs if we 
f990: 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 61  are using this a
f9a0: 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69  s a static.** li
f9b0: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  brary..*/.#ifnde
f9c0: 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a  f USE_TCL_STUBS.
f9d0: 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69  # undef  Tcl_Ini
f9e0: 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20  tStubs.# define 
f9f0: 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c  Tcl_InitStubs(a,
fa00: 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
fa10: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
fa20: 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f 56  have a PACKAGE_V
fa30: 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66  ERSION macro def
fa40: 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ined.  This will
fa50: 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61   be.** defined a
fa60: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
fa70: 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c 65  the TEA makefile
fa80: 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61 6b  .  But other mak
fa90: 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74  efiles.** do not
faa0: 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23   define it..*/.#
fab0: 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f 56  ifndef PACKAGE_V
fac0: 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20  ERSION.# define 
fad0: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
fae0: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23  SQLITE_VERSION.#
faf0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  endif../*.** Ini
fb00: 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64  tialize this mod
fb10: 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ule..**.** This 
fb20: 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61  Tcl module conta
fb30: 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ins only a singl
fb40: 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  e new Tcl comman
fb50: 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22  d named "sqlite"
fb60: 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72  ..** (Hence ther
fb70: 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63  e is no namespac
fb80: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  e.  There is no 
fb90: 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61  point in using a
fba0: 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66   namespace.** if
fbb0: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f   the extension o
fbc0: 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65  nly supplies one
fbd0: 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65   new name!)  The
fbe0: 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
fbf0: 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  d is.** used to 
fc00: 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74  open a new SQLit
fc10: 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65  e database.  See
fc20: 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f   the DbMain() ro
fc30: 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66  utine above.** f
fc40: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
fc50: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45 58  formation..*/.EX
fc60: 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
fc70: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
fc80: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c   *interp){.  Tcl
fc90: 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72  _InitStubs(inter
fca0: 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20  p, "8.4", 0);.  
fcb0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
fcc0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71  mand(interp, "sq
fcd0: 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a  lite3", (Tcl_Obj
fce0: 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
fcf0: 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
fd00: 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
fd10: 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b   "sqlite3", PACK
fd20: 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  AGE_VERSION);.  
fd30: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
fd40: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71  mand(interp, "sq
fd50: 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43  lite", (Tcl_ObjC
fd60: 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20  mdProc*)DbMain, 
fd70: 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67  0, 0);.  Tcl_Pkg
fd80: 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20  Provide(interp, 
fd90: 22 73 71 6c 69 74 65 22 2c 20 50 41 43 4b 41 47  "sqlite", PACKAG
fda0: 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72 65  E_VERSION);.  re
fdb0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45  turn TCL_OK;.}.E
fdc0: 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
fdd0: 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
fde0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
fdf0: 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
fe00: 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58  it(interp); }.EX
fe10: 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
fe20: 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
fe30: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
fe40: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
fe50: 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
fe60: 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54  lite3_SafeInit(T
fe70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fe80: 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
fe90: 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K; }..#ifndef SQ
fea0: 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e  LITE_3_SUFFIX_ON
feb0: 4c 59 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71  LY.EXTERN int Sq
fec0: 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lite_Init(Tcl_In
fed0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
fee0: 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
fef0: 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58  it(interp); }.EX
ff00: 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
ff10: 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  te_Init(Tcl_Inte
ff20: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
ff30: 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  urn Sqlite3_Init
ff40: 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45  (interp); }.EXTE
ff50: 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53 61  RN int Sqlite_Sa
ff60: 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
ff70: 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
ff80: 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54  rn TCL_OK; }.EXT
ff90: 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74  ERN int Tclsqlit
ffa0: 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
ffb0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
ffc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
ffd0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
ffe0: 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  TCLSH./*********
fff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10030 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ****.** The code
10040 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73   that follows is
10050 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 73   used to build s
10060 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e  tandalone TCL in
10070 74 65 72 70 72 65 74 65 72 73 0a 2a 2f 0a 0a 2f  terpreters.*/../
10080 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
10090 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20  o TCLSH is one, 
100a0 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65  then put in code
100b0 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a   this for the.**
100c0 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20   "main" routine 
100d0 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61  that will initia
100e0 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b  lize Tcl and tak
100f0 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20  e input from.** 
10100 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a  standard input..
10110 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a  */.#if TCLSH==1.
10120 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69  static char zMai
10130 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74  nloop[] =.  "set
10140 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77   line {}\n".  "w
10150 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69  hile {![eof stdi
10160 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66  n]} {\n".    "if
10170 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b   {$line!=\"\"} {
10180 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20  \n".      "puts 
10190 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c  -nonewline \"> \
101a0 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65  "\n".    "} else
101b0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74   {\n".      "put
101c0 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25  s -nonewline \"%
101d0 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22   \"\n".    "}\n"
101e0 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f  .    "flush stdo
101f0 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e  ut\n".    "appen
10200 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64  d line [gets std
10210 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b  in]\n".    "if {
10220 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24  [info complete $
10230 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  line]} {\n".    
10240 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75    "if {[catch {u
10250 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d  plevel #0 $line}
10260 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20   result]} {\n". 
10270 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64         "puts std
10280 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65  err \"Error: $re
10290 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20  sult\"\n".      
102a0 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75  "} elseif {$resu
102b0 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  lt!=\"\"} {\n". 
102c0 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65         "puts $re
102d0 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d  sult\n".      "}
102e0 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c  \n".      "set l
102f0 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d  ine {}\n".    "}
10300 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
10310 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c   "append line \\
10320 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  n\n".    "}\n". 
10330 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a   "}\n".;.#endif.
10340 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
10350 63 72 6f 20 54 43 4c 53 48 20 69 73 20 74 77 6f  cro TCLSH is two
10360 2c 20 74 68 65 6e 20 67 65 74 20 74 68 65 20 6d  , then get the m
10370 61 69 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75  ain loop code ou
10380 74 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70 61  t of.** the sepa
10390 72 61 74 65 20 66 69 6c 65 20 22 73 70 61 63 65  rate file "space
103a0 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a  anal_tcl.h"..*/.
103b0 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61  #if TCLSH==2.sta
103c0 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  tic char zMainlo
103d0 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65  op[] = .#include
103e0 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e   "spaceanal_tcl.
103f0 68 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65  h".;.#endif..#de
10400 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20  fine TCLSH_MAIN 
10410 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64  main   /* Needed
10420 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74   to fake out mkt
10430 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c  clapp */.int TCL
10440 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63  SH_MAIN(int argc
10450 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
10460 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10470 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64  terp;.  Tcl_Find
10480 45 78 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b  Executable(argv[
10490 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  0]);.  interp = 
104a0 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70  Tcl_CreateInterp
104b0 28 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e  ();.  Sqlite3_In
104c0 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64  it(interp);.#ifd
104d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
104e0 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e   {.    extern in
104f0 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e  t Sqlitetest1_In
10500 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
10510 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
10520 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74  Sqlitetest2_Init
10530 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
10540 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
10550 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54  litetest3_Init(T
10560 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
10570 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
10580 74 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c  tetest4_Init(Tcl
10590 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
105a0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
105b0 74 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49  test5_Init(Tcl_I
105c0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
105d0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
105e0 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st6_Init(Tcl_Int
105f0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
10600 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
10610 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  7_Init(Tcl_Inter
10620 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
10630 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f  int Sqlitetest8_
10640 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
10650 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
10660 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49  t Md5_Init(Tcl_I
10670 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
10680 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
10690 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49  stsse_Init(Tcl_I
106a0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
106b0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
106c0 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c  stasync_Init(Tcl
106d0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
106e0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
106f0 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
10700 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
10710 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
10720 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
10730 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
10740 0a 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ..    Sqlitetest
10750 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
10760 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
10770 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10780 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
10790 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
107a0 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
107b0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
107c0 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
107d0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
107e0 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
107f0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
10800 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72  test7_Init(inter
10810 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
10820 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st8_Init(interp)
10830 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
10840 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72  async_Init(inter
10850 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
10860 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e  sttclvar_Init(in
10870 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
10880 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74  etestschema_Init
10890 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d 64  (interp);.    Md
108a0 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
108b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53  #ifdef SQLITE_SS
108c0 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  E.    Sqlitetest
108d0 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  sse_Init(interp)
108e0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  ;.#endif.  }.#en
108f0 64 69 66 0a 20 20 69 66 28 20 61 72 67 63 3e 3d  dif.  if( argc>=
10900 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b  2 || TCLSH==2 ){
10910 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10920 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
10930 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31  p,"argv0",argv[1
10940 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  ],TCL_GLOBAL_ONL
10950 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56  Y);.    Tcl_SetV
10960 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22  ar(interp,"argv"
10970 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  , "", TCL_GLOBAL
10980 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28  _ONLY);.    for(
10990 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67  i=3-TCLSH; i<arg
109a0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  c; i++){.      T
109b0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
109c0 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69  , "argv", argv[i
109d0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c  ],.          TCL
109e0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54  _GLOBAL_ONLY | T
109f0 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20  CL_LIST_ELEMENT 
10a00 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c  | TCL_APPEND_VAL
10a10 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  UE);.    }.    i
10a20 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54  f( TCLSH==1 && T
10a30 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65  cl_EvalFile(inte
10a40 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43  rp, argv[1])!=TC
10a50 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f  L_OK ){.      co
10a60 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20  nst char *zInfo 
10a70 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74  = Tcl_GetVar(int
10a80 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22  erp, "errorInfo"
10a90 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
10aa0 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49  Y);.      if( zI
10ab0 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d  nfo==0 ) zInfo =
10ac0 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 3b   interp->result;
10ad0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
10ae0 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22  tderr,"%s: %s\n"
10af0 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b  , *argv, zInfo);
10b00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
10b10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10b20 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c 53   argc<=1 || TCLS
10b30 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  H==2 ){.    Tcl_
10b40 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72  GlobalEval(inter
10b50 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20  p, zMainloop);. 
10b60 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
10b70 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48  .#endif /* TCLSH
10b80 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21   */..#endif /* !
10b90 64 65 66 69 6e 65 64 28 4e 4f 5f 54 43 4c 29 20  defined(NO_TCL) 
10ba0 2a 2f 0a                                         */.